UNPKG

yt-dlp-video

Version:

A robust video downloader built on yt-dlp for downloading and processing video content from various sources.

79 lines (65 loc) 2.35 kB
const setup = require('./setup'); const { exec } = require('child_process'); const path = require('path'); const os = require('os'); const fs = require('fs'); function getYtDlpPath() { const binaryName = os.platform() === 'win32' ? 'yt-dlp.exe' : 'yt-dlp'; return path.join(__dirname, 'bin', binaryName); } async function downloadVideo(url, options = {}) { // Ensure yt-dlp is installed await setup(); const { outputDir = process.cwd(), format = 'mp4', quality = 'best', filename = '%(title)s' } = options; // Create output directory if it doesn't exist if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } const ytDlpPath = getYtDlpPath(); // Use path.normalize to handle paths correctly on all OS const outputTemplate = path.normalize(path.join(outputDir, `${filename}.%(ext)s`)); // Quote paths properly for different OS const quotedPath = os.platform() === 'win32' ? `"${ytDlpPath}"` : `'${ytDlpPath}'`; const quotedOutput = os.platform() === 'win32' ? `"${outputTemplate}"` : `'${outputTemplate}'`; const formatOption = format === 'mp4' ? '-f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4"' : ''; const command = `${quotedPath} ${url} -o ${quotedOutput} ${formatOption} --progress`; return new Promise((resolve, reject) => { const process = exec(command); let progress = ''; process.stdout.on('data', (data) => { progress = data.toString(); // Extract download progress const match = progress.match(/(\d+\.?\d*)%/); if (match) { console.log(`Download progress: ${match[1]}%`); } }); process.stderr.on('data', (data) => { console.error(`Error: ${data}`); }); process.on('close', (code) => { if (code === 0) { resolve({ success: true, message: 'Download completed successfully' }); } else { reject(new Error(`Download failed with code ${code}`)); } }); }); } module.exports = { downloadVideo }; // Example usage: /* downloadVideo('https://www.youtube.com/watch?v=VIDEO_ID', { outputDir: './downloads', format: 'mp4', quality: 'best', filename: 'custom-name' }) .then(result => console.log(result)) .catch(error => console.error(error)); */