Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 31 additions & 30 deletions src/lib/yt-dlp.js
Original file line number Diff line number Diff line change
Expand Up @@ -128,40 +128,41 @@ export async function ytdown(url, type = "video") {
}

/**
* Download YouTube audio/video via API
* Download YouTube audio/video via local yt-dlp
* @param {String} url
* @param {Object} opts
* @param {Boolean} opts.video
* @param {String} opts.videoQuality
* @param {String} opts.audioFormat
* @param {String} opts.title
* @returns {Promise<{ buffer: Buffer, mimetype: string, fileName: string }>}
*/
export async function downloadApiYt(url, opts = {}) {
const { video = false, title = "youtube" } = opts;

const result = await ytdown(url, video ? "video" : "audio");

if (!result?.download) {
throw new Error("Download link not found");
}

const { data } = await axios.get(result.download, {
responseType: "arraybuffer",
});

let buffer = Buffer.from(data);

if (!video) {
buffer = await to_audio(buffer, "mp3");
}

const safeTitle = (title || result.info.title || "yt")
.replace(/[\\/:*?"<>|]/g, "")
.slice(0, 60);

return {
buffer,
mimetype: video ? "video/mp4" : "audio/mpeg",
fileName: `${safeTitle}.${video ? "mp4" : "mp3"}`,
};
const { video = false, title = "youtube" } = opts;

try {
// Use local yt-dlp instead of external API service
const result = await downloadYt(url, {
video,
title: title || "youtube",
});

let buffer = result.buffer;

// Convert to MP3 if audio was requested
if (!video) {
buffer = await to_audio(buffer, "mp3");
}

const safeTitle = (title || "yt")
.replace(/[\\/:*?"<>|]/g, "")
.slice(0, 60);

return {
buffer,
mimetype: video ? "video/mp4" : "audio/mpeg",
fileName: `${safeTitle}.${video ? "mp4" : "mp3"}`,
};
} catch (error) {
console.error("[downloadApiYt] Error:", error.message);
throw error;
}
}