如何用youtube dl在discord.py机器人上播放整个youtube播放列表



我正在尝试制作一个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.

您可以检查语音是否正在播放音频,并根据该值进行操作,

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))

最后一个例子可能有点出乎意料,但如果你能让我的箭头指向的部分发挥作用,它应该很快就会发挥作用,但据我所知,这是一个很好的解决方案。希望这能有所帮助。我知道我在这方面已经很晚了:(。

问题正是错误消息告诉您的:您试图播放文件,而文件已经在播放。你必须等到音频播放完毕;您唯一的延迟是暂停,直到下载完成。

您需要查找如何对play进行阻塞调用(超出堆栈溢出的范围(,或者从文件的元数据中检查播放时间,以及sleep的长度。

这能让你动起来吗?

最新更新