2016-12-15 5 views
0

Я пытаюсь использовать модуль ytdl-core, чтобы загрузить аудио на вашем локальном диске (какой-то путь на моем компьютере).труба работает на localhost, но не на удаленных nodejs

Я создал API, к которому я могу позвонить с запрошенным URL-адресом 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(); 
     });    
    });   
}); 

Проблема заключается в том, что, когда я называю апи на моем локальном хосте (например: локальный: 11245/API/downloadYoutubeVideo videoUrl = https://www.youtube.com/watch?v=E5kJDWQSBUk&destDir=C: \ тест) это работает, и файл действительно загрузки в «C: \ контрольная работа".

Но когда я звоню к апи на моем пульте дистанционного управления (например: http://sometest.cloudno.de/api/downloadYoutubeVideo?videoUrl=https://www.youtube.com/watch?v=02BAlrAkuCE&destDir=C: \ тест)

оно не создать файл в каталоге ...

Я искал ответ, но убежище 't найдено один ...

ответ

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

отличная! оно работает! Спасибо –