npm i fluent-ffmpeg yt-dlp-wrap
import ffmpeg from "fluent-ffmpeg"
import fs from "node:fs"
import YTDlpWrap from "yt-dlp-wrap"
const ffmpegPath = require("@ffmpeg-installer/ffmpeg").path
ffmpeg.setFfmpegPath(ffmpegPath) // to extract audio
export async function downloadVideoViaYtDlp(params: {
url: string
dirpath: string
ytDlpPath: string
download?: boolean
login?: { username: string; password: string }
cookieFilePath?: string
}): Promise<string> {
const { url, dirpath, ytDlpPath, download = false } = params
fs.mkdirSync(dirpath, { recursive: true })
if (!fs.existsSync(ytDlpPath)) {
if (!download) throw Error("yt-dlp not found and download is disabled")
await YTDlpWrap.downloadFromGithub(ytDlpPath)
}
const cookieArg = []
if (params.cookieFilePath) cookieArg.push("--cookies", params.cookieFilePath)
else if (params.login)
cookieArg.push("-u", params.login.username, "-p", params.login.password)
const ytDlp = new YTDlpWrap(ytDlpPath)
const info = await ytDlp.getVideoInfo([url, ...cookieArg])
const filename = `${dirpath}/${info.filename}`
if (fs.existsSync(filename)) {
console.log(`Video already downloaded: "${filename}"`)
return filename
}
await ytDlp.execPromise([
url,
"-f",
"bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best",
"--output",
filename,
...cookieArg,
])
return filename
}