Приостановка, постановка в очередь и зацикливание песен с discord.py

#python #discord.py

#python #discord.py

Вопрос:

У меня есть этот код, который воспроизводит песню по голосовому каналу и работает нормально, но как мне сгенерировать код, который позволяет ставить в очередь, приостанавливать и зацикливать?

 @client.command(pass_context=True)
async def play(ctx, url):

    if not ctx.message.author.voice:
        await ctx.send('Please enter the voice channel')
        return

    else:
        channel = ctx.message.author.voice.channel

    voice_client = await channel.connect()

    guild = ctx.message.guild

    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        file = ydl.extract_info(url, download=True)
        path = str(file['title'])   "-"   str(file['id']   ".mp3")

    voice_client.play(discord.FFmpegPCMAudio(path), after=lambda x: endSong(guild, path))
    voice_client.source = discord.PCMVolumeTransformer(voice_client.source, 1)

    await ctx.send(f'**NOW MUSIC: **{url}')

    while voice_client.is_playing():
        await asyncio.sleep(1)
    else:
        await voice_client.disconnect()
        print("Disconnected")
 

Ответ №1:

https://discordpy.readthedocs.io/en/latest/api.html#voice

Вы можете увидеть Voice объект, хранящийся в вашем voice_client методе has a pause() и resume() : приостановка достаточно проста.

Для постановки в очередь и зацикливания тяжелую работу придется выполнять вам. Вам придется позвонить play() еще раз, когда песня закончится, а затем снова воспроизвести ту же песню (зацикливание) или воспроизвести следующую песню, которую вы сохранили где-то в массиве или другом месте (постановка в очередь).

Хорошей новостью является то, что discord.py позволяет вам избежать выполнения раздражающего приема, чтобы узнать, когда песня закончилась: is_playing() повторный вызов до тех пор, пока она не вернется False . Как вы написали в своем коде, play() также принимает в аргумент вызываемое имя after , которое вызывается, когда песня заканчивается (или когда возникает ошибка!).

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

Ответ №2:

Пример команды приостановки:

 @client.command
async def pause(ctx):
    server = ctx.message.guild
    voice_channel = server.voice_client                
    voice_channel.pause()
    print('pause')
 

Что касается очереди, вы можете создать список песен, поставленных в очередь. Проверьте, будет ли проигрываемая песня добавляться в очередь, после воспроизведения текущей песни вам нужно воспроизвести песню queue [0]. Извините за мой английский