此问题的常见原因是与Youtube dl库的版本问题有关。尝试升级或降级此库版本,以便与Discord py库兼容。以下是一个示例代码片段,显示如何在Discord.py中使用最新版本的Youtube dl:
import discord
from discord.ext import commands
import youtube_dl
# set youtube_dl options
ytdl_options = {
'format': 'bestaudio/best',
'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s',
'restrictfilenames': True,
'noplaylist': False,
'nocheckcertificate': True,
'ignoreerrors': False,
'logtostderr': False,
'quiet': True,
'no_warnings': True,
'default_search': 'auto',
'source_address': '0.0.0.0' # ipv6 addresses cause issues sometimes
}
class Music(commands.Cog):
def __init__(self, client):
self.client = client
self.voice = None
self.queue = []
async def join_voice_channel(self, ctx):
if ctx.author.voice:
self.voice = await ctx.author.voice.channel.connect()
else:
await ctx.send("You need to be in a voice channel to use this command.")
@commands.command()
async def play(self, ctx, *, url):
await self.join_voice_channel(ctx)
player = await YTDLSource.from_url(url, loop=self.client.loop, stream=True, ytdl_options=ytdl_options)
self.queue.append(player)
if not self.voice.is_playing():
await self.play_next()
async def play_next(self):
if len(self.queue) > 0:
player = self.queue.pop(0)
self.voice.play(player, after=lambda e: print(f'Player error: {e}') if e else None)
else:
await self.voice.disconnect()
client = commands.Bot(command_prefix='!', case_insensitive=True)
client.add_cog(Music(client))
client.run('token')
此代码片段使用了discord.py和youtube_dl库,以创建一个可以播放从YouTube链接获取