基于 PVE 的折腾之路(4)之 影音库云盘自动化

/ 5 Comments / 2736 View

前言

前文【基于 PVE 的折腾之路(3)之 影音库自动化】实现了本地自动化追剧。但现在阿里云盘的热门以及搭配各种项目也能实现自动化转存追剧,并且通过 nginx 的 njs 模块将 emby 视频播放地址劫持到 alist 直链。

本文需要在群晖 Docker 安装 emby 、alist、aliyundrive-subscribe、nginx、rclone

完成后基本流程:电视剧有更新 -> aliyundrive-subscribe 自动转存到指定目录 -> 通知 emby 有新视频 -> emby 刮削 -> emby 通过 nginx 直接播放阿里云盘上的视频。

为什么改用 Emby?

之前一直都是用 jellyfin,因为开源免费。但不知为何对于现在的 4k 视频很多无法正常播放,都强制服务端转码。一开始以为是电视型号太旧不支持解码,所以以前下载视频都只能找特定编码的。

偶然一次心血来潮换成 emby 测试一下,竟然除了音频是 TrueHD 7.1 或 Dolby Atmos 7.1 会导致服务器转码,其他 4K HEVC HDR10 或 4K HEVC HDR10+ 都播放很流畅,所以就改用 emby 做服务端。

1、安装 emby

docker run -d \
    --name emby \
    -e PUID=1026 \
    -e PGID=100 \
    -e TZ=Asia/Shanghai \
    -p 8096:8096 \
    -v /volume1/docker/emby:/config \
    -v /volume1/video:/video \
    --restart unless-stopped \
lovechen/embyserver:latest

2、安装 alist (alist 配置教程请看 wiki)

docker run -d \
    --name=alist \
    --restart=unless-stopped \
    -e PUID=1026 \
    -e PGID=100 \
    -e UMASK=022 \
    -p 5244:5244 \
    -v /volume1/video:/video \
    -v /volume1/docker/alist:/opt/alist/data \
xhofe/alist:latest

3、安装 aliyundrive-subscribe

docker run -d \
    --restart=unless-stopped \
    --name=subscribe \
    -e PUID=1026 \
    -e PGID=100 \
    -e TZ=Asia/Shanghai \
    -p 19035:19035 \
    -v /volume1/docker/subscribe:/app/conf \
looby/aliyundrive-subscribe:latest

4、安装 nginx (映射文件请在 Wiki 中提前下载)

docker run -d \
    --name=nginx \
    -e PUID=1026 \
    -e PGID=100 \
    -e TZ=Asia/Shanghai \
    -p 8095:80 \
    -v /volume1/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
    -v /volume1/docker/nginx/conf.d:/etc/nginx/conf.d \
    -v /volume1/docker/nginx/cache:/var/cache/nginx/emby \
nginx:alpine

配置 alist

默认用户名admin,密码需要在 控制台日志查看,通过群晖 IP:5244 端口登录进入后台,找到存储这里,点击添加

2023-08-04T00:35:45.png

选择阿里云盘Open

2023-08-04T00:36:29.png

主要配置挂载路径,即在 NAS 本地的路径;还有刷新令牌。

具体配置教程可以看 Wiki

配置 aliyundrive-subscribe

通过群晖 IP:8002 端口登录 subscribe,/volume1/docker/subscribe/config/app.ini 设置好账号密码以及阿里云盘的 token。

2023-08-04T00:36:44.png

具体配置教程可以看 Wiki

2023-08-04T00:36:51.png

roclone 挂载 alist 到本地

通过 ssh 登录到群晖,获取 root

# 安装 rclone
curl https://rclone.org/install.sh | sudo bash
# 创建 rclone 配置文件文件夹
mkdir /volume1/docker/rclone

# 创建 rclone 配置文件,注意用户名和密码,建议 alist 创建一个只读的用户用于挂载用途
cat <<EOF >> /volume1/docker/rclone/rclone.conf
[aliyunpan]
type = webdav
url = http://10.0.0.5:5244/dav
vendor = other
user = admin
pass = Hg8GURjFFspmY0UJKImq5NnzhpW5
EOF
# 创建 rclone 挂载文件,注意修改下面挂载参数
cat <<EOF >> /volume1/docker/rclone/rcloned
#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
NAME_BIN="rclone"

NAME="aliyunpan" #和上面的 rclone 文件一致
REMOTE=''  #远程文件夹,网盘里的挂载的一个文件夹,留空为整个网盘
LOCAL='/volume1/video/aliyunpan'  #挂载地址,VPS本地挂载目录
LOG="/volume1/docker/rclone/log.txt"

Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m"
Info="${Green_font_prefix}[信息]${Font_color_suffix}"
Error="${Red_font_prefix}[错误]${Font_color_suffix}"
RETVAL=0

check_running(){
    PID="$(ps -C $NAME_BIN -o pid= |head -n1 |grep -o '[0-9]\{1,\}')"
    if [[ ! -z ${PID} ]]; then
        return 0
    else
        return 1
    fi
}
do_start(){
    check_running
    if [[ $? -eq 0 ]]; then
        echo -e "${Info} $NAME_BIN (PID ${PID}) 正在运行..." && exit 0
    else
        fusermount -zuq $LOCAL >/dev/null 2>&1
        mkdir -p $LOCAL
        mkdir -p ${LOG%/*}
        sudo /usr/bin/rclone mount --config /volume1/docker/rclone/rclone.conf $NAME:$REMOTE $LOCAL --umask 000 --default-permissions --allow-non-empty --allow-other --buffer-size 32M --vfs-read-chunk-size 64M --vfs-read-chunk-size-limit 1G > "${LOG}" 2>&1 &
        sleep 2s
        check_running
        if [[ $? -eq 0 ]]; then
            echo -e "${Info} $NAME_BIN 启动成功 !"
        else
            echo -e "${Error} $NAME_BIN 启动失败 !"
        fi
    fi
}
do_stop(){
    check_running
    if [[ $? -eq 0 ]]; then
        kill -9 ${PID}
        RETVAL=$?
        if [[ $RETVAL -eq 0 ]]; then
            echo -e "${Info} $NAME_BIN 停止成功 !"
        else
            echo -e "${Error} $NAME_BIN 停止失败 !"
        fi
    else
        echo -e "${Info} $NAME_BIN 未运行"
        RETVAL=1
    fi
    fusermount -zuq $LOCAL >/dev/null 2>&1
}
do_status(){
    check_running
    if [[ $? -eq 0 ]]; then
        echo -e "${Info} $NAME_BIN (PID $(echo ${PID})) 正在运行..."
    else
        echo -e "${Info} $NAME_BIN 未运行 !"
        RETVAL=1
    fi
}
do_restart(){
    do_stop
    sleep 2s
    do_start
}
case "$1" in
    start|stop|restart|status)
    do_$1
    ;;
    *)
    echo "使用方法: $0 { start | stop | restart | status }"
    RETVAL=1
    ;;
esac
exit $RETVAL
EOF

最后运行 rclone 挂载到本地

# 使用方法: { start | stop | restart | status }
bash /volume1/docker/rclone/rcloned strat

配置 nginx

主要还是配置 emby.js

const embyHost = 'http://172.17.0.1:8096'; //默认emby的地址是宿主机ip
const embyMountPath = '/video';  // rclone 的挂载目录, 例如将阿里云盘挂载到/volume1目录下:  /volume1/video/aliyun,就填写 /video
const alistToken = 'alist-1c14e05d-b222-4307-9db7····'; //alist token, 在alist后台查看
const alistAddr= 'http://172.17.0.1:5244'; //访问宿主机上5244端口的alist地址
const embyApiKey = 'ab5bbc1f4233saedg2252e95fb53cbc4';  //emb api key, 在后台设置
const alistPublicAddr = 'http://10.0.0.5:5244'; // alist公网地址

具体配置教程可以看 Wiki

总结

至此,可以访问群晖IP:8095 端口访问 emby 服务,emby 媒体库也和添加普通本地文件一样步骤,刮削的文件和图片建议放本地,不要放到媒体所在文件夹,以免访问 api 过于频繁。播放速度也不再受制于家里宽带的上传速度,直接在客户端播放阿里云盘上的视频。

结合上篇本地自动化和本文云盘自动化,总存储空间达到了 42 T 左右,不过收藏的还是建议存储在本地,云盘上的只用于追剧,免得哪天又倒闭了。

2023-08-04T00:37:07.png

已有 5 条评论
  1. 求这个教程镜像分享

    回复
    1. @ccbbp

      文章内都有具体镜像说明了的

      回复
  2. 追剧很有用~

    回复
  3. 折腾帝啊,以前我以爱折腾,现场是怎么简单怎么来~

    回复
    1. @山野愚人居

      其实也就是让自己追剧更轻松点,毕竟经常人和服务器不在同一个区域。

      回复
发表新评论