Как воспроизвести весь плейлист YouTube на discord.py бот с youtube-dl

#python #ffmpeg #bots #discord.py #youtube-dl

#python #ffmpeg #боты #discord.py #youtube-dl

Вопрос:

Я пытаюсь создать музыкального бота discord. Я использую youtube-dl для извлечения информации и ffmpeg для воспроизведения звука. Мой бот может успешно ставить в очередь и воспроизводить обычные видео, но когда дело доходит до воспроизведения всего списка воспроизведения, он не работает.

Это мой код для воспроизведения плейлистов:

             if 'entries' in info:
                for i in info['entries']:
                    URL = i['formats'][0]['url']     
                    player = FFmpegPCMAudio(URL, **FFMPEG_OPTIONS)
                    queue.append(player)
                    source = queue.pop(0)
                    voice.play(player, after = lambda e: play_next(ctx, source))            
                    await ctx.send('playing song')
 

При этом загружаются все видео в плейлисте, но воспроизводится только первое, а затем отображается эта ошибка:
discord.errors.ClientException: Already playing audio.

Ответ №1:

вы можете проверить, воспроизводит ли голос аудио или нет, и делать что-то на основе этого значения,

 if voice is None:
    voice.play(player, after = lambda e: play_next(ctx, source))
else:
    print("Audio is playing!")
 

но, выполнив команду «voice is None», это означает, что он не только проверит, воспроизводится ли звук, но и проверит все, что нужно делать с голосом, но хорошая вещь при этом заключается в том, что вы можете проверить, находится ли бот все еще в голосовом канале или нет, прежде чем должна начаться следующая песня, иприсоединяйтесь к каналу снова, если у бота была некоторая задержка между воспроизведением песен и оставленной причиной бездействия,

 voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
if voice is_playing(): <--- something like this but that works!
    voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
    if voice is None:
        voiceChannel = discord.utils.get(ctx.guild.voice_channels, name=ctx.author.voice.channel.name)
        await voiceChannel.connect()
        voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
        voice.play(player, after = lambda e: play_next(ctx, source))
    else:
        voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
        voice.play(player, after = lambda e: play_next(ctx, source))
 

этот последний пример может быть немного незавершенным, но он должен быть очень близок к работе, если вы сможете заставить работать ту часть, на которую указывает моя стрелка, но, насколько я знаю, это хорошее решение, надеюсь, это помогло, я знаю, что я очень опаздываю с этим :).

Ответ №2:

Проблема заключается именно в том, о чем сообщает вам сообщение об ошибке: вы пытались воспроизвести файл, в то время как один из них уже воспроизводился. Вам нужно подождать, пока звук не будет воспроизведен; ваша единственная задержка — это приостановка до завершения загрузки.

Вам нужно либо посмотреть, как выполнить блокирующий вызов play (вне области видимости для переполнения стека), либо проверить время воспроизведения из метаданных файла, и sleep это долго.

Это заставляет вас двигаться?

Комментарии:

1. Понятно, думаю, я попробую это сделать. Большое спасибо!