Discord音乐Bot问题:实现YT-DLP逐个下载播放列表
解决Discord音乐Bot中YT-DLP逐个下载播放列表条目的问题
核心思路
不要让YT-DLP一次性处理整个播放列表的下载,而是先提取播放列表的条目清单,再循环遍历每个条目单独执行下载逻辑,这样就能实现逐个下载、逐个加入播放队列的效果。
代码修改方案
假设你原本的代码是直接传入播放列表URL让YT-DLP批量下载,修改后的关键逻辑如下:
import yt_dlp import discord from discord.ext import commands bot = commands.Bot(command_prefix='!', intents=discord.Intents.all()) play_queue = [] @bot.command() async def play(ctx, url: str): # YT-DLP基础配置 ydl_opts = { 'format': 'bestaudio/best', 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', 'preferredquality':�:, }地实测激manual林/PV(false OR哦不对,修正配置内容 'preferredquality': '192', }], 'quiet': True, 'no_warnings': True, } with yt_dlp.YoutubeDL(ydl_opts) as ydl: # 第一步:仅提取播放列表元数据,不触发下载 playlist_info = ydl.extract_info(url, download=False) # 判断当前链接是否为播放列表 if 'entries' in playlist_info: # 遍历每个播放列表条目 for entry in playlist_info['entries']: # 跳过已被删除或不可用的条目 if entry is None: continue # 第二步:单独处理每个条目,触发下载 entry_audio_info = ydl.extract_info(entry['url'], download=True) audio_path = ydl.prepare_filename(entry_audio_info) # 将音频文件加入播放队列 play_queue.append(audio_path) await ctx.send(f"已加入队列:{entry['title']}") else: # 单个音频的处理逻辑(保持原有逻辑即可) single_audio_info = ydl.extract_info(url, download=True) audio_path = ydl.prepare_filename(single_audio_info) play_queue.append(audio_path) await ctx.send(f"已加入队列:{single_audio_info['title']}") # 替换为你的Bot Token bot.run('YOUR_DISCORD_BOT_TOKEN')
关键修改说明
- 先获取播放列表结构:通过
extract_info(url, download=False)获取播放列表的所有条目信息,而不是直接下载整个列表。 - 逐个条目下载:遍历
playlist_info['entries'],对每个条目的URL单独调用extract_info(download=True),实现单条目下载。 - 容错处理:加入对
None条目的判断,避免因播放列表中存在已删除视频导致的报错。
内容的提问来源于stack exchange,提问作者Leon Brenn
相关产品推荐
相关产品推荐

