2017-05-30 10 views
0

私は約束が新しく、node-ytdl-coreを使用している間に2つの問題を抱えています。node-ytdl-core約束オーディオタイトルとファイルのダウンロード

exports.downloadMP3 = function(bot, msg, sSuffix) { 
    return Promise 
    .all([ 
     ytdl(sSuffix, {filter : 'audioonly',}).pipe(fs.createWriteStream('audio.mp3')), 
     promiseTitle(sSuffix) 
    ]) 
    .then(function(results) {msg.channel.sendFile('audio.mp3', results[1], '', '')}) 
    .catch(error => console.error(error)); 
} 

function promiseTitle(sSuffix) { 
    return new Promise(function (resolve, reject) { 
     ytdl.getInfo(sSuffix, function(err, info) { 
      if (err) reject(err); 
      console.log(info.title); 
      return resolve(info.title); 
     }); 
    }); 
} 

私は上記のコードを使用すると、コンソールが正しいタイトルを記録しますが、返されるタイトルは、a25998454d48491.Vの線に沿って列です。その約束が私の希望する価値を返さないということを意味する。

さらに、createWriteStreamはファイルが送信される前に解決されません(sendFile)。ファイルがダウンロードされ、ファイルシステムに正しいサイズ/コンテンツを持っていても、私は0バイトのファイルを取得します。

私の約束どおりに正しい値を返して、どのようにしてcreateWriteStreamを約束するのですか?

ありがとうございます。

答えて

0

タイトルは問題ありませんでしたが、sendFile()はファイル名に '/'を使用できません。私がテストしていたビデオにはその性格がありました。ストリームのイベントを使用して、配列のすべてのデータを配列に追加することによって、ytdlストリームをバッファに変換することができました。別のイベント(最後のイベント)を使用して最終的にバッファを送信することができます。

exports.downloadMP3 = function(bot, msg, sSuffix) { 
    return Promise 
    .all([ 
     promiseTitle(sSuffix) 
    ]) 
    .then(function(results) { 
     let stream = ytdl(sSuffix, {filter : 'audioonly',}); 
     let aData = []; 

     stream.on('data', function(data) { 
      aData.push(data); 
     }); 

     stream.on('end', function() { 
      let buffer = Buffer.concat(aData); 
      let title = results[0].replace(/[^a-zA-Z0-9]/g,'_'); 
      console.log(title); 
      msg.channel.sendFile(buffer, `${title}.mp3`, '', ''); 
     }); 
    }) 
    .catch(error => console.error(error)); 
} 

function promiseTitle(sSuffix) { 
    return new Promise(function (resolve, reject) { 
     ytdl.getInfo(sSuffix, function(err, info) { 
      if (err) reject(err); 
      console.log(info); 
      resolve(info.title); 
     }); 
    }); 
}