Ich verwende YT-DLP in einer Node.js Express-Anwendung, um Videos von YouTube herunterzuladen. Ich extrahiere den Videotitel und benutze ihn, um die heruntergeladene Datei zu benennen, aber alle heruntergeladenen Dateien werden weiterhin mit Video.MP4 anstelle des extrahierten Titels bezeichnet. < /P>
Hier ist der relevante Code von meinem Express Route: < /p>
app.get('/download', async (req, res) => {
const videoURL = req.query.url;
const format = req.query.format || 'mp4';
if (!videoURL) {
return res.status(400).send({ error: 'No URL provided' });
}
const cookiesFile = path.resolve(__dirname, 'cookies.txt');
// Validate cookies file exists
if (!fs.existsSync(cookiesFile)) {
console.error('Missing cookies.txt');
return res.status(500).send({ error: 'Authentication failed' });
}
// Set timeout to handle long downloads
req.setTimeout(600000); // 10 minutes
// Get video metadata to extract the title
exec(`yt-dlp --cookies "${cookiesFile}" --get-title ${videoURL}`, (error, stdout, stderr) => {
if (error) {
console.error('Failed to get video title:', stderr);
return res.status(500).send({ error: 'Failed to get video title' });
}
const videoTitle = stdout.trim().replace(/[:"/\\|?*]+/g, ''); // Sanitize title
const outputFile = path.resolve(os.tmpdir(), `${videoTitle}.${format}`);
// Configure yt-dlp command
const command = format === 'mp3'
? `yt-dlp --cookies "${cookiesFile}" --extract-audio --audio-format mp3 -o "${outputFile}" ${videoURL}`
: `yt-dlp --cookies "${cookiesFile}" -o "${outputFile}" --merge-output-format mp4 ${videoURL}`;
exec(command, async (error, stdout, stderr) => {
try {
if (error) {
throw new Error(`yt-dlp error: ${stderr}`);
}
// Verify output file exists
if (!fs.existsSync(outputFile)) {
throw new Error('Output file not created');
}
// Validate file size
const stats = fs.statSync(outputFile);
const maxSize = 1024 * 1024 * 500; // 500MB
if (stats.size > maxSize) {
fs.unlinkSync(outputFile);
return res.status(413).send({ error: 'File exceeds maximum size limit' });
}
// Set proper content headers
res.setHeader('Content-Type', format === 'mp3' ? 'audio/mpeg' : 'video/mp4');
res.setHeader('Content-Length', stats.size);
res.setHeader('Content-Disposition', `attachment; filename="${path.basename(outputFile)}"`);
// Stream the file
const fileStream = fs.createReadStream(outputFile);
fileStream.pipe(res);
// Cleanup after stream finishes
fileStream.on('end', () => {
fs.unlink(outputFile, (err) => {
if (err) console.error('Cleanup error:', err);
});
});
} catch (err) {
console.error('Download failed:', err);
// Cleanup failed download
if (fs.existsSync(outputFile)) {
fs.unlinkSync(outputFile);
}
res.status(500).send({
error: 'Download failed',
details: err.message
});
}
});
});
});
< /code>
Das Problem ist, dass die heruntergeladene Datei trotz des Extrahierens des Videotitels und der Verwendung im OutputFile -Pfad konsequent Video.MP4 genannt wird. Ich habe verifiziert, dass die Variable des Videobitels den richtigen Titel nach der Desinfektion enthält und der Ausgangsfilmpfad korrekt konstruiert zu sein scheint. < /P>
Was ich ausprobiert habe: Ich habe die Ausgabe des Befehls yt-DLP --get-title überprüft und bestätigt, dass er den erwarteten Titel zurückgibt. Sein Erzeugt mit dem richtigen Titel. und die Datei heißt immer noch Video.mp4.
Name des Videos still "Video.mp4" nach dem Herunterladen mit YT-DLP ⇐ JavaScript
-
- Similar Topics
- Replies
- Views
- Last post