discord.py音乐bot实现无URL搜索及youtube-dl无效URL报错解决
discord.py音乐机器人关键词搜索功能修改方案
你遇到的报错是因为youtube-dl默认仅处理URL链接,需要添加默认搜索配置触发关键词搜索逻辑,修改后的完整代码如下:
@commands.command() async def play(self, ctx, *search): # 拼接多关键词搜索内容,解决歌名带空格的参数识别问题 query = ' '.join(search) voice_channel = ctx.author.voice.channel if ctx.voice_client is None: await voice_channel.connect() ctx.voice_client.stop() FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'} # 新增default_search配置,非URL内容自动用YouTube搜索,取第一条结果 YDL_OPTIONS = {'format':"bestaudio", 'default_search': 'ytsearch1'} vc = ctx.voice_client with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl: info = ydl.extract_info(query, download=False) # 处理搜索结果结构,搜索返回的内容会嵌套在entries列表中 if 'entries' in info: info = info['entries'][0] url2 = info['formats'][0]['url'] source = await discord.FFmpegOpusAudio.from_probe(url2,**FFMPEG_OPTIONS) vc.play(source) # 改用实际搜索到的视频标题显示,而非原始输入内容 video_title = info.get('title', query) embed=discord.Embed(title="Now playing.", url="https://discord.com/api/oauth2/authorize?client_id=889553173583368252&permissions=8&scope=bot", description=f"Now playing {video_title}", color=0xEC4444) await ctx.send(embed=embed)
核心修改点说明
- 命令参数调整为
*search:支持接收带空格的歌名,所有输入内容会拼接为完整的搜索字符串 - 新增YDL配置项
default_search: 'ytsearch1':告诉youtube-dl如果输入内容不是有效URL,自动到YouTube搜索,取第一条结果返回,直接解决你遇到的报错 - 新增搜索结果结构判断:关键词搜索返回的结果会嵌套在
entries列表中,需要取列表第一个元素才能拿到正确的音频链接和视频信息 - 优化播放提示文案:直接取搜索到的视频标题展示,比原始输入内容更准确
内容的提问来源于stack exchange,提问作者DaanHun
相关产品推荐
相关产品推荐

