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.1
Tips:
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.