使用 Express API 和 ytdl 下载音频文件

Posted

技术标签:

【中文标题】使用 Express API 和 ytdl 下载音频文件【英文标题】:Downloading an audio file with Express API and ytdl 【发布时间】:2017-04-26 19:31:42 【问题描述】:

我正在尝试使用 ytdl-core 模块 (https://github.com/fent/node-ytdl-core) 下载 Youtube 视频音频。

我使用 Express 编写了一个 API,让我可以通过 URL 下载音频:

app.get('/api/downloadYoutubeVideo', function (req, res) 
   res.set('Content-Type', 'audio/mpeg');       

   var videoUrl = req.query.videoUrl;   
   var videoName;

   ytdl.getInfo(videoUrl, function(err, info)
        videoName = info.title.replace('|','').toString('ascii');
        res.set('Content-Disposition', 'attachment; filename=' +    videoName + '.mp3');    
   );  

   var videoWritableStream = fs.createWriteStream('C:\\test' + '\\' +   videoName); // some path on my computer (exists!)
   var videoReadableStream = ytdl(videoUrl,  filter: 'audioonly');

   var stream = videoReadableStream.pipe(videoWritableStream);

);

问题是,当我调用此 API 时,我的服务器收到 504 错误。

我希望能够将此下载的音频保存在我的本地磁盘上。

我们将不胜感激。谢谢

【问题讨论】:

【参考方案1】:

好吧,由于某种原因,videoName 未定义,所以它弄乱了我的功能...... 这是经过一些更改并将目标路径添加为查询变量后的正确代码。

app.get('/api/downloadYoutubeVideo', function (req, res)   
   var videoUrl = req.query.videoUrl;   
   var destDir = req.query.destDir; 

   var videoReadableStream = ytdl(videoUrl,  filter: 'audioonly');

   ytdl.getInfo(videoUrl, function(err, info)
       var videoName = info.title.replace('|','').toString('ascii');

       var videoWritableStream = fs.createWriteStream(destDir + '\\' + videoName + '.mp3'); 

       var stream = videoReadableStream.pipe(videoWritableStream);

       stream.on('finish', function() 
           res.writeHead(204);
           res.end();
       );              
   );              
);

【讨论】:

以上是关于使用 Express API 和 ytdl 下载音频文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 React 和 Axios 从 Express API 下载文件

Express框架

我在 ytdl-core 包上收到 404 错误

Discord bot 无法使用 ytdl-core 播放歌曲

我正在将 ytdl-core 用于音乐机器人,它一直输出未定义播放

ytdl-core - 将视频标题存储在变量中