Name des Videos still "Video.mp4" nach dem Herunterladen mit YT-DLPJavaScript

Javascript-Forum
Anonymous
 Name des Videos still "Video.mp4" nach dem Herunterladen mit YT-DLP

Post by Anonymous »

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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post