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 命令更清晰,也更便于配置。

  1. 创建项目目录: 首先,为 yt-dlp 项目创建一个专属目录。

    mkdir -p ~/docker-projects/ytdlp
    cd ~/docker-projects/ytdlp
    
  2. 创建 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.