ytdl-core - 将视频标题存储在变量中

Posted

技术标签:

【中文标题】ytdl-core - 将视频标题存储在变量中【英文标题】:ytdl-core - store video title in variable 【发布时间】:2018-03-09 17:05:56 【问题描述】:

我的 Discord.js 机器人有以下内容,当执行命令 $music queue 时,它会在 Discord 频道中发送一条消息,其中包含要播放的下一个标题: 首先,我有一个循环,它遍历队列数组中的所有元素(它们都是 youtube 链接):

          // Loop through each links and get their info.title with ytdl. Then, store it in queue.
          conf.settings[server.id].queue.forEach((link, i) => 
            ytdl.getInfo(link, function(err, info)
              queue += `$i + 1. $info.title\n`;
            );
          );
          message.channel.send(queue);

发送的消息很简单:

Music Queue:

什么时候应该发送:

Music Queue: 1. songTitle 2. songTitle

现在,我知道这与我认为 ytdl.getInfo() 是一个异步函数有关(但不完全确定)。我一直在许多网站上寻找有关这方面的信息,但在 ytdl 的回调函数中执行的代码产生结果的唯一情况是使用 console.log 时,顺便说一句,这也适用于我,但这不是我想要。 (它只适用于 console.log 的事实是我认为它是一个异步函数的原因)

我不想将其记录到控制台中,而是将其实际存储在变量“队列”中,如代码所示。我知道我需要一些东西来延迟其余部分并让它等待 ytdl 函数完成,然后继续执行其余代码,但我只是用完了选项。我尝试了回调、promise 和 gens(但在那之前我对 promises 和 gens 并不熟悉,所以我可能做错了,回调可能会变得混乱,所以也许我也搞砸了)。我没有尝试过超时,但我认为它们对于这种情况并不是一个很好的做法,特别是考虑到这是一个可以处理来自多个服务器的命令的机器人。

有谁知道我可以将来自 ytdl.getInfo() 的信息存储在变量中的方法吗?

【问题讨论】:

【参考方案1】:

我发现了一个使用异步的解决方法(我认为需要节点 7.x),直到我发现它并更新了节点。

          async function queue() 
            var queue = "Music Queue:\n"
            var msg = await message.channel.send(`Fetching queue info...`);
            for(var i = 0; i < conf.settings[server.id].queue.length; ++i)
              const info = await ytdl.getInfo(conf.settings[server.id].queue[i]);
              queue += `$i + 1. $info.title\n`;
            
            msg.edit(queue);
          

          queue();

【讨论】:

以上是关于ytdl-core - 将视频标题存储在变量中的主要内容,如果未能解决你的问题,请参考以下文章

如何将视频快速存储在核心数据中? [关闭]

我们可以使用 ionic 框架将视频存储在 sqlite 数据库中吗?如果可以,我们如何存储它?

在 elasticsearch 中存储视频的推荐方法是啥?

将视频从 Documents 目录存储到相册

将视频上传到 Firebase 存储(未知错误)

在变量中获取 YouTube 视频 URL [关闭]