yt-dlp TUI
一个给 yt-dlp 做的终端用户界面。
yt-dlp 是一个强大的视频下载工具,但日常使用时经常会遇到一串琐碎操作:先记命令参数,查格式 ID,判断视频和音频是否需要合并,下载播放列表前还要想清楚哪些条目要保留。yt-dlp TUI 把这些步骤收进一个 Textual 界面里,让下载前的检查、选择和执行过程都更直观。

下载前先看清楚
在 Start 页面粘贴 URL 后,应用会先解析视频或播放列表信息。单个视频可以查看可用格式,并从 yt-dlp 返回的格式 ID 中选择需要的版本。遇到播放列表时,则可以先展开条目,勾选真正想下载的内容,再加入队列。
这一步很重要。很多下载任务并不是“把全部内容抓下来”这么简单,尤其是课程、合集、直播回放或包含重复条目的列表。先预览再入队,能减少下载后的清理成本。
处理视频和音频合并
很多站点会把高分辨率视频和音频分成不同流。直接选择一个纯视频格式时,如果没有额外处理,下载下来的文件可能没有声音。
yt-dlp TUI 会在适用时自动把纯视频格式组合成 FORMAT_ID+bestaudio/best,再交给 FFmpeg 合并。用户仍然可以选择格式,但不用每次都手写组合参数。
这个设计保留了 yt-dlp 的灵活性,也降低了常见错误的概率。
下载进度和日志
下载中的任务会集中显示在 Downloading 页面。界面里有文本进度条、速度、ETA,以及实时的 yt-dlp 原始输出。

我觉得保留原始输出是一个很实用的选择。TUI 可以让常规状态更容易扫一眼看懂,但遇到限速、解析失败、格式不可用或网络问题时,yt-dlp 自己的输出仍然是最可靠的诊断信息。
每个任务的日志也会写入应用的用户数据目录。完成、失败和中断任务会保存在每用户 JSON 历史记录里,之后可以打开已下载文件、在文件管理器中定位文件,或者复制文件路径。
中断后继续
下载任务很容易被网络、终端关闭或机器重启打断。
yt-dlp TUI 会记录中断任务,并在重启后把它们标记为失败。用户可以从 Completed 页面继续下载,底层使用的是 yt-dlp 的 --continue 能力。
这里的处理方式比较朴素,但符合工具直觉:不假装中断任务仍在运行,也不丢掉它们,而是把恢复入口留在历史记录里。
独立管理下载引擎
项目还把 yt-dlp 和 FFmpeg 的安装、更新放进了设置流程。
用户可以在应用里从 GitHub 安装 yt-dlp,并选择 stable 或 nightly 渠道。应用会在后台检查更新,发现新版本后提示处理。Windows 上还支持从 GitHub 安装 FFmpeg,用于自动合并分离的视频和音频流。
这让 TUI 应用和下载引擎保持相对独立:界面本身可以通过 PyPI 安装,而 yt-dlp 与 FFmpeg 可以按自己的节奏更新。
代理支持
下载工具绕不开网络环境问题。
yt-dlp TUI 支持配置可选的 HTTP(S) 代理,并把它用于引擎安装、更新检查、元数据解析和实际下载。这样代理配置不需要散落在命令行参数里,也不必每次手动输入。
技术栈
项目结构以 Python 终端应用为主:
- 语言:Python 3.11+
- TUI 框架:Textual
- 下载引擎:yt-dlp
- 媒体合并:FFmpeg
- 包管理与开发:uv
- 测试与检查:pytest、ruff
- 数据记录:每用户 JSON 历史记录与任务日志
当前以 Windows 作为主要支持平台;FFmpeg 自动安装目前面向 Windows x64。
适合场景
我觉得它适合这些场景:
- 经常使用
yt-dlp,但不想每次都手写完整命令 - 下载前需要查看格式 ID、分辨率和可用流
- 只想下载播放列表里的部分条目
- 希望在终端里集中查看进度、速度、ETA 和原始日志
- 希望独立安装和更新
yt-dlp、FFmpeg - 需要在下载和解析时统一配置 HTTP(S) 代理
和所有下载工具一样,它应该只用于你有权保存的内容。项目本身也明确说明:它与 yt-dlp 项目没有关联。
安装
推荐用 uvx 直接运行最新发布版本:
uvx yt-dlp-tui
也可以从 PyPI 安装:
pip install yt-dlp-tui
yt-dlp-tui
从源码运行:
git clone https://github.com/z4none/yt-dlp-tui.git
cd yt-dlp-tui
uv sync --all-groups
uv run yt-dlp-tui
本地开发检查:
uv sync --all-groups
uv run ruff check .
uv run pytest -q