Как сделать очередь воспроизведения песен у дискорд бота?

Как мне реализовать поочередное воспроизведение песен.То есть при добавлении новой песни командой play, она ждет пока закончится предыдущая и потом начинается воспроизведение следующей. Просто я не знаю как это реализовать с моей командой Play. Буду рад любой помощи!!!

вот моя команда play

@bot.command(name='play')
async def play(ctx, url: str):
    if ctx.author.voice is None:
        embed = discord.Embed(title=f'', description='подключись к каналу', color='ff0000')
        embed.set_footer(text=f'ПоНяЛ?')
        bot_msg = await ctx.send(embed=embed)
        await asyncio.sleep(15)
        await bot_msg.delete()
    voice_channel = ctx.author.voice.channel        
    if ctx.voice_client is None:
        await voice_channel.connect()
    else:
        await ctx.voice_client.move_to(voice_channel)
    ctx.voice_client.stop()
    FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
    YDL_OPTIONS = {'format':"bestaudio", 'noplaylist': True, 'default_search': 'auto'}

    vc = ctx.voice_client

    with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl:
        info = ydl.extract_info(url, download=False)
        if 'entries' in info:
            url2 = info['entries'][0]["formats"][0]
        elif 'formats' in info:
            url2 = info["formats"][0]
        url = info["webpage_url"]
        stream_url = url2["url"]
        source = await discord.FFmpegOpusAudio.from_probe(stream_url, **FFMPEG_OPTIONS)
        vc.play(source) 
    ``` 


Ответы (1 шт):

Автор решения: mill

Как это сделать с помощью asyncio.Queue я не знаю, но знаю, как сделать через список, создаем список queue, туда передаем steam_url, проверяем, играется ли сейчас музыка, если нет, то воспроизводим, а по окончанию трека удаляем трек на 0 месте с помощью queue.pop(0),затем используем метод play_next, в нем проверяем есть ли элементы в очереди queue, если да, то выполняем voice.play, затем удаляем трек на 0 списке из queue и так по кругу. Вроде объяснил =) удачи Вам. UPD: только сейчас заметил, что посту 2 года... ладно, вдруг кому нибудь поможет UPD2: нужно использовать yt_dlp

queue = []
queue.append(steam_url)

    def play_next(e):
        if len(queue) > 0:
            voice.play(discord.FFmpegPCMAudio(queue[0], **FFMPEG_OPTIONS), after=play_next)
            queue.pop(0)
        
    if not voice.is_playing():
       voice.play(discord.FFmpegPCMAudio(queue[0], **FFMPEG_OPTIONS), after=play_next)
       queue.pop(0)
→ Ссылка