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
JavaScript
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));
*/