youtube-downloader
Download YouTube videos and HLS streams (m3u8) from platforms like Mux, Vimeo, etc. using yt-dlp and ffmpeg. Use this skill when users request downloading videos, extracting audio, handling protected streams with authentication headers, or troubleshooting download issues like nsig extraction failures, 403 errors, or cookie extraction problems.
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…