Skip to content

Repository files navigation

yt-dlp-win-script

English

一个 Windows 交互式 yt-dlp 下载脚本。双击启动后会自动检查 yt-dlp 更新,然后让你粘贴视频或直播链接,按视频编码列出可比较的高分辨率档位、帧率、HDR/SDR 和码率,方便选择下载格式。

文件

  • Start-Interactive-YTDLP.bat:双击启动入口。
  • interactive-yt-dlp.ps1:主要交互逻辑。
  • yt-dlp.exe:建议放在本目录,或加入系统 PATH;如果两处都找不到,脚本会自动下载到本目录。
  • chrome-extension\ / edge-extension\:浏览器扩展源码,分别用于 Chrome 和 Edge。
  • Register-Chrome-Bridge.bat / Register-Edge-Bridge.bat:双击注册浏览器 Native Host。
  • ffmpeg.exe / ffprobe.exe:用于合并、转封装、字幕转换和嵌入;如果缺失,脚本会自动下载到本目录。
  • Output\:默认下载输出目录,启动后可以改为其他目录。

依赖

  • Windows
  • Windows 自带 PowerShell,或 PowerShell 7 pwsh.exe

使用方法

  1. 可选:将 yt-dlp.exe 放在本目录,或加入系统 PATH;如果没有,脚本启动时会自动下载。
  2. 可选:将 ffmpeg.exeffprobe.exe 放在本目录,或确保它们已经加入 PATH;如果没有,脚本启动时会自动下载。
  3. 双击 Start-Interactive-YTDLP.bat
  4. 启动后脚本会先运行 yt-dlp -U 自动检查并更新。
  5. 设置输出目录。
  6. 选择是否使用 Chrome cookies,默认是 Y
  7. 粘贴视频或直播链接。
  8. 在列出的格式中选择视频、音频、字幕和封装格式。

下载完成后文件会保存到启动时选择的输出目录,默认是 Output\

输出目录

启动后脚本会询问输出目录:

  • 直接回车或输入 1:使用默认 Output\
  • 输入 2:再输入自定义路径
  • 也可以直接粘贴路径

相对路径会按脚本所在目录解析,路径不存在时会自动创建。

浏览器扩展唤起

本工具附带 Chrome 和 Edge 扩展,可以从当前网页直接唤起本地下载脚本,并把当前站点相关 cookies 导出为 Netscape cookie 文件传给 yt-dlp。这样不需要 yt-dlp 直接复制浏览器 cookie 数据库,也能读取 HttpOnly cookie。

Chrome 安装

  1. 双击本目录下的 Register-Chrome-Bridge.bat
  2. 脚本会把 chrome-extension 文件夹路径复制到剪贴板。
  3. 手动打开 chrome://extensions
  4. 在 Chrome 扩展页开启右上角 Developer mode
  5. 点击 Load unpacked,选择本目录下的 chrome-extension 文件夹。
  6. 在扩展卡片上复制扩展 ID,粘贴回脚本窗口并回车。

也可以手动运行:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Install-Chrome-Bridge.ps1

Edge 安装

  1. 双击本目录下的 Register-Edge-Bridge.bat
  2. 脚本会把 edge-extension 文件夹路径复制到剪贴板。
  3. 手动打开 edge://extensions
  4. 在 Edge 扩展页开启左侧 Developer mode
  5. 点击 Load unpacked,选择本目录下的 edge-extension 文件夹。
  6. 在扩展卡片上复制扩展 ID,粘贴回脚本窗口并回车。

也可以手动运行:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Install-Edge-Bridge.ps1

使用方式

  • 点击 Chrome 或 Edge 工具栏里的 yt-dlp-win-script 扩展按钮。
  • 或在页面/链接/视频上右键,选择 Send to yt-dlp

扩展会把当前 URL 和 cookies 发给本地 Native Host。Native Host 会:

  • 保存 cookies 到 chrome-helper\cookies\chrome-cookies-*.txt
  • 打开一个新的 PowerShell 窗口
  • 自动把网页 URL 传给 interactive-yt-dlp.ps1
  • 自动使用刚导出的 cookie 文件

如果扩展提示无法连接 Native Host,通常是扩展 ID 没有注册,或扩展重新加载后 ID 变了。重新复制对应浏览器的扩展 ID,再双击对应的注册脚本即可。

如果以后移动了整个工具目录,也需要在新目录重新注册 Native Host 路径。例如移动到 D:\Tools\yt-dlp 后运行:

双击 D:\Tools\yt-dlp\Register-Chrome-Bridge.bat
双击 D:\Tools\yt-dlp\Register-Edge-Bridge.bat

建议整体移动目录,保持 yt-dlp.exeinteractive-yt-dlp.ps1chrome-helperchrome-extensionedge-extension 在同一个主目录里。

说明:浏览器对本地 unpacked 扩展有安全限制,普通脚本通常不能完全静默自动安装并拿到扩展 ID;这里的注册脚本会复制扩展文件夹路径,最后只需要手动加载扩展并粘贴一次 ID。

视频选择

脚本会读取 yt-dlp 的 JSON 元数据,并先找出每种视频编码自己的最高分辨率。列表只显示这些最高分辨率形成的可比较档位:如果某种编码最高只有 1080p,而另一种编码有 2160p,那么 2160p 会显示,同时 1080p 档位下其他编码也会显示。相同编码和相同分辨率下,不同 FPS、HDR/SDR 会分别列出;完全相同档位则保留码率最高的格式。

示例:

  1. av1        2160p   60fps HDR   12000.0 kbps id=701 ext=mp4  video-only
  2. av1        1080p   60fps SDR    3200.0 kbps id=399 ext=mp4  video-only
  3. av1        1080p   30fps HDR    3600.0 kbps id=699 ext=mp4  video-only
  4. avc/h264   1080p   30fps SDR    2800.0 kbps id=137 ext=mp4  video-only
  5. vp9        1080p   60fps SDR    3000.0 kbps id=248 ext=webm video-only

码率优先使用 yt-dlp 提供的 vbr / tbr,如果没有则用文件大小和时长估算。

音频选择

音频会按“编码 + 语言”分组,列出每组中码率最高的格式。

可以选择:

  • 单独音频流,例如 opusaac
  • 如果视频格式本身已经带音频,也可以选择 0 不额外合并音频

字幕

字幕支持多选:

  • 输入 1,3-5 选择多个字幕
  • 输入 all 选择全部字幕
  • 直接回车表示不下载字幕

脚本会做两件事:

  1. 保存一份源格式字幕副本。
  2. 主下载时尝试转换为 srt 并嵌入视频。

注意:MP4 对内嵌 SRT 的支持有限,ffmpeg/容器可能会转为 MP4 兼容字幕轨。如果你希望字幕封装更稳,推荐选择 mkv

封装格式

下载时可以选择:

  • 1mkv
  • 2mp4

直接回车默认选择 mkv。如果习惯输入文字,也仍然可以输入 mkvmp4

推荐:

  • 需要多字幕、保留更多轨道信息:选 mkv
  • 需要更广泛播放器兼容:选 mp4

Chrome cookies

脚本支持 --cookies-from-browser chrome,用于下载需要登录状态的视频。

如果出现:

ERROR: Could not copy Chrome cookie database

脚本会提示你关闭 Chrome 后重试。如果仍然失败,会自动改为不使用 Chrome cookies 继续读取元数据。

常见处理方式:

  • 完全退出 Chrome,包括后台进程。
  • 关闭正在使用同一 Chrome 用户配置的浏览器窗口。
  • 如果视频不需要登录,直接选择不用 cookies。

系统代理

脚本会读取 Windows 手动代理设置,并传给 yt-dlp 的 --proxy

如果系统没有启用手动代理,脚本会直接使用 yt-dlp 默认网络行为。

直播

如果 yt-dlp 元数据中的直播状态明确为 is_liveis_upcoming,脚本会询问是否使用:

--live-from-start

选择 Y 时,yt-dlp 会尝试从直播开始处下载。是否成功取决于网站是否提供回看/直播缓存。

如果直播还没开始,YouTube 可能会让元数据读取失败并提示类似:

This live event will begin in 17 hours.

脚本会识别这个提示,询问是否进入等待模式。进入等待前会提前选择封装格式、--live-from-start 和抗中断模式,所以到点后可以无人值守自动开下。注意 17 hours 这类时间只是粗略估计,不会被当作精确开播时间。选择 Y 后,脚本会显示倒计时并周期性重新读取元数据来校准:大于 6 小时每 1 小时检查一次,1 到 6 小时每 15 分钟检查一次,15 到 60 分钟每 5 分钟检查一次;离估计开播时间进入 15 分钟内时,会立即交给 yt-dlp 等待模式,并额外传入:

--wait-for-video 5-15

这样如果平台实际开播时间早于或晚于粗略提示,yt-dlp 会以 5-15 秒间隔继续等待并尽快开始。因为未开播直播通常拿不到格式列表,所以等待模式会自动选择最高码率的视频流和最高码率的音频流:

-f bestvideo+bestaudio/best --format-sort-force --format-sort vbr,abr,tbr

其中 vbr 优先选择最高视频码率,abr 优先选择最高音频码率,tbr 用于码率信息不完整时兜底。

检测到直播后,脚本还会询问是否开启抗中断模式,默认开启。开启后会追加这些保护:

  • --retries infinite
  • --fragment-retries 6,避免直播结束后的 404 分片无限重试
  • --file-access-retries infinite
  • --extractor-retries infinite
  • --retry-sleep 指数退避等待
  • --continue
  • --downloader dash,m3u8:native,强制 HLS/DASH 用 yt-dlp 原生下载器,避免 ffmpeg 在直播结束后一直轮询播放列表
  • --keep-fragments

如果 yt-dlp 在直播下载中异常退出,脚本会先重新读取一次元数据检查直播是否已经结束。若直播仍在进行,会立即自动重新启动同一个下载命令,最多重试 30 次;若直播已经结束,则停止重启,让已下载内容进入收尾/封装流程。

重要限制:这些措施可以尽量扛住短暂断网、分片超时、临时读取失败和 yt-dlp 异常退出,并避免直播结束后追着不存在的分片无限重试,但不能补回已经超出直播 DVR 窗口、平台已经移除、或从未成功下载到本机的片段。直播很重要时,不要删除 .part.ytdl.frag.ts 等临时文件;最终封装失败时,这些文件可能还能手动抢救。

常见问题

为什么没有列出某些格式?

脚本不是完整显示 yt-dlp -F 的所有格式,而是只显示各编码最高分辨率形成的可比较档位,并保留同分辨率下不同 FPS、HDR/SDR 的版本。低于这些档位的普通分辨率会被隐藏。

为什么码率显示 unknown?

有些网站不提供码率、大小或时长信息,脚本无法估算时会显示 unknown

为什么 MP4 嵌入字幕不符合预期?

MP4 容器对字幕格式限制较多。需要多语言字幕或更完整保留字幕轨时,优先使用 MKV。

为什么更新失败但脚本继续运行?

脚本启动时会尝试 yt-dlp -U,如果网络或权限导致更新失败,会显示警告并继续下载流程。

About

Windows interactive yt-dlp downloader script

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages