声明:除引用的Github项目文件外,其他内容编写为原创。搬运请注明原作者。
302是什么
GPT如是说
HTTP 302是HTTP协议中的一种状态码(Status Code),全称是HTTP 302 Found,表示请求的资源临时移动到了一个新的URL,即临时重定向。
当浏览器或其他客户端向服务器发送请求时,如果服务器返回一个302状态码,它会同时在响应头中提供一个Location字段,告知客户端资源现在可以在新的URL找到。客户端随后应该使用这个新的URL来重新发起请求。
这种重定向通常是临时的,意味着资源只是暂时可以在新的地址找到,未来还可能会返回到原来的地址。
在此教程中,利用Alist的获取115网盘直链的功能,也就是302跳转直链,来实现Emby播放时直连网盘地址,不走Emby所在网络上下行,减少了一次中转,达到外网高带宽看片的需求。
目前已测试以下客户端播放可以实现302跳转
- Emby客户端
- Infuse
- Fileball
- Vidhub
- Yamby
欢迎补充…
准备条件:
- 有空间及会员的115账号
- CD2(CloudDriver2),可以不需要会员。
- Alist
- Emby,可以选择自己喜欢的镜像版本,如emby/embyserver、linuxserver/emby、amilys/emby
阅读此篇教程,默认你已经学会
- Docker/Docker-Compose的相关配置使用
- 上述相关软件的基础配置使用
原理及使用容器介绍
此方案需使用到四个容器,Emby、CloudDriver2、Alist、Nginx。
-
Emby不必多说
-
CloudDriver2用于挂载115网盘到本地,使用起来比alist的webdav+rclone挂载方便。
-
Alist用于获取视频文件的115直链
-
Nginx用于劫持Emby的请求地址并从Alist获取115直链转发给客户端
相关容器的配置与日常使用无甚区别,只需要对相关路径的转换理解即可。
容器配置
Emby
version: '2.3'
services:
embyserver:
image: amilys/embyserver
container_name: emby
volumes:
- ./emby:/config
- /Movies:/movies:rslave
privileged: true
network_mode: bridge
ports:
- 8096:8096
restart: unless-stopped
据群友实测,Emby需要4.8及以上版本,低于4.8版本有可能不成功。
emby配置两个路径,一个是/config
,映射到你喜欢的路径即可。一个是/movies
,映射到宿主机的/Movies
,这个路径可以自己自定义,所有的影视文件都会在此路径内,没有什么特殊的,记住这个/movies
,一会要考。
CD2
version: '2.3'
cloudnas:
image: cloudnas/clouddrive2-unstable
container_name: clouddrive2
environment:
- TZ=Asia/Shanghai
- CLOUDDRIVE_HOME=/Config
volumes:
- /Movies:/CloudNAS:shared
- ./cd2:/Config
# - <other local shared path>:/media:shared
devices:
- /dev/fuse:/dev/fuse
restart: unless-stopped
pid: "host"
privileged: true
network_mode: bridge
ports:
- 19798:19798
cd2映射两个路径,/CloudNAS
为挂载路径,用于将云盘文件挂载到本地,同样映射到宿主机的/Movies
路径下,这个宿主机路径与Emby的必须一致,自行决定。
Alist
version: '2.3'
alist:
image: xhofe/alist:latest
container_name: alist
volumes:
- ./alist:/opt/alist/data
network_mode: bridge
ports:
- 5244:5244
environment:
- PUID=0
- PGID=0
- UMASK=022
restart: unless-stopped
Alist只需要映射配置文件的路径即可。
Nginx
version: '2.3'
nginx:
image: nginx:latest
container_name: nginx
network_mode: host
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/embyCache:/var/cache/nginx/emby
- ./nginx/logs:/var/log/nginx
restart: unless-stopped
nginx配置需要完全自定义,使用官方镜像即可,需要注意的是,容器的网络模式必须使用host。相关配置文件后文提供,nginx容器先不启动
。
详细配置
CD2
启动CD2容器后,添加自己的115账号。使用CD2的本地挂载功能,选择115根目录
,点击挂载到本地
,名称
填写115
,挂载点选择/CloudNAS
,保存即可挂载到/CloudNAS
路径下,也就是宿主机的/Movies
路径。如果你不知道怎么操作,自行查看CD2官方文档,学会了再来。
此时,在宿主机查看/Movies
目录,就可以查看到115上的文件了。
Alist
启动Alist容器,在添加存储里添加115网盘。挂载路径填写/115
,WEBDAV策略
选择302。从Alist文档中通过手机客户端扫码获取115token,填写到配置中的二维码令牌,下方的Qrcode源
选择一个自己不需要用到的源,如TV端,防止顶号失效。如果你的CD2是挂载的根目录的话,最下方的 根文件夹ID
为0不要修改,反之请自行修改,务必保持一致。
emby
配置完以上挂载之后,需要重启一次Emby容器,如果你的Emby已经提前启动了的话。
重启完成之后,在Emby中添加你的媒体库,此时可以看到,Emby的 /movies
目录下有你的115的影视文件了。如果你的文件不包含nfo文件的话,建议不要开启⬇️⬇️⬇️此开关,防止小文件上传过多被风控。以及关闭 将媒体图像保存到媒体文件夹中
开关。
Nginx
操作到这里,你需要自己明确一下Emby和Alist的对应文件路径。
两边对比一下同一个视频文件,可以看到,Emby中的路径应为/movies/115/影视/动漫/动画电影/铃芽之旅 (2022)/铃芽之旅 (2022) - 1080p H.264.mkv
,Alist中的同一个文件路径为/115/影视/动漫/动画电影/铃芽之旅 (2022)/铃芽之旅 (2022) - 1080p H.264.mkv
具体的网盘内路径以自己为准,但如果完全照抄以上配置的话,路径的开头
/movies/115
及/115
肯定是和我一致的。
此时Alist内的路径为Emby的路径的子集,即多出一个 /movies
开头。
接下来下载此压缩包,解压后得到一个nginx文件夹,其中有conf.d文件夹及nginx.conf文件,此为nginx相关配置文件。在此感谢bpking1/embyExternalUrl作者大大提供的配置及脚本。
需要自定义配置的有两个文件。
-
conf.d/constant.js
- embyHost: Emby的内网地址及端口
- embyMountPath: 填写上述的
/movies
,即Alist路径为Emby的子集剩余的部分。注意填写到此列表变量的元素中,即["/movies"]
。如果你的Emby文件路径与Alist完全一致,即剩余部分为空,那么此处填写[]
。 - embyApiKey: Emby的ApiKey,从Emby的web中获取。
- alistAddr: Alist的地址及端口。这里我使用的是Alist的外网地址,内网地址是否可用可自行探索。
- alistToken: Alist的Token令牌,在
Alist -> 管理 -> 设置 -> 其他 -> 令牌
获取,格式为alist-
开头
-
conf.d/emby.conf
第26行:listen 8091;
此为nginx监听的端口,修改为你想要的端口即可,用于替代原Emby的8096端口访问。访问此端口才能实现302转发。
修改完配置之后,将conf.d
及 nginx.conf
映射到nginx容器,在上述的nginx的docker-compose配置中已添加,注意存放的宿主机路径。启动nginx容器。
测试
此时启动Nginx容器后,访问 8091
端口,或是你在 emby.conf
文件中修改的端口,可以访问到Emby Web。即完成了第一步,nginx代理Emby Web成功。
使用各类客户端,如Emby官方客户端、Infuse、Fileball、Vidhub等登录8091端口,找一个刮削好的片子播放,或者web跳转第三方播放器potplayer、iina等,查看CD2的下载任务。如果没有大流量的对应文件下载,进程为 /system/EmbyServer
,即302转发成功。
目前Emby Web直接播放还无法实现302转发,也或许是我姿势不对。如果有成功使用Emby Web播放302直链的欢迎分享成果。
合并容器配置
使用Docker Compose可以方便地把多个有关联的容器进行合并配置,并且可以设置依赖的启动顺序,一键拉起所有容器。
version: '2.3'
services:
embyserver:
image: amilys/embyserver_arm64v8
container_name: emby
volumes:
- ./emby:/config
- /Movies:/movies:rslave
privileged: true
network_mode: bridge
ports:
- 8096:8096
restart: unless-stopped
depends_on:
- cloudnas
- alist
- nginx
cloudnas:
image: cloudnas/clouddrive2-unstable
container_name: clouddrive2
environment:
- TZ=Asia/Shanghai
- CLOUDDRIVE_HOME=/Config
volumes:
- /Movies:/CloudNAS:shared
- ./cd2:/Config
# - <other local shared path>:/media:shared
devices:
- /dev/fuse:/dev/fuse
restart: unless-stopped
pid: "host"
privileged: true
network_mode: bridge
ports:
- 19798:19798
alist:
image: xhofe/alist:latest
container_name: alist
volumes:
- ./alist:/opt/alist/data
network_mode: bridge
ports:
- 5244:5244
environment:
- PUID=0
- PGID=0
- UMASK=022
restart: unless-stopped
nginx:
image: nginx:latest
container_name: nginx
network_mode: host
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/embyCache:/var/cache/nginx/emby
- ./nginx/logs:/var/log/nginx
restart: unless-stopped