1实现原理 · 为什么它能做到
核心是 yt-dlp/ffmpeg CLI 封装:SKILL.md 指导 agent 用 yt-dlp 下载、ffmpeg 处理 HLS/转码,并自带 python 包装脚本 download_video.py 把下载流程程序化。
Enable reliable video and audio downloads from YouTube and HLS streaming platforms (Mux, Vimeo, etc.) using yt-dlp and ffmpeg.
PO Token 提供者自动编排(高画质关键):自动 pip 安装插件进 yt-dlp 的 Python 环境,优先 docker 跑 brainicism/bgutil-ytdlp-pot-provider 容器(-p 4416:4416),ping 127.0.0.1:4416 探活,Docker 缺失/失败则回退 pip 安装 yt-dlp-getpot-wpc 走浏览器 WPC 方案。
run_cmd = ["docker", "run", "-d", "--name", name] ... "-p", "4416:4416", *env_args, "--init", "brainicism/bgutil-ytdlp-pot-provider"
cookie 认证路径:经授权后把浏览器 cookie 会话交给 yt-dlp(--cookies-from-browser chrome/firefox 或 --cookies 文件),有 cookie 时强制 youtube player client 走 web_safari。
cmd.extend(["--cookies-from-browser", cookies_from_browser]) ... elif cookies_file: cmd.extend(["--cookies", cookies_file])
面向非技术用户的 UX 编排:agent 全代跑——先 --info 取元数据(失败走 YouTube oEmbed 兜底)确认视频身份,再按默认/选择下载,最后报告文件路径、大小、分辨率,全程不要求用户敲命令。
Assume the user is non-technical. Do not ask them to run commands. Execute everything yourself and report progress in plain language.
错误驱动重试链:把 yt-dlp 常见失败(403 / nsig / 'Only images are available' / SSL EOF)映射为策略——403 退非 m3u8 progressive 格式;PO token 故障则重启容器或切 WPC 重试;cookie+403 则换 web_safari client。
return "http error 403" in text or "403: forbidden" in text or "fragment 1 not found" in text
代理感知设计(面向中国大陆网络):读取环境代理 ALL_PROXY/HTTPS_PROXY/HTTP_PROXY 透传给 yt-dlp、pip、docker 容器,localhost 代理改写为 host.docker.internal;pip 走硬编码清华镜像 pypi.tuna.tsinghua.edu.cn。
PYPI_MIRROR = "https://pypi.tuna.tsinghua.edu.cn/simple"
2核心能力
3外部依赖
| Kind | Dependency / Endpoint |
|---|---|
| cli | yt-dlp |
| cli | ffmpeg / ffprobe |
| cli | docker |
| cli | python / pip(yt-dlp 解释器) |
| network | youtube.com(下载取流 + oEmbed 元数据) |
| network | 清华 PyPI 镜像(硬编码装插件源) |
| network | Docker Hub 镜像 brainicism/bgutil-ytdlp-pot-provider(第三方 PO token 服务,拉取即执行) |
| network | 本机 PO provider 探活端点 |
| network | 用户提供任意视频/HLS URL(m3u8 可指向任意第三方 CDN,如 Mux/Vimeo) |
| package | bgutil-ytdlp-pot-provider(pip 插件) |
| package | yt-dlp-getpot-wpc(pip 浏览器版 token 提供者,会启动真实浏览器) |
4管控建议与判定依据
- 本地凭据 / 浏览器配置: 读取用户登录 Cookie/会话/密钥环: 浏览器 cookie:--cookies-from-browser chrome/firefox → yt-dlp 读取浏览器 cookie 库(脚本
- scripts/: 执行本地脚本或命令: 外部 CLI:yt-dlp(下载/元数据/格式列出)、ffprobe/ffmpeg、docker run/start/rm/info、pip inst
- scripts/ 或 SKILL.md: 声明动态安装外部语言包依赖
- 网络端点: 声明外部网络访问: youtube.com:yt-dlp 元数据/取流;oEmbed 兜底 urlopen https://www.youtube.com/oembed(
- 本地工作目录: 文件读写与工件输出: 下载输出:output_dir 递归 mkdir + 按 -o 模板写视频/音频/字幕文件(模板支持绝对路径与 yt-dlp %()s 语法,用户可指
5第二遍独立确认
- [ok] yt-dlp 调用真实存在(下载/-F/-o/-f/--dump-json) — 脚本 cmd = ["yt-dlp"] 起步(738 行),全部参数列表化
- [ok] ffmpeg/ffprobe 调用 — SKILL.md 多处 ffmpeg 命令 + 脚本 get_video_resolution 中 which ffprobe 实测存在
- [ok] cookie 读取路径(--cookies-from-browser / --cookies) — 773-776 行真实拼接;注意解密主体是 yt-dlp 而非脚本,脚本无 cookie 解析代码
- [ok] cookie 日志脱敏 filter_cookie_lines — 仅过滤含 'extracting cookies' 或 'extracted'+'cookies' 的行,非完整脱敏(其他含 cookie 内容行仍会输出)——实现与声称基本一致,范围略窄
- [ok] oEmbed 兜底网络端点 — 660-663 行 urlopen youtube.com/oembed,URL 经 quote 编码,无注入面
- [ok] PO token:docker bgutil 容器 + 4416 ping 探活 — 437-446/553-563 行 docker run brainicism 镜像,255-257 行 ping;容器内实现本 repo 无法审计 → 供应链项如实标注
- [ok] WPC 浏览器回退自动拉起 Chrome — 脚本只传 --extractor-args youtubepot-wpc:browser_path=…(249-252 行)+ find_chrome_path;真实浏览器启动由第三方插件 yt-dlp-getpot-wpc 完成,脚本侧证据到传参为止
- [ok] pip 自动安装插件(清华镜像) — 350、377 行安装命令真实存在,PYPI_MIRROR 38 行硬编码
6结论
6c6c403e7e905b4e…