2016-12-15 75 views
0

我试图用ytdl-core模块将youtube音频下载到我的本地磁盘(我的电脑上的某些路径)。pipe在localhost上工作,但不在远程nodejs上

我创建了一个API,可以使用请求的YouTube网址和目标文件夹在其中调用我希望文件保存的API。

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(); 
     });    
    });   
}); 

的问题是,当我调用API在我的本地(例如:本地主机:11245/API/downloadYoutubeVideo videoUrl = https://www.youtube.com/watch?v=E5kJDWQSBUk&destDir=C:\测试) 它的工作原理和文件确实下载到“C:\测试”。

但是,当我打电话给我的远程的API(例如:http://sometest.cloudno.de/api/downloadYoutubeVideo?videoUrl=https://www.youtube.com/watch?v=02BAlrAkuCE&destDir=C:\测试)

它不创造在目录中的文件...

我寻觅答案,但避风港没有找到一个...

回答

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); 
    }); 
    }); 
}); 
+0

优秀!有用!谢谢 –

相关问题