You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:54:02