yt-dlp & Docker
容器化部署 yt-dlp 下载影音资源
在前一篇文章《基于 Navidrome 的个人音乐库》中分享了如何通过自托管的 Navidrome 来收听音乐。这次将记录如何利用 yt-dlp 下载 Youtube Music 音乐以填充乐库。
yt-dlp 是一款功能强大的命令行音视频下载工具,是已停更的
youtube-dlc的一个分支,支持数千个网站。
为什么选择 Docker? #
yt-dlp 功能强大,但其依赖(如 Python 环境、FFmpeg 组件等)的管理却相对麻烦。直接安装不仅可能与系统现有环境产生冲突,而且对于非高频使用者来说,维护这些依赖也显得有些多余。
容器化的优点:
- 环境隔离:
yt-dlp的所有依赖都封闭在容器内,与宿主系统完全隔离,杜绝任何环境冲突。 - 按需运行:每次下载时启动一个临时的下载容器,任务完成后容器即自动销毁。干净利落,不留任何后台进程。
- 轻松维护:更新
yt-dlp只需要一条命令拉取最新镜像即可,无需关心底层依赖。
通过 Docker Compose 编排容器 #
使用 Docker Compose 来定义和管理 yt-dlp 容器比直接使用 docker run 命令更清晰,也更便于配置。
-
创建项目目录: 首先,为
yt-dlp项目创建一个专属目录。mkdir -p ~/docker-projects/ytdlp cd ~/docker-projects/ytdlp -
创建
docker-compose.yml文件: 在该目录下,创建一个docker-compose.yml文件,并填入以下内容:services: ytdlp: # 使用社区打包好的 yt-dlp 镜像 image: jauderho/yt-dlp:latest container_name: ytdlp-downloader # 关键配置:容器运行结束后不重启,实现“用完即走” restart: "no" # 将宿主机的下载目录挂载到容器的工作目录 # 将 "~/Downloads/ytdl" 替换为你自己想要的路径 volumes: - ~/Downloads/ytdl:/workdir # 设置容器的工作目录 working_dir: /workdir # (可选) 配置代理,解决网络问题 # host.docker.internal 是指向宿主机的特殊 DNS 名称 environment: - HTTP_PROXY=http://host.docker.internal:7890 - HTTPS_PROXY=http://host.docker.internal:7890 - NO_PROXY=localhost,127.0.0.1Tips:
restart: "no": 这是实现“临时容器”的关键。它告诉 Docker,当容器内的命令执行完毕后,不要尝试重启它。volumes: 通过挂载卷,我们将宿主机的~/Downloads/ytdl目录映射到容器内的/workdir目录。这样,容器下载的文件会直接保存在你的电脑上,即使容器被销毁,文件也会保留。
设置快捷命令 #
直接使用 docker-compose run 命令太长了,我们可以通过设置 Shell 别名(alias)或函数(function)来简化操作。
打开你的 Shell 配置文件(通常是 ~/.zshrc 或 ~/.bashrc):
# 如果你使用 Zsh
open ~/.zshrc
# 如果你使用 Bash
open ~/.bashrc
在文件末尾添加以下内容。
方案一:通用别名 (Alias) #
这种方式最简单,相当于为原始的 docker-compose 命令创建了一个快捷方式。
# yt-dlp Docker 别名
# 将 `~/docker-projects/ytdlp/docker-compose.yml` 替换成你的实际路径
alias ytdlp='docker-compose -f ~/docker-projects/ytdlp/docker-compose.yml run --rm ytdlp'
- 用法:和直接使用
yt-dlp命令完全一样,后面可以跟任何yt-dlp支持的参数。 --rm: 这个标志会自动在容器运行结束后将其删除,保持系统干净。
方案二:定制化函数 (Function) #
函数比别名更强大、更灵活。我们可以预设好常用的下载参数,让下载音乐的操作变得更加简单。
# yt-dlp 下载MP3的专用函数
# 将 `~/docker-projects/ytdlp/docker-compose.yml` 替换成你的实际路径
function yt-mp3() {
docker-compose -f ~/docker-projects/ytdlp/docker-compose.yml run --rm ytdlp \
-o "%(title)s.%(ext)s" \
-x \
--audio-format mp3 \
--add-metadata \
--audio-quality 0 \
"$@"
}
函数参数解读:
-o "%(title)s.%(ext)s": 设置输出文件的命名格式为“视频标题.扩展名”。-x或--extract-audio: 提取音频。--audio-format mp3: 将音频转换为 MP3 格式。--add-metadata: 将视频元数据(如标题、作者)写入音频文件。--audio-quality 0: 设置最高音质(对于 MP3 来说是 VBR 0)。"$@": 这是一个关键部分,它会将你输入在yt-mp3命令后的所有参数(比如视频URL)都传递给yt-dlp。
最后,让配置生效(重新打开终端,或运行以下命令):
# 如果你使用 Zsh
source ~/.zshrc
# 如果你使用 Bash
source ~/.bashrc
现在,你可以像这样轻松下载音乐了:
# 使用别名
ytdlp -x --audio-format mp3 "$url"
# 或者直接使用更方便的函数
yt-mp3 "$url"
如何更新 yt-dlp? #
yt-dlp 的更新非常频繁,以支持更多网站并修复解析问题。因为我们使用了 Docker,只需一条命令即可拉取最新的镜像:
docker-compose -f ~/docker-projects/ytdlp/docker-compose.yml pull
这条命令会下载 jauderho/yt-dlp:latest 镜像的最新版本,下次运行时就会自动使用新版了。
All is well.