2016-12-15 82 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

優秀!有用!謝謝 –

相關問題