提问者:小点点

第一次完成不和谐机器人后如何播放下一首歌


我正在尝试创建一个不和谐的音乐机器人与discord.py,我是Python新手。我不知道如何让机器人自动播放下一首歌。我尝试了许多不同的东西。这是我目前播放一首歌的代码:

vc.play(discord.FFmpegPCMAudio(executable="C:/FFmpeg/bin/ffmpeg.exe", source=sound + ".mp3"))
await message.channel.send("Spiele nun " + str(sound) +"weiter")

使用上面的代码,我没有遇到问题。


共1个答案

匿名用户

您应该使用FFmpegPCMAudio函数的参数。此参数接受可调用作为参数,并在当前歌曲结束时执行它。

  • 首先,您必须创建一个歌曲队列变量:
song_queue = []
  • 然后,您必须更改您的play()函数:
source = sound + '.mp3'
soung_queue.append(source)
if not vc.is_playing():
    vc.play(discord.FFmpegPCMAudio(source=source, after=lambda e: play_next(ctx))
    await ctx.send("Now playing...")
else:
    await ctx.send('Song queued')
  • 最后,您必须创建一个play_next()函数:
import asyncio

def play_next(ctx, source):
    if len(self.song_queue) >= 1:
        del self.song_queue[0]
        vc = get(self.bot.voice_clients, guild=ctx.guild)
        vc.play(discord.FFmpegPCMAudio(source=source, after=lambda e: play_next(ctx))
        asyncio.run_coroutine_threadsafe(ctx.send("No more songs in queue."), self.bot.loop)

您可以随意命名play_next()函数。
如果您希望您的机器人断开连接,因为它已经太久没有播放声音了,请将play_next()函数更改为:

import asyncio

def play_next(ctx, source):
    vc = get(self.bot.voice_clients, guild=ctx.guild)
    if len(self.song_queue) >= 1:
        del self.song_queue[0]
        vc.play(discord.FFmpegPCMAudio(source=source, after=lambda e: play_next(ctx))
    else:
        asyncio.sleep(90) #wait 1 minute and 30 seconds
        if not vc.is_playing():
            asyncio.run_coroutine_threadsafe(vc.disconnect(ctx), self.bot.loop)
            asyncio.run_coroutine_threadsafe(ctx.send("No more songs in queue."), self.bot.loop)