UNPKG

yt-dlx

Version:

Effortless Audio-Video Downloader And Streamer!

182 lines 7.63 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs = __importStar(require("fs")); const colors_1 = __importDefault(require("colors")); const path = __importStar(require("path")); const zod_1 = require("zod"); const fluent_ffmpeg_1 = __importDefault(require("fluent-ffmpeg")); const Agent_1 = __importDefault(require("../../base/Agent")); const events_1 = require("events"); const locator_1 = require("../../base/locator"); var ZodSchema = zod_1.z.object({ query: zod_1.z.string().min(2), output: zod_1.z.string().optional(), useTor: zod_1.z.boolean().optional(), stream: zod_1.z.boolean().optional(), verbose: zod_1.z.boolean().optional(), metadata: zod_1.z.boolean().optional(), filter: zod_1.z .enum([ "echo", "slow", "speed", "phaser", "flanger", "panning", "reverse", "vibrato", "subboost", "surround", "bassboost", "nightcore", "superslow", "vaporwave", "superspeed", ]) .optional(), }); /** * Downloads and processes the highest quality audio from a single YouTube video. * * @param query - The YouTube video URL or ID or name. * @param output - (optional) The output directory for the processed file. * @param stream - (optional) Whether to stream the processed video or not. * @param verbose - (optional) Whether to log verbose output or not. * @param useTor - (optional) Whether to use Tor for the download or not. * @param filter - (optional) The audio filter to apply. * @param metadata - (optional) If true, the function returns the extracted metadata and filename without processing the audio. * * @returns An EventEmitter instance to handle events. */ function AudioHighest({ query, output, useTor, stream, filter, metadata, verbose, }) { var emitter = new events_1.EventEmitter(); (async () => { try { ZodSchema.parse({ query, output, useTor, stream, filter, metadata, verbose, }); var engineData = await (0, Agent_1.default)({ query, verbose, useTor, }); if (!engineData) { throw new Error(`${colors_1.default.red("@error:")} unable to get response!`); } var title = engineData.metaData.title.replace(/[^a-zA-Z0-9_]+/g, "_"); var folder = output ? output : __dirname; if (!fs.existsSync(folder)) fs.mkdirSync(folder, { recursive: true }); var ff = (0, fluent_ffmpeg_1.default)() .setFfmpegPath((await (0, locator_1.locator)().then(fp => fp.ffmpeg)).toString()) .setFfprobePath((await (0, locator_1.locator)().then(fp => fp.ffprobe)).toString()) .addInput(engineData.AudioHighF.url) .addInput(engineData.metaData.thumbnail) .withOutputFormat("avi") .addOption("-headers", `X-Forwarded-For: ${engineData.ipAddress}`); var filenameBase = `yt-dlx_(AudioHighest_`; let filename = `${filenameBase}${filter ? filter + ")_" : ")_"}${title}.avi`; var filterMap = { bassboost: ["bass=g=10,dynaudnorm=f=150"], echo: ["aecho=0.8:0.9:1000:0.3"], flanger: ["flanger"], nightcore: ["aresample=48000,asetrate=48000*1.25"], panning: ["apulsator=hz=0.08"], phaser: ["aphaser=in_gain=0.4"], reverse: ["areverse"], slow: ["atempo=0.8"], speed: ["atempo=2"], subboost: ["asubboost"], superslow: ["atempo=0.5"], superspeed: ["atempo=3"], surround: ["surround"], vaporwave: ["aresample=48000,asetrate=48000*0.8"], vibrato: ["vibrato=f=6.5"], }; if (filter && filterMap[filter]) ff.withAudioFilter(filterMap[filter]); ff.addOption("-headers", `X-Forwarded-For: ${engineData.ipAddress}`); ff.on("start", comd => { if (verbose) emitter.emit("log", colors_1.default.green("@comd:"), comd); emitter.emit("start", comd); }) .on("progress", progress => emitter.emit("progress", progress)) .on("error", error => emitter.emit("error", error.message)) .on("end", () => emitter.emit("end", filename)); switch (true) { case stream: emitter.emit("ready", { ffmpeg: ff, filename: path.join(folder, filename), }); break; case metadata: emitter.emit("metadata", { filename, metaData: engineData.metaData, ipAddress: engineData.ipAddress, AudioLowF: engineData.AudioLowF, AudioHighF: engineData.AudioHighF, AudioLowDRC: engineData.AudioLowDRC, AudioHighDRC: engineData.AudioHighDRC, }); break; default: ff.output(path.join(folder, filename)) .on("end", () => emitter.emit("end", filename)) .on("error", error => emitter.emit("error", error.message)) .run(); break; } } catch (error) { switch (true) { case error instanceof zod_1.ZodError: emitter.emit("error", colors_1.default.red("@zod-error:"), error.errors); break; default: emitter.emit("error", colors_1.default.red("@error:"), error.message); break; } } finally { emitter.emit("info", colors_1.default.green("@info:"), "❣️ Thank you for using yt-dlx. Consider 🌟starring the GitHub repo https://github.com/yt-dlx."); } })(); return emitter; } exports.default = AudioHighest; //# sourceMappingURL=AudioHighest.js.map