如何在youtube-dl提取播放列表信息的同时访问单个URL
问题核心原因
你当前使用的YoutubeDL.extract_info默认会等待整个播放列表的所有条目全部解析完成后,才会一次性返回完整的info字典对象。所以在解析过程中你定义的全局info变量要么是初始的空列表,要么是解析完成后的完整结果,自然看不到逐步增长的条目长度。
另外你初始将info定义为列表,后续解析完成后又赋值为字典,访问info["entries"]时会触发TypeError也是这个逻辑导致的。
解决方案
使用playlist_item_hook回调实现增量获取播放列表条目,每解析完成一个播放列表内的条目就自动触发回调写入存储容器,无需等待全量解析完成。
调整后代码
import sys # 建议将旧版youtube_dl替换为仍在活跃维护的yt-dlp,接口完全兼容,解析成功率更高 # from youtube_dl import YoutubeDL from yt_dlp import YoutubeDL import threading import time # 线程安全的条目存储容器,加锁避免多线程读写冲突 entries = [] entry_lock = threading.Lock() class Logger(): def debug(self, msg): print(f"Debug -> {msg}") def error(self, msg): print(f"Error -> {msg}") def warning(self, msg): print(f"Warning -> {msg}") # 播放列表条目解析回调,每拿到一个条目就自动调用 def on_playlist_item(item): global entries with entry_lock: entries.append(item) # 可在这里直接添加拿到新条目后的后续处理逻辑,无需等待全量解析 def buffer(): url = "你的播放列表链接" ytdl_opts = { "cookiefile": "cookies.txt", "logger": Logger(), "playlist_item_hook": on_playlist_item, # 如果只需要条目的基础链接、标题等信息,设为True可以大幅提升解析速度 # 需要完整元数据则设为False "extract_flat": False, } ytdl = YoutubeDL(ytdl_opts) # 不需要接收返回值,回调已经增量收集了所有条目 ytdl.extract_info(url, download=False) try: task = threading.Thread(target=buffer) task.daemon = True task.start() while task.is_alive(): time.sleep(2) with entry_lock: current_length = len(entries) print(f"当前已解析条目数 -> {current_length}") except KeyboardInterrupt: sys.exit("Interupt.")
注意事项
- 如果你坚持使用旧版
youtube_dl,需要确认版本是否支持playlist_item_hook参数,若不支持直接更换为yt-dlp即可,无需修改其他代码逻辑 - 增量获取到条目后可以直接在回调函数中触发后续的预加载、播放队列添加操作,不需要轮询长度
内容的提问来源于stack exchange,提问作者geranard
相关产品推荐
相关产品推荐

