Cane's Blog

Cane

【Nas】115 + alist + cd2 实现 emby 直链播放 & 加速扫库版

3640
2024-03-16

流程图 & 原理介绍

之前的原理图,可以看到直链播放的时候, web -> nginx -> alist ->115 是实际播放路径,webdav -> rclone -> file -> emby 是不走的,这条路径的起到的作用仅仅是给 emby 读取文件用的。

简单点来说,emby上面的所有视频文件的播放链接会被 nginx 动态修改为 alist 302 的 115 直链。

但是为了让 emby 中有视频文件,你得给 emby 添加影视库,但是 emby 添加影视库需要「文件」, alist 本身没办法把网盘文件挂载到本地硬盘,所以需要通过 rclone 将网盘文件挂载到本地硬盘。

也就是说,除了 rclone,只要能有工具将网盘文件挂载到本地,让 emby 顺利加载「影视库」,都是不影响最终的直链播放效果的。

理论上来讲,你搞一堆虚假的文件,重命名为视频文件,只要目录结构和名称和网盘一致,骗过 emby 能够顺利入库的方案都是可以的。

115.png

采用 cd2 的原因是因为,cd2 挂载的效果比 rclone 要好,能够显著的加速 emby 入库时间,新版本的入库流程如下。

之前写博文画图的时候有意识到可以换成 cd2, 但是感觉没啥意义,后来部分朋友采用 cd2 发现扫库很快

经验证 alist -> webdav -> cd2 -> file 依然很慢,所以具体的瓶颈是出在了 alist -> webdav,或者 webdav 协议本身的限制

如果是 rclone 原生支持的网盘,比如 google drive 个人感觉应该不会和 cd2 有扫库速度上的明显差异,除非 rclone 在设计上和 cd2 有明显的差距(个人倾向于不会,毕竟都是比较成熟的网盘挂载工具,感兴趣的朋友可以验证一下)

关于 alist -> webdav 慢的部分,究竟是 alist 的设计问题,还是 webdav 协议本身的限制,笔者也没有过多探究,如果有了解的朋友,还望不吝赐教一下,谢谢

cd2.png

安装

以下大部分流程与之前是一致的,但是为了照顾一些第一次看到本教程的玩友,还是照抄一遍吧。

测试服务器: 阿里云服务器

测试环境: 纯 docker

建议跟着我的步骤来,打开一个记事本,记录所有教程中要求记下的值(我会以红色标记)

安装 alist

docker run -d --restart=always -v /home/alist:/opt/alist/data -p 5244:5244 -e PUID=0 -e PGID=0 -e LMASK=022 --name=alist xhofe/alist:latest

设置密码

docker exec -it alist ./alist admin set password

记录 alist 帐号密码,示例: admin, password

访问 http://外网ip:5244, 登录管理后台,添加 115 网盘,按需配置,对配置项不太理解的朋友建议直接抄我的

记录: alist 外网地址,示例: http://119.119.119.119
115网盘.png
记录 alist token 值,示例: alist-56aed914-dc75-4exxxxx

记录 alist 内网 IP 地址,示例: 172.17.0.2

安装 clouddrive2

为了照顾之前采用 rclone 的用户无缝迁移到 cd2 版本,我对路径做了匹配,之前已经刮削过的数据也不受影响

如果你之前用了我上个 rclone 版本的教程,或者对一些底层原理和命令不是很熟悉,建议完全按照我的步骤和配置来

mkdir -p /mnt/alist && chmod -R 777 /mnt/alist && docker run -d -p 19798:19798 --name cd2 -v /mnt/:/CloudNAS:shared -v /home/cd2:/Config --device /dev/fuse:/dev/fuse --privileged --env CLOUDDRIVE_HOME=/Config --restart unless-stopped cloudnas/clouddrive2

安装成功后,打开 http://119.119.119.119:19798 进入后台地址,登录 cd2,扫码添加硬盘。

cd2添加硬盘.png

扫码添加完毕后,你的 cd2 根目录会出现一个网盘(名称随意),双击进入 网盘根路径,点击左上角挂载按钮

挂载.png

选择挂载路径(这里十分关键跟后面的 constant.js 中的路径直接相关,如果不一致会导致直链播放失败,建议按照我的配置来

选择挂载路径.png

选择好 alist 文件夹,点击确定后,会显示如下路径,建议修改权限为 777。挂载路径配置.png

点击挂载后,查看挂载是否成功,若「失败原因」处显示空白,则证明一切正常。
检查挂载是否成功.png

安装 embyserver

# 如果你只想通过 nginx 反代后的访问可以不开端口
docker run -d --restart=always --name emby -p 8096:8096 -e TZ=Asia/Shanghai -e PUID=0 -e PGID=0 -v /home/emby:/config --volume /mnt/alist:/mnt/alist:shared emby/embyserver:latest

记录 embyserver 的内网地址,示例: 172.17.0.3

docker inspect --format="{{.NetworkSettings.Networks.bridge.IPAddress}}" emby

创建 & 记录 embyserver 的 APIKEY,示例: a159ebxxxxxx

访问 http://外网ip:8096, 初始化 emby,生成并记录 embyserver 的 API KEY

embyserver.png其他配置

关闭转码等

转码.png

安装 nginx

如果你用的是 arm 架构的系统,将 docker 镜像换成这个

registry.cn-shenzhen.aliyuncs.com/hicane/emby-nginx-arm64:latest

生成配置文件

mkdir -p /home/nginx && docker run -d --name nginx registry.cn-shenzhen.aliyuncs.com/hicane/emby-nginx:latest && docker cp nginx:/etc/nginx/conf.d/constant.js /home/nginx/constant.js && docker stop nginx && docker rm nginx

修改配置

/home/nginx 目录下,有一个 constant.js 文件,按需修改

nginx配置.png创建 & 运行容器

docker run -d -p 8097:80 --name nginx -v /home/nginx/constant.js:/etc/nginx/conf.d/constant.js -v /home/nginx/embyCache:/var/cache/nginx/emby registry.cn-shenzhen.aliyuncs.com/hicane/emby-nginx:latest

播放

网页版

我这里网页版一直播放不成功,不过 nginx 脚本作者说可以通过安装 modify header 解决跨域问题来播放

[
    {
        "alwaysOn":true,
        "respHeaders":[
            {
                "enabled":true,
                "name":"Access-Control-Allow-Origin",
                "value":"*"
            }
        ],
        "shortTitle":"1",
        "title":"CORS Support",
        "urlFilters":[
            {
                "enabled":true,
                "urlRegex":"*.115.com"
            }
        ],
        "version":2
    }
]

亲测无效,不知是哪里出了问题,有需要的可以测试一下

modify header1.pngmodify header2.pngmodify header3.png

客户端

需要注意的是,要连接的是 nginx 的端口号,而不是 embyserver 的端口号

client.png

经测试,客户端是走的 115 直链,播放速度可达最大带宽(我的测试服务器带宽只有 5Mbps)

测试效果.png

补充

关于家庭影音的构建,从设备选择,网络部署,到影视库的搭建,海报墙的管理,一路折腾下来,有一些小小的自己的心得体会,如果有感兴趣的朋友,不妨留言,有时间写几篇博文跟大伙分享探讨一下。