基于Docker搭建全链路媒体库:从PT下载到Emby播放的完美方案

最近折腾了一套基于Docker的媒体库方案,没想到效果出奇的好。整个流程从PT下载到最终在Emby中播放,实现了全链路自动化,省去了大量手动整理的时间。今天就把我踩过的坑和最终的实现方案分享给大家。

媒体库自动化架构流程图

Docker媒体库自动化架构示意图

整体架构思路

这套方案的核心思路是:下载 -> 整理 -> 刮削 -> 播放 的全流程自动化。每个环节用一个专门的Docker容器来处理,通过共享卷的方式无缝衔接。

关键组件介绍

  1. qBittorrent:负责PT下载
  2. rclone:挂载网盘并生成STRM文件
  3. FileBot/Sonarr/Radarr:自动重命名和整理
  4. Jellyfin/Emby:媒体服务器

具体实现步骤

1. 准备工作

首先确保你的服务器已经安装好Docker和Docker Compose。创建一个统一的工作目录,比如 /data/media,并在下面创建必要的子文件夹:

  • /data/media/downloads:下载目录
  • /data/media/movies:电影目录
  • /data/media/tv:电视剧目录
  • /data/media/config:配置文件目录

2. PT下载配置

使用 linuxserver/qbittorrent 镜像:

qbittorrent:
  image: linuxserver/qbittorrent
  container_name: qbittorrent
  environment:
    - PUID=1000
    - PGID=1000
    - TZ=Asia/Shanghai
  volumes:
    - /data/media/config/qbittorrent:/config
    - /data/media/downloads:/downloads
  ports:
    - 8080:8080
    - 6881:6881
    - 6881:6881/udp
  restart: unless-stopped

3. 文件整理自动化

方案A:使用FileBot

FileBot是最传统的重命名工具,但需要许可证。我更喜欢用它来做最终的文件整理:

filebot:
  image: jlesage/filebot
  container_name: filebot
  volumes:
    - /data/media/downloads:/data
    - /data/media/movies:/output/movies
    - /data/media/tv:/output/tv
  environment:
    - TZ=Asia/Shanghai
  restart: unless-stopped

方案B:使用Sonarr/Radarr

这是更现代的解决方案,特别适合追剧用户:

radarr:
  image: linuxserver/radarr
  container_name: radarr
  environment:
    - PUID=1000
    - PGID=1000
    - TZ=Asia/Shanghai
  volumes:
    - /data/media/config/radarr:/config
    - /data/media/movies:/movies
    - /data/media/downloads:/downloads
  ports:
    - 7878:7878
  restart: unless-stopped

4. 网盘STRM方案

这是整套方案的精髓所在。通过生成STRM文件,我们可以让Emby直接播放云端存储的媒体文件,而无需将大文件同步到本地。

安装rclone

curl https://rclone.org/install.sh | sudo bash

挂载网盘

Emby媒体服务器界面

Emby媒体服务器播放界面示意图

rclone mount gdrive: /data/media/cloud \
  --allow-other \
  --buffer-size 32M \
  --vfs-read-ahead 2G \
  --daemon

生成STRM文件

我可以写个简单的脚本自动生成STRM文件:

#!/bin/bash

find /data/media/movies -type f \( -name "*.mkv" -o -name "*.mp4" \) | while read file; do
  dir=$(dirname "$file")
  base=$(basename "$file")
  strm="${base%.*}.strm"
  echo "http://your-server:8080/media/$(basename "$dir")/$base" > "$dir/$strm"
done

5. Emby路径配置

这是很多人容易出错的地方。务必确保:

  1. Emby容器的挂载路径与实际情况一致
  2. 使用STRM时,路径要是网络可访问的
  3. 刮削器要能正确识别文件名
emby:
  image: linuxserver/emby
  container_name: emby
  environment:
    - PUID=1000
    - PGID=1000
    - TZ=Asia/Shanghai
  volumes:
    - /data/media/config/emby:/config
    - /data/media/movies:/movies
    - /data/media/tv:/tvshows
  ports:
    - 8096:8096
  restart: unless-stopped

常见问题解决

  1. 字幕无法自动加载:确保字幕文件与视频在同一目录且命名一致

  2. STRM文件无法播放:检查URL是否正确,Emby是否能直接访问该地址

  3. 刮削失败:检查文件名是否符合命名规范,可考虑手动刮削

进阶优化建议

  1. 配置自动删除已看视频的源文件(需谨慎)
  2. 添加自动字幕下载服务如bazarr
  3. 设置定期备份Emby数据库
  4. 使用Nginx反代理提升访问速度

结语

这套方案虽然前期配置稍显复杂,但一旦跑通,后续基本可以实现"躺平"式观影。特别是STRM结合网盘的方案,完美解决了存储空间不足的问题。

如果有任何问题,欢迎在评论区讨论,我会尽力解答。

标签: none

评论已关闭