关于 youtube-downloader
youtube-downloader 是面向下载任务的技能,使用 yt-dlp 和 ffmpeg 获取 YouTube 与 HLS 平台的视频或音频。它区分媒体文件下载与文字转写需求,并提供格式选择、故障排查和授权恢复流程。
主要功能
- 01下载 YouTube 视频和音频
- 02获取 HLS 流媒体
- 03支持字幕与格式选择
- 04按授权处理受限内容
- 05排查下载和画质问题
适用场景
- 01保存 YouTube 视频供离线观看
- 02提取视频音频为 MP3
- 03下载带认证请求头的 HLS 流
- 04获取字幕或视频转写文本
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ daymade/ claude-code-skills --skill youtube-downloader安装后在 Claude Code 中输入/youtube-downloader确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/internal-sop.mdpo-token-setup.mdtext-first.mdscripts/download_video.pytests/test_download_video.py详细介绍
YouTube 下载器
概述
使用 yt-dlp 和 ffmpeg,从 YouTube 和 HLS 流媒体平台(Mux、Vimeo 等)可靠地下载视频和音频。本工具提供以下工作流:
- 以可用画质下载 YouTube 视频,可选使用 PO Token 和经授权的 Cookie 恢复
- 使用身份验证标头下载 HLS 流
- 处理受保护的内容,并排查常见下载失败问题
目标区分:文件还是文本(请先阅读)
开始下载前,先判断用户的请求类型:
- 用户要的是视频/音频文件本身(保存、编辑、离线观看)→ 按照下方下载流程继续,不作更改。
- 用户要的是语音内容的文本(转录文本、字幕、会议记录、存档、“说了什么”)→ 首先按照
references/text-first.md操作:先查找现有的存档转录文本 → 平台转录文本 API → 仅使用 yt-dlp 下载字幕 → 获取经授权的音轨并进行 ASR。不要为了获取文本而下载完整视频。
文本优先流程不会阻止文件请求:如果用户要的是文件,请按照下方原样的流程下载。
面向非技术用户的体验(默认)
假设用户不懂技术。不要让用户运行命令。所有操作都由你执行,并用通俗的语言报告进度。除非用户询问,否则不要提及工具。
默认流程:
- 如果用户没有提供 URL,请询问。
- 获取视频元数据(标题/上传者/时长/缩略图),并确认内容符合用户的意图。
- 如果 yt-dlp 因“确认你不是机器人”而被拦截,则改用 YouTube oEmbed 获取标题/上传者/缩略图(时长可能未知)。
- 提供简单选项(视频还是仅音频、画质、字幕、保存位置)。
- 如果用户未指定,则采用合理的默认设置:
- 以最佳画质下载视频
- 合并输出为 MP4
- 仅下载单个视频(不下载播放列表)
- 下载完成后,报告最终文件路径、文件大小和分辨率(如果是视频)。
以用户易于理解的方式提供选项:
- “以最佳画质下载视频(默认)”
- “仅下载音频(MP3)”
- “选择画质:1080p / 720p / 480p / 360p”
- “添加字幕(如果有)”
- “保存到 Downloads 文件夹(默认),或告诉我其他文件夹”
有缩略图时,始终显示缩略图:
- 如果元数据中包含缩略图 URL,请使用 Markdown 图片语法展示:
。
执行额外操作前先征求同意:
- 下载播放列表前先确认(可能会很大)。
- 缺少依赖项时,安装或升级前先确认。
- 提取浏览器 Cookie 前先询问。
- 如果使用 Cookie,面向用户的回复中绝不提及 Cookie 数量或原始 Cookie 详情。请说“使用了你 Chrome 的登录会话”。
- 仅在进行明确的 Token 诊断或用户提出请求后,才设置 PO Token 辅助工具,并且必须在现有安装/服务授权范围内。如果已有该授权,则执行恢复操作并继续下载;否则,仅请求缺少的权限。不要将安装 Docker 作为备用方案;适当时使用已授权的浏览器提供程序。
法律/安全提醒(简短):
- 仅在用户拥有下载内容的权利或已获得许可时继续。
回复模板(使用通俗语言,不要包含命令):

Title: …
Channel: …
Duration: …
I can help you:
1) Download the video (best quality, MP4)
2) Download audio only (MP3)
3) Pick a specific quality (1080p/720p/480p/360p)
4) Include subtitles (if available)
Where should I save it? (Default: Downloads folder)
如果用户说“直接下载”:
- 使用默认设置继续,并在下载完成后确认。
- 如果遭到拦截,请按照下方 SOP 判断实际诊断结果,并执行相应的授权恢复操作。
可靠下载 SOP(内部)
重试失败前,请阅读下载 SOP。从 yt-dlp 当前默认客户端和现有网络配置开始。不要仅为了开始下载就要求用户提供服务提供商、切换到 Android 或提取浏览器 Cookie。
Agent 执行清单(内部)
- 运行
scripts/download_video.py URL --info获取元数据。它不会启动任何提供方;提取失败时,其 oEmbed 回退仅提供有限字段。 - 有缩略图时,渲染缩略图。按要求使用文件/音频、质量、字幕和保存位置;如果已指定或暗示默认值,则使用默认设置。
- 先执行常规下载。如果已安装 Node 运行时,且 yt-dlp 需要它,则传入
--js-runtimes node;安装运行时仍须遵循依赖授权流程。 - 失败时,查看实际错误和
-F输出。请求的格式不存在、仅输出图片、出现 403 或分辨率较低,这些情况本身都不能证明是令牌问题。 - 如果失败的请求明确报告缺少或需要 PO Token,请阅读提供方设置。在现有设置授权范围内,执行
--auto-po-token并完成原始下载;不要只给用户一条命令就停止。此选项会先尝试原生途径,然后允许进行有次数限制的提供方重试和 WPC 恢复。 - 在提供任一 Cookie 选项前,先请求浏览器 Cookie 权限。整个重试过程中,保留已授权的 Cookie 会话和兼容的客户端。
- 对于单独出现的 403/片段失败,封装脚本可以使用渐进式格式重试一次质量预设。请验证最终分辨率;回退结果的质量可能较低。自定义格式和纯音频请求会保留其明确指定的选择。
- 使用
ffprobe验证最终文件,并报告其路径、大小以及实际分辨率或音频属性。提供方运行状态正常或格式列表存在,都不代表下载已完成。
何时使用此技能
当用户遇到以下情况时,应调用此技能:
- 请求下载 YouTube 视频或播放列表
- 想从 YouTube 视频中提取音频
- 遇到 yt-dlp 下载失败或可用格式有限
- 需要格式选择或质量选项方面的帮助
- 仅报告可用格式为低质量(360p)
- 询问如何下载特定画质(1080p、4K 等)的 YouTube 内容
- 需要将下载的 WebM 视频转换为 MP4 格式,以提高兼容性
- 请求从 Mux、Vimeo 等平台或其他流媒体服务下载 HLS 流(m3u8)
- 需要下载要求提供身份验证标头的受保护流
前提条件
1. 验证 yt-dlp 是否已安装(由你运行)
which yt-dlp
yt-dlp --version
如果缺少 yt-dlp,或当前提取诊断要求更新,请先取得所需的安装/升级授权,然后使用现有安装的所有者:
brew upgrade yt-dlp # macOS
# or
pip install --upgrade yt-dlp # Cross-platform
查看最新的 EJS 设置指南,了解已安装发行版对 JavaScript 运行时和挑战求解器的要求。已安装的 Node 二进制文件可能需要显式指定 --js-runtimes node;不要将 EJS/nsig 失败视为 PO Token 问题。
2. 检查当前画质访问情况(由你运行)
下载前,请检查可用格式:
yt-dlp -F "https://youtu.be/VIDEO_ID"
将列出的媒体流与请求的画质进行比较。如果仅显示低分辨率格式,请先检查提取/运行时警告和源内容的可用情况,再选择恢复方式。
高清下载工作流
步骤 1:尝试原生客户端选择
除非存在具体诊断信息或用户明确要求,否则不要设置 player_client。官方提取器指南介绍了 yt-dlp 默认使用不需要令牌的客户端进行尝试。可用格式取决于视频、账户、客户端、网络以及 YouTube 当前的限制措施。
步骤 2:仅在需要时下载并升级处理
# Download best quality up to 1080p
scripts/download_video.py "VIDEO_URL" --quality 1080p
# Download best available quality
scripts/download_video.py "VIDEO_URL"
# After an explicit token requirement, with setup already authorized
scripts/download_video.py "VIDEO_URL" --auto-po-token
如需安装和提供方特定的恢复方式,请加载 PO Token 设置。不要仅凭分辨率推断需要使用提供方。
步骤 3:验证下载质量
# Check video resolution
ffprobe -v error -select_streams v:0 -show_entries stream=width,height,codec_name -of default=noprint_wrappers=1 video.mp4
1080p 的预期输出:
codec_name=vp9
width=1920
height=1080
授权浏览器 Cookie 方式
当内容需要授权账户访问,或机器人验证持续出现时,在获得 Cookie 授权后使用 Cookie。Cookie 用于验证会话;它不能替代缺失的 PO Token:
# Firefox
yt-dlp --cookies-from-browser firefox -f "bestvideo[height<=1080]+bestaudio/best" "VIDEO_URL"
# Chrome
yt-dlp --cookies-from-browser chrome -f "bestvideo[height<=1080]+bestaudio/best" "VIDEO_URL"
优点:可访问有年龄限制和仅限会员观看的内容。 要求:
- 必须在指定的浏览器中登录 YouTube。
- 浏览器和 yt-dlp 必须使用相同的 IP/代理。
- 保留 yt-dlp 默认的 Cookie 兼容客户端;仅在有针对性地重试时使用
web_safari。不要将账户 Cookie 与不支持 Cookie 的 Android/iOS 客户端搭配使用。
常见任务
仅下载音频(自行运行)
提取音频并保存为 MP3:
yt-dlp -x --audio-format mp3 "VIDEO_URL"
自定义输出目录(自行运行)
yt-dlp -P ~/Downloads/YouTube "VIDEO_URL"
下载字幕(自行运行)
yt-dlp --write-subs --sub-lang en "VIDEO_URL"
下载播放列表(自行运行)
yt-dlp -f "bestvideo[height<=1080]+bestaudio/best" "PLAYLIST_URL"
将 WebM 转换为 MP4(自行运行)
YouTube 高质量下载通常采用 WebM 格式(VP9 编解码器)。转换为 MP4 可获得更广泛的兼容性:
# Check if ffmpeg is installed
which ffmpeg || brew install ffmpeg # macOS
# Convert WebM to MP4 with good quality settings
ffmpeg -i "video.webm" -c:v libx264 -preset medium -crf 23 -c:a aac -b:a 128k "video.mp4"
参数说明:
-c:v libx264:使用 H.264 视频编解码器(兼容性广)-preset medium:平衡编码速度与文件大小-crf 23:恒定速率因子,用于控制画质(范围为 18-28,数值越低,画质越好)-c:a aac:使用 AAC 音频编解码器-b:a 128k:音频比特率为 128 kbps
提示:转换后仍保持 1080p 分辨率,并且在现代硬件上可获得约 6 倍的编码速度。
故障排查速查
缺少画质 / 只有图片 / 请求的格式不可用
检查 -F、所选格式表达式、当前的 yt-dlp/EJS/运行时警告以及源是否可用。这些提示可能由多种原因导致。只有在提取或媒体请求失败时同时提示缺少/需要 PO Token,才进入提供方设置。不要仅仅因为缺少所请求的高度或格式 ID 就安装提供方。
登录以确认你不是机器人
确认正在使用预期的代理/网络。如果验证仍然出现,且需要 Cookie,请先取得 Cookie 授权,保留该会话,然后重试。如果无法获得授权,请明确说明具体的授权缺失;不要在未告知的情况下读取浏览器 Cookie。
nsig / JavaScript 验证失败
检查已安装的 yt-dlp 版本,并参阅 EJS 运行时和求解器说明。在获得授权的范围内修复已诊断出的前置条件。可以明确选择 Android 或 AndroidVR 进行有限的诊断,但它们都不是默认的恢复方式,也不保证能解决问题。
403 / SSL EOF / 分片错误
区分媒体 403 与 TLS、超时、代理和提供方健康状态错误。常见的 403 并不能证明需要 Token。对于 SSL/超时故障,请先检查网络路径;只有在相关条件发生变化后才重试。对于使用画质预设时发生的 403/分片错误,封装程序会进行一次渐进式重试,但可能会降低画质。
下载缓慢或网络错误
对于身处中国或使用限制性代理的用户:
- 网络状况可能导致下载缓慢
- 请留出充足的完成时间
- yt-dlp 会在暂时性故障时自动重试
PO Token 警告(无害)
WARNING: android client https formats require a GVS PO Token
处理方式:如果下载成功且已验证,无需为未使用客户端的警告进行修复。若下载失败,请先阅读完整诊断信息和实际可用格式,再选择 Token 处理分支。
内置脚本参考
scripts/download_video.py
此包装脚本用于原生客户端下载和有限范围内的诊断恢复。默认情况下,它不会安装或启动提供方,也不会读取 Cookie。请自行执行并报告已验证的文件。
基本用法:
scripts/download_video.py "VIDEO_URL"
参数:
url- YouTube 视频 URL(必填)-o, --output-dir- 输出目录--output-template- 输出文件名模板(yt-dlp 语法)-f, --format- 格式规范-q, --quality- 画质预设(best、1080p、720p、480p、360p、worst)。默认值:best(使用--audio-only时跳过)-a, --audio-only- 提取音频并保存为 MP3--subtitles- 如果有字幕则下载--sub-lang- 字幕语言(以逗号分隔,默认值:en)--cookies-from-browser- 从浏览器加载 Cookie(例如 chrome、firefox)--cookies-file- 从 cookies.txt 文件加载 Cookie--player-client- 使用指定的 YouTube 播放器客户端(例如 web_safari)--auto-po-token- 在明确诊断出缺少或必需令牌后,授权配置提供方;先尝试原生客户端,再尝试 Docker bgutil 或浏览器 WPC--no-auto-po-token- 禁用提供方配置(默认);不会禁用已安装的 yt-dlp 插件--proxy- yt-dlp 和 PO Token 提供方使用的代理 URL(例如 http://127.0.0.1:1082)--wpc-browser-path- WPC 提供方的浏览器可执行文件路径-F, --list-formats- 列出可用格式--merge-format- 合并后的输出容器格式(例如 mp4、mkv)。默认值:mp4--playlist- 允许下载播放列表(默认仅下载单个视频)--info- 打印标题/上传者/时长/缩略图并退出--no-android-client- 保留的兼容性选项;此包装脚本已保持原生客户端选择不变--js-runtimes- 向 yt-dlp 传入已安装的运行时,例如node或node:/path/to/node
画质要求
不要根据提供方/客户端/Cookie 的组合承诺分辨率。请请求所需画质、检查可用格式,并验证实际下载的文件。无需配置新的提供方即可成功下载高分辨率内容,只能证明该输入和环境可行;已安装的插件或配置仍可能发挥作用。提供方无法生成源内容中不存在的分辨率。
HLS 流下载(m3u8)
对于 Mux、Vimeo 等基于 HLS 的流媒体平台,请优先使用 ffmpeg。这些流通常需要身份验证标头,而 yt-dlp 可能无法正确处理。
识别 HLS 流
HLS 流使用 .m3u8 播放列表文件:
- 主播放列表:列出多个画质选项
- 媒体播放列表:包含实际的视频/音频分段 URL
下载工作流
第 1 步:获取流 URL
从视频源获取 m3u8 URL。对于受保护的流:
- 打开浏览器 DevTools → Network 标签页
- 播放视频
- 筛选 "m3u8",查找播放列表 URL
- 复制媒体播放列表 URL(通常包含 "rendition.m3u8" 等画质信息)
第 2 步:确定所需标头
许多 CDN 需要身份验证标头:
- Referer:来源网站(例如
https://maven.com/) - Origin:与 Referer 相同,用于 CORS
- User-Agent:浏览器标识
检查 Network 标签页,查看浏览器发送了哪些标头。
第 3 步:使用 ffmpeg 下载
对于受保护的流,使用带 -headers 标记的 ffmpeg:
ffmpeg -headers "Referer: https://example.com/" \
-protocol_whitelist file,http,https,tcp,tls,crypto,httpproxy \
-i "https://cdn.example.com/path/rendition.m3u8?params" \
-c copy -bsf:a aac_adtstoasc \
output.mp4
关键参数:
-headers:设置 HTTP 标头(身份验证的关键)-protocol_whitelist:启用 HLS 所需的协议-c copy:流复制(不重新编码,速度更快)-bsf:a aac_adtstoasc:修复 AAC 音频兼容性
常见标头模式:
# Single header
-headers "Referer: https://example.com/"
# Multiple headers
-headers "Referer: https://example.com/" \
-headers "User-Agent: Mozilla/5.0..."
# Alternative syntax
-headers $'Referer: https://example.com/\r\nUser-Agent: Mozilla/5.0...'
处理分离的音频/视频流
有些平台(如 Mux)会分别提供音频和视频:
- 下载音频流:
ffmpeg -headers "Referer: https://example.com/" \
-protocol_whitelist file,http,https,tcp,tls,crypto,httpproxy \
-i "https://cdn.example.com/audio/rendition.m3u8" \
-c copy audio.m4a
- 下载视频流:
ffmpeg -headers "Referer: https://example.com/" \
-protocol_whitelist file,http,https,tcp,tls,crypto,httpproxy \
-i "https://cdn.example.com/video/rendition.m3u8" \
-c copy video.mp4
- 合并流:
ffmpeg -i video.mp4 -i audio.m4a -c copy merged.mp4
HLS 下载故障排查
403 Forbidden 错误
原因:缺少身份验证标头,或标头不正确。
解决方法:
- 验证 Referer 标头是否与视频来源网站匹配
- 检查是否需要其他标头(Origin、User-Agent)
- 确保 m3u8 URL 包含浏览器中的所有查询参数
yt-dlp 卡在提取 Cookie 阶段
症状:Extracting cookies from chrome 无限期卡住。
解决方法:对于 HLS 流,直接使用 ffmpeg 代替 yt-dlp。
协议未列入白名单
错误:Protocol 'https' not on whitelist 'file,crypto,data'
解决方法:添加 -protocol_whitelist file,http,https,tcp,tls,crypto,httpproxy
片段为空或没有流
原因:m3u8 URL 中的签名已过期。
解决方法:
- 从浏览器 DevTools 获取新 URL
- 获取 URL 后立即下载
- 查找签名参数已更新的码率版本 URL
性能提示
- HLS 下载速度通常为实时速度的 10-15 倍
- 使用
-c copy不重新编码(速度最快) - 通过实时进度显示监控下载
- 使用绝对输出路径,避免目录混淆
延伸阅读
- PO Token 设置:详细的安装和故障排除说明,请参阅
references/po-token-setup.md - 内部 SOP:
references/internal-sop.md— 简要列出那些看起来像其他问题的 yt-dlp 故障(在 zsh 中 URL 未加引号、代理无法连接 PO Token 提供方)。下载无明显原因失败时,请先阅读 - yt-dlp 文档:https://github.com/yt-dlp/yt-dlp
- 格式选择指南:https://github.com/yt-dlp/yt-dlp#format-selection
下一步:获取视频中的文本
两种情况,两种处理方式:
- 用户的目标是获取文本,且尚未下载任何内容:不要只为获取文本而下载视频——请遵循
references/text-first.md中的文本优先流程(现有归档字幕 → 平台字幕 API → 仅使用 yt-dlp 下载字幕 → 经授权的音轨 + ASR)。 - 用户已下载文件,现在还想获取文本:仍应利用已知来源信息检查现有字幕和原始字幕。如果这些检查都未找到可用文本,则在 L4 级别复用本地文件,无需再次下载。主动建议:
Download complete: [filename]
If you need the spoken content as text, I can transcribe it for you.
Options:
A) Transcribe with /daymade-audio:asr-transcribe-to-text (Recommended for speech-to-text)
B) No thanks — I just needed the video file