我正在尝试使用ytdl-core模块将youtube音频下载到我的本地磁盘(我的计算机上的某个路径)。
我创建了一个API,我可以使用请求的youtube网址和我想要保存文件的目标文件夹来调用它。
app.get('/api/downloadYoutubeVideo', function (req, res) {
var videoUrl = req.query.videoUrl;
var destDir = req.query.destDir;
ytdl.getInfo(videoUrl, function(err, info){
var videoName = info.title.replace('|','').toString('ascii');
var stream = ytdl(videoUrl, { filter: 'audioonly'})
.pipe(fs.createWriteStream(destDir + '\\' + videoName + '.mp3'));
stream.on('finish', function() {
res.writeHead(204);
res.end();
});
});
});
问题是当我在我的localhost上调用api时(例如:localhost:11245 / api / downloadYoutubeVideo?videoUrl = https://www.youtube.com/watch?v=E5kJDWQSBUk&destDir=C:\ test) 它工作正常,文件确实下载到“C:\ test”。
但是当我在遥控器上调用api时(例如:http://sometest.cloudno.de/api/downloadYoutubeVideo?videoUrl=https://www.youtube.com/watch?v=02BAlrAkuCE&destDir=C:\ test)
它不会在目录中创建文件......
我搜索了答案,但没有找到答案......
答案 0 :(得分:0)
您的遥控器上是否已存在C:\test
?如果不是,则在创建目录之前不能使用fs.createWriteStream()
,它不会隐式为您创建目录。由于您没有收听'error'
事件,因此您甚至不知道这是问题,因为您没有捕获它。
下面的代码示例将检查是否存在destDir
,如果它不存在,则会在继续之前创建它。
const fs = require('fs');
const sep = require('path').sep;
function checkAndMakeDir(dir, cb) {
fs.access(dir, (err) => {
if (err)
fs.mkdir(dir, (err) => {
if (err)
return cb(err);
return cb();
});
else
return cb();
});
}
app.get('/api/downloadYoutubeVideo', function (req, res) {
let videoUrl = req.query.videoUrl;
let destDir = req.query.destDir;
checkAndMakeDir(destDir, (err) => {
if (err) {
res.writeHead(500);
return res.end();
}
ytdl.getInfo(videoUrl, function (err, info) {
let videoName = info.title.replace('|', '').toString('ascii');
let saveStream = fs.createWriteStream(`${destDir}${sep}${videoName}.mp3`);
saveStream.once('error', (err) => {
console.log(err);
res.writeHead(500);
return res.end();
});
saveStream.once('finish', () => {
res.writeHead(204);
return res.end();
});
ytdl(videoUrl, {filter: 'audioonly'})
.once('error', (err) => {
console.log('Read Stream Error', err);
res.writeHead(500);
return res.end();
})
.pipe(saveStream);
});
});
});