Discord бот поиск YouTube, дождитесь ответа асинхронной функции - PullRequest
0 голосов
/ 28 мая 2018

Я создал дискорд, но используя javascript, у меня есть одна команда, в которой я хочу иметь возможность искать видео на YouTube и воспроизводить первый результат в голосовом канале.

Я использую библиотеки discordjs и discord-youtube-api .

Этот код ищет команду для поиска.Массив args представляет собой поисковый запрос

else if (command === 'search') {
      isReady = false;
      if (message.channel.type !== 'text') return;

      const { voiceChannel } = message.member;

      if (!voiceChannel) {
        return message.reply('please join a voice channel first!');
      }

      voiceChannel.join().then(connection => {
        const stream = ytdl(searchYouTubeAsync(args), { filter: 'audioonly' });
        const dispatcher = connection.playStream(stream);

        dispatcher.on('end', () => voiceChannel.leave());
        isReady = true;
      })

};

И эта функция использует API YouTube для поиска видео и возврата его URL.

async function searchYouTubeAsync(args) {
  var video = await youtube.searchVideos(args.toString().replace(/,/g,' '));
  console.log(video.url);
  console.log(typeof String(video.url));
  return String(video.url);
}

Я получаю следующеесообщение об ошибке при попытке ввода команды.

(node:13141) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: The "url" argument must be of type string. Received type object
    at Url.parse (url.js:146:11)
    at Object.urlParse [as parse] (url.js:140:13)
    at Object.exports.getURLVideoID (/Users/alexanderhoerl/Developer/discord-music-bot/node_modules/ytdl-core/lib/util.js:248:20)
    at Object.exports.getVideoID (/Users/alexanderhoerl/Developer/discord-music-bot/node_modules/ytdl-core/lib/util.js:279:20)
    at getInfo (/Users/alexanderhoerl/Developer/discord-music-bot/node_modules/ytdl-core/lib/info.js:46:17)
    at ytdl (/Users/alexanderhoerl/Developer/discord-music-bot/node_modules/ytdl-core/lib/index.js:17:3)
    at voiceChannel.join.then.connection (/Users/alexanderhoerl/Developer/discord-music-bot/index.js:89:24)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:13141) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:13141) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Я полагаю, проблема в том, что музыкальный бот пытается загрузить поток до того, как функция searchYouTube найдет ссылку, поэтому действительный URL не указан.Хотя я не знаю, как это исправить, поскольку функция должна быть асинхронной для ожидания результатов поиска на YouTube.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Я почти уверен, что это неактуально сейчас.Однако вот решение:

const stream = ytdl(searchYouTubeAsync(args).toString(), { filter: 'audioonly' });

xxx.toString () помогло мне, когда у меня были такие же проблемы с ytdl.

0 голосов
/ 14 июля 2018

Вы можете запустить это в функции async:

voiceChannel.join().then(async connection => {
  let url = await searchYouTubeAsync(args);
  let stream = ytdl(url, { filter: 'audioonly' });
  let dispatcher = connection.playStream(stream);

  dispatcher.on('end', () => voiceChannel.leave());
  isReady = true;
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...