yt-dlx
Version:
Effortless Audio-Video Downloader And Streamer!
189 lines • 8.02 kB
JavaScript
;
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(),
resolution: zod_1.z.enum(["high", "medium", "low", "ultralow"]),
filter: zod_1.z
.enum([
"echo",
"slow",
"speed",
"phaser",
"flanger",
"panning",
"reverse",
"vibrato",
"subboost",
"surround",
"bassboost",
"nightcore",
"superslow",
"vaporwave",
"superspeed",
])
.optional(),
});
/**
* Downloads and processes a single YouTube video with audio customization options.
*
* @param resolution - The desired audio resolution.
* @param query - The YouTube video URL or ID or name.
* @param filter - (optional) The audio filter to apply.
* @param verbose - (optional) Whether to log verbose output or not.
* @param output - (optional) The output directory for the processed file.
* @param useTor - (optional) Whether to use Tor for the download or not.
* @param stream - (optional) Whether to stream the processed video or not.
* @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 AudioCustom({ query, output, useTor, stream, filter, verbose, metadata, resolution, }) {
var emitter = new events_1.EventEmitter();
(async () => {
try {
ZodSchema.parse({
query,
output,
useTor,
stream,
filter,
verbose,
metadata,
resolution,
});
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 resolutionFilter = resolution.replace("p", "");
var adata = engineData.AudioHigh.find(i => i.format.includes(resolutionFilter));
if (!adata) {
throw new Error(`${colors_1.default.red("@error:")} no audio data found. use list_formats() maybe?`);
}
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(adata.url)
.addInput(engineData.metaData.thumbnail)
.withOutputFormat("avi");
var filenameBase = `yt-dlx_(AudioCustom_${resolution}_`;
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 = AudioCustom;
//# sourceMappingURL=AudioCustom.js.map