go-emby2alist
使用 Go 语言编写的网盘直链反向代理服务,为 Emby + Alist 组合提供更好的使用体验。
小白必看
网盘直链反向代理:
正常情况下,Emby 通过磁盘挂载的形式间接读取网盘资源,走的是服务器代理模式,看一个视频时数据链路是:
客户端 => Emby 源服务器 => 磁盘挂载服务 => Alist => 网盘
客户端 <= Emby 源服务器 <= 磁盘挂载服务(将视频数据加载到本地,再给 Emby 读取) <= Alist <= 网盘
这种情况有以下局限:
- 视频经过服务器中转,你看视频的最大加载速度就是服务器的上传带宽
- 如果服务器性能不行,能流畅播放 1080p 就谢天谢地了,更别说 4K
- ...
使用网盘直链反向代理后,数据链路:
客户端 => Emby 反代服务器 => Emby 源服务器 (请求 Emby Api 接口)
客户端 <= Emby 反代服务器 <= Emby 源服务器 (返回数据)
对于普通的 Api 接口,反代服务器将请求反代到源服务器,再将合适的结果进行缓存,返回给客户端
对于客户端来说,这一步和直连源服务器看不出差别
客户端 => Emby 反代服务器 => Alist => 网盘 (请求视频直链)
客户端 <= Emby 反代服务器 <= Alist <= 网盘 (返回视频直链,并给出重定向响应)
客户端 => 网盘(客户端拿着网盘的直链直接观看,此时已经没有服务器的事情了,故不会再消耗服务器流量)
这种方式的好处:
- 观看时加载速度拉满(前提是有网盘会员)
- 在客户端处解码,能不能看 4K 取决于你电视盒子的性能
使用前须知
-
本项目初衷: 易用轻巧、小白友好、高度适配阿里云盘 (如果你使用本项目观看其他网盘时出现问题,也欢迎到 issue 区反馈,我会尽量适配它)
-
如果你有更复杂的需求, 推荐使用功能更完善的反向代理服务
功能
已测试并支持的客户端
客户端 |
已知问题 |
Emby Web (4.8.8.0) |
基本操作正常,转码资源可挂载原画字幕,但无法挂载转码字幕 |
Emby for macOS ,Emby for iOS |
基本操作正常,由于本人没这两个客户端的高级版,无法测试播放功能 |
Emby for Android (3.3.76) |
使用安卓 TV 测试,完美兼容直链、转码资源播放和字幕挂载 |
Emby for AndroidTV (2.0.95g) |
基本操作正常,使用自带播放器播放原画时无法频繁跳进度,会被限制,但可以通过播放转码直链解决,但转码直链无法挂载字幕 |
Fileball |
完美兼容直链、转码资源播放和字幕挂载 |
Infuse |
基本操作正常,但只支持播放原画直链(在设置中将缓存方式设置为不缓存 可有效防止频繁请求) |
VidHub |
截至 1.0.7 版本,所有功能可用 (我是没试用次数了,以后不会再测试这个客户端) |
音流 StreamMusic |
直连模式正常可用 |
使用说明
-
已有自己的 Emby、Alist 服务器
-
Emby 的媒体库路径(本地磁盘路径)是和 Alist 挂载路径能够对应上的
这一步前缀对应不上没关系,可以在配置中配置前缀映射 path.emby2alist
解决
-
需要有一个中间服务,将网盘的文件数据挂载到系统本地磁盘上,才能被 Emby 读取到
目前我知道的比较好用的服务有两个:rclone 和 CloudDrive2(简称 cd2)
如果你的网盘跟我一样是阿里云盘,推荐使用 cd2 直接连接阿里云盘,然后根路径和 Alist 保持即可
在 cd2 中,找到一个 最大缓存大小
的配置,推荐将其设为一个极小值(我是 1MB),这样在刮削的时候就不会消耗太多三方权益包的流量
⚠️ 不推荐中间服务直接去连接 Alist 的 WebDav 服务,如果 Alist Token 刷新失败或者是请求频繁被暂时屏蔽,会导致系统本地的挂载路径丢失,Emby 就会认为资源被删除了,然后元数据就丢了,再重新挂载回来后就需要重新刮削了。
-
服务器有安装 Docker
网上有很多 Docker 安装教程,这里我不细说
不过在国内,很多镜像服务器都不能正常使用了
这里推荐一个好用的镜像加速源
由于加速源作者服务器压力太大,我就不再这再推荐了
-
Git
非必须,如果你想体验测试版,就需要通过 Git 拉取远程源码构建
正式版可以直接使用现成的 Docker 镜像
使用 DockerCompose 部署安装
通过源码构建
- 获取代码
git clone --branch v1.2.1 --depth 1 https://ghproxy.cc/https://github.com/AmbitiousJun/go-emby2alist
cd go-emby2alist
- 拷贝配置
cp config-example.yml config.yml
- 根据自己的服务器配置好
config.yml
文件
关于路径映射的配置示例图:
- 编译并运行容器
docker-compose up -d --build
-
浏览器访问服务器 ip + 端口 8095
,开始使用
如需要自定义端口,在第四步编译之前,修改 docker-compose.yml
文件中的 8095:8095
为 [自定义端口]:8095
即可
-
日志查看
docker logs -f go-emby2alist -n 1000
- 修改配置的时候需要重新启动容器
docker-compose down
# 修改 config.yml ...
docker-compose up -d
- 版本更新
# 获取到最新代码后, 可以检查一下 config-example.yml 是否有新增配置
# 及时同步自己的 config.yml 才能用上新功能
# 更新到正式版
docker-compose down
git fetch --tag
git checkout <版本号>
git pull
docker-compose up -d --build
# 更新到测试版 (仅尝鲜, 不稳定)
docker-compose down
git checkout main
git pull origin main
docker-compose up -d --build
- 清除过时的 Docker 镜像
docker image prune -f
使用现有镜像
- 准备配置
参考示例配置,配置好自己的服务器信息,保存并命名为 config.yml
- 创建 docker-compose 文件
在配置相同目录下,创建 docker-compose.yml
粘贴以下代码:
version: "3.1"
services:
go-emby2alist:
image: ambitiousjun/go-emby2alist:v1.2.1
environment:
- TZ=Asia/Shanghai
- GIN_MODE=release
container_name: go-emby2alist
volumes:
- ./config.yml:/app/config.yml
- ./ssl:/app/ssl
ports:
- 8095:8095 # http
- 8094:8094 # https
- 运行容器
docker-compose up -d --build
关于 ssl
使用方式:
- 将证书和私钥放到程序根目录下的
ssl
目录中
- 再将两个文件的文件名分别配置到
config.yml
中
特别说明:
在容器内部,已经将 https 端口写死为 8094
,将 http 端口写死为 8095
如果需要自定义端口,仍然是在 docker-compose.yml
中将宿主机的端口映射到这两个端口上即可
已知问题:
可能有部分客户端会出现首次用 https 成功连上了,下次再打开客户端时,就自动变回到 http 连接,目前不太清楚具体的原因
关于 Emby 的 api_key
近期发现在 Emby 控制台中生成的 api_key 并不是所有接口都能正常访问
如果你在 go-emby2alist
的日志中看到以下报错,则需要通过浏览器抓包的方式重新获取 api_key:
Object reference not set to an instance of an object.
获取步骤:
- 浏览器访问你的 Emby 首页(登录好管理员账号)
- 打开浏览器的控制台,并切换到 “网络” 选项卡
- 在过滤条件中输入
api_key=
- 不关闭控制台,刷新一下浏览器页面,就可以看到一个携带了 api_key 的 info 请求,将这个 api_key 配置到
config.yml
中即可
附上抓包截图:
开发计划
-
✅ 已通过本地代理并重定向 ts 解决 m3u8 直链过期问题
-
-
电视直播直链反代(实现真直链反代,不需要经过 emby 内部对源地址可用性的校验)
❌ 试了一下之前的想法,发现想多了,遂放弃
-
-
❌ 现阶段无法阻止播放带字幕资源时,Emby 调用 FFmpeg 去提取字幕导致的服务器流量消耗问题
尝试调研过手动利用 FFmpeg 将 Alist 直链字幕直接提取出来,但发现无论怎样 FFmpeg 都必须将整个视频下载到本地才能输出完整的字幕文件 😌
遂放弃
-
... (如果有什么更好的想法,欢迎 issue 区留言)
请我喝杯 9.9💰 的 Luckin Coffee☕️
Star History