Emby+115的网盘直链方案,外网看片不再受限上传带宽

Emby+115的网盘直链方案,外网看片不再受限上传带宽

黑田奈奈子 21,216 2024-04-15

声明:除引用的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

欢迎补充…

准备条件:

阅读此篇教程,默认你已经学会

  • 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官方文档,学会了再来。

1.png
2.png

此时,在宿主机查看/Movies目录,就可以查看到115上的文件了。

Alist

启动Alist容器,在添加存储里添加115网盘。挂载路径填写/115WEBDAV策略选择302。从Alist文档中通过手机客户端扫码获取115token,填写到配置中的二维码令牌,下方的Qrcode源选择一个自己不需要用到的源,如TV端,防止顶号失效。如果你的CD2是挂载的根目录的话,最下方的 根文件夹ID 为0不要修改,反之请自行修改,务必保持一致。

3.png

emby

配置完以上挂载之后,需要重启一次Emby容器,如果你的Emby已经提前启动了的话。

重启完成之后,在Emby中添加你的媒体库,此时可以看到,Emby的 /movies 目录下有你的115的影视文件了。如果你的文件不包含nfo文件的话,建议不要开启⬇️⬇️⬇️此开关,防止小文件上传过多被风控。以及关闭 将媒体图像保存到媒体文件夹中 开关。

4.png

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
    5.png

    • 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
    6.png
    第26行: listen 8091;
    此为nginx监听的端口,修改为你想要的端口即可,用于替代原Emby的8096端口访问。访问此端口才能实现302转发。

修改完配置之后,将conf.dnginx.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