Музыкальный бот Discord.js с очередью не работает

Пытаюсь сделать музыкальный Discord Bot с очередью. В настоящее время команда воспроизведения работает, и я могу добавить музыку в очередь (отображается с моей командой списка воспроизведения). Проблема в том, что когда заканчивается первая музыка, бот полностью останавливается и не воспроизводит следующую песню (он не отключается и выглядит так, как будто что-то играет).
Я использую Discord.js v12, ffmpeg-static и Youtube API .

if (command === "play" || command === "p") {

    const args = message.content.split(" ");
    const searchString = args.slice(1).join(" ");
    if (!args[1]) {
      return message.channel.send('Il faut spécifier une URL !')
        .catch(console.error);
    }
    const url = args[1] ? args[1].replace(/<(.+)>/g, "$1") : "";
    const serverQueue = queue.get(message.guild.id);
    var voiceChannel = message.member.voice.channel;
    if (!voiceChannel) return message.channel.send("Tu dois être dans un salon vocal pour utiliser cette commande !");
    const permissions = voiceChannel.permissionsFor(message.client.user);
    if (!permissions.has("CONNECT")) {
      return message.channel.send("J'ai besoin de la permission **`CONNECT`** pour cette commande");
    }
    if (!permissions.has("SPEAK")) {
      return message.channel.send("J'ai besoin de la permission **`SPEAK`** pour parler");
    }

    if (url.match(/^https?:\/\/(www.youtube.com|youtube.com)\/playlist(.*)$/)) {
      const playlist = await youtube.getPlaylist(url);
      const videos = await playlist.getVideos();
      for (const video of Object.values(videos)) {
        const video2 = await youtube.getVideoByID(video.id); // eslint-disable-line no-await-in-loop
        await handleVideo(video2, message, voiceChannel, true); // eslint-disable-line no-await-in-loop
      }
      return message.channel.send(`:white_check_mark:  **|**  Playlist: **\`${playlist.title}\`** a été ajouté à la playlist !`);
    } else {
      try {
        var video = await youtube.getVideo(url);
      } catch (error) {
        try {
          var videos = await youtube.searchVideos(searchString, 10);
          let index = 0;
          // eslint-disable-next-line max-depth
          try {

          } catch (err) {
            console.error(err);
            return message.channel.send("Annulation de la commande...");
          }
          const videoIndex = parseInt(1);
          var video = await youtube.getVideoByID(videos[videoIndex - 1].id);
        } catch (err) {
          console.error(err);
          return message.channel.send("????  **|**  Je n'obtiens aucun résultat :pensive:");
        }
      }
      return handleVideo(video, message, voiceChannel);
    }
}


async function handleVideo(video, message, voiceChannel, playlist = false) {
  const serverQueue = queue.get(message.guild.id);
  const song = {
    id: video.id,
    title: Util.escapeMarkdown(video.title),
    url: `https://www.youtube.com/watch?v=${video.id}`
  };
  console.log(song.url)
  if (!serverQueue) {
    const queueConstruct = {
      textChannel: message.channel,
      voiceChannel: voiceChannel,
      connection: null,
      songs: [],
      volume: 5,
      playing: true
    };
    queue.set(message.guild.id, queueConstruct);

    queueConstruct.songs.push(song);

    try {
      var connection = await voiceChannel.join();
      queueConstruct.connection = connection;
      play(message.guild, queueConstruct.songs[0]);
    } catch (error) {
      console.error(`Je ne peux pas rejoindre le salon vocal : ${error}`);
      queue.delete(message.guild.id);
      return message.channel.send(`Je ne peux pas rejoindre le salon vocal : **\`${error}\`**`);
    }
  } else {
    serverQueue.songs.push(song);
    if (playlist) return undefined;
    else return message.channel.send(`:white_check_mark:  **|** **\`${song.title}\`** a été ajouté à la playlist !`);
  }
  return undefined;
}


function play(guild, song) {
  const serverQueue = queue.get(guild.id);

  if (!song) {
    serverQueue.voiceChannel.leave();
    queue.delete(guild.id);
    return;
  }

  const dispatcher = serverQueue.connection.play(ytdl(song.url))
    .on("end", reason => {
      if (reason === "Stream is not generating quickly enough.") console.log("Musique terminée.");
      else console.log(reason);
      serverQueue.songs.shift();
      play(guild, serverQueue.songs[0]);
    })
    .on("error", error => console.error(error));
  dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);

  serverQueue.textChannel.send(`????  **|**  En cours de lecture : **\`${song.title}\`**`);
};

person Nathn    schedule 04.06.2020    source источник
comment
Я бы посоветовал вам зарегистрировать переменную serverQueue после ее объявления в первой строке команды воспроизведения, чтобы увидеть, пуста ли ваша очередь или что-то еще не так. Вы также должны попытаться записать переменную песни, на всякий случай   -  person Tenclea    schedule 04.06.2020
comment
да, переменная кажется serverQueue пустой, но я не понимаю, почему   -  person Nathn    schedule 04.06.2020
comment
Я собираюсь провести несколько тестов самостоятельно, я вернусь к вам, если что-нибудь найду   -  person Tenclea    schedule 04.06.2020
comment
Мне очень жаль, но мне не удается заставить ваш код работать на моем компьютере ... Думаю, мне не хватает нужного модуля ... С этого момента я предлагаю вам попробовать другие модули, например ytsr, чтобы найти песни, ytpl для списка воспроизведения и использование ytdl для получения информации (идентификатор, название и т. д.), и это может помочь вам решить вашу проблему. Вы также можете делать то, что я люблю называть массовым журналированием, которое состоит из журналирования каждого шага вашего кода, чтобы увидеть, откуда возникла ошибка. Надеюсь, вы разберетесь с этим, и если вы это сделаете, дайте мне знать :)   -  person Tenclea    schedule 04.06.2020


Ответы (1)


Попробуйте заменить "end" на "finish":

const dispatcher = serverQueue.connection.play(ytdl(song.url)).on("end", reason => {

to

const dispatcher = serverQueue.connection.play(ytdl(song.url)).on("finish", reason => {
person Jhemeson Ferreira    schedule 06.10.2020
comment
Вау, это сработало, спасибо! Не думала, что через полгода найду ответ! - person Nathn; 25.10.2020