I am downloading a video using ytdl-core and converting it to mp3 using node-fluent-ffmpeg. It seems that the code after the ffmpeg conversion gets executed before the conversion finishes as trying to upload the .mp3 file to a Google Cloud Storage bucket throws an error. I am trying to detect 'end' or 'finish' events but none are being triggered.
Code:
ytdl(url?.toString() as string)
.once('data', (data) => {
console.log('start', data);
})
.on('progress', async function (progress, downloaded, total) {
console.log(parseInt(((downloaded / total) * 100).toString()) + '%');
})
.on('finish', async function () {
console.log('Download finished...');
console.log('using ffmpeg to convert into mp3');
Ffmpeg({ source: `/Users/user/project/server/output/${videoId}.mp4` })
.setFfmpegPath(ffmpeg.path)
.toFormat('mp3')
.saveToFile(`/Users/user/project/server/output/${videoId}.mp3`)
.on('finish', () => {
console.log('finished conversion');
});
console.log('after ffmpeg mp3 conversion');
const storage = new Storage({
keyFilename: `./key.json`,
});
const bucketName = 'bucketname';
const bucket = storage.bucket(bucketName);
let mp3_url;
console.log(
fs.existsSync(`/Users/user/project/server/output/${videoId}.mp3`)
); // returns false
bucket.upload(
`/Users/user/project/server/output/${videoId}.mp3`,
// Error uploading: Error: ENOENT: no such file or directory, open '/Users/me/project/server/output/RMvenf7E-Dg.mp3'
{
destination: `${userId}/${videoId}.mp3`,
},
function (err, file) {
if (err) {
console.error(`Error uploading: ${err}`);
} else {
console.log(`mp3 uploaded to ${bucketName}.`);
console.log(file?.publicUrl());
}
}
);
.pipe(
fs.createWriteStream(`/Users/me/project/server/output/${videoId}.mp4`)
);
console.log('after download and conversion');
req.on('close', async () => {
res.end();
});
Error uploading: Error: ENOENT: no such file or directory, open '/Users/polo/makeklips/server/output/RMvenf7E-Dg.mp3'
[1] /Users/me/project/server/node_modules/.pnpm/[email protected]/node_modules/fluent-ffmpeg/lib/processor.js:182
[1] handleExit(new Error('ffmpeg exited with code ' + code));
[1] ^
[1] Error: ffmpeg exited with code 1: Output #0, mp3, to '/Users/me/project/server/output/RMvenf7E-Dg.mp3':
[1] Output file #0 does not contain any stream
There are multiple paths for your file (double check what the
${userId}is)./Users/me/[...], but after you are/User/user/[...]and/Users/polo/makeklips/server/