首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点-ytdl核心承诺音频标题和文件下载

节点-ytdl核心承诺音频标题和文件下载
EN

Stack Overflow用户
提问于 2017-05-30 16:21:43
回答 1查看 1.4K关注 0票数 0

我对承诺比较陌生,在使用节点-ytdl-core时,我在两件事上遇到了麻烦。

代码语言:javascript
复制
 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);
        });
    });
}

当我使用上面的代码时,返回的标题是一个沿25998454d48491.V的字符串,尽管控制台会记录正确的标题。意思是承诺不会返回我想要的价值。

此外,createWriteStream在文件被发送(sendFile)之前不会被解析,这意味着我得到了一个0字节文件,尽管在文件系统中完成了文件的下载并具有正确的大小/内容。

因此,我的问题是,如何在我的承诺中返回正确的值,并将createWriteStream转化为承诺?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-03 23:14:47

弄明白了。标题很好,但是sendFile()不允许文件名中的'/‘。我正在测试的视频中有那个角色。此外,在下面的代码中,通过使用流事件将流的所有数据附加到数组中,我设法将ytdl流转换为缓冲区。可以使用另一个事件( end事件)最终发送缓冲区。

代码语言:javascript
复制
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);
        });
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44267350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档