#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]. Извините за мой английский