
Go 语言编写的 Emby + OpenList 网盘直链反向代理服务,深度适配阿里云盘转码播放。
网盘直链反向代理:
正常情况下,Emby 通过磁盘挂载的形式间接读取网盘资源,走的是服务器代理模式,看一个视频时数据链路是:
客户端 => Emby 源服务器 => 磁盘挂载服务 => OpenList => 网盘
客户端 <= Emby 源服务器 <= 磁盘挂载服务(将视频数据加载到本地,再给 Emby 读取) <= OpenList <= 网盘
这种情况有以下局限:
使用网盘直链反向代理后,数据链路:
客户端 => Emby 反代服务器 => Emby 源服务器 (请求 Emby Api 接口)
客户端 <= Emby 反代服务器 <= Emby 源服务器 (返回数据)
对于普通的 Api 接口,反代服务器将请求反代到源服务器,再将合适的结果进行缓存,返回给客户端
对于客户端来说,这一步和直连源服务器看不出差别
客户端 => Emby 反代服务器 => OpenList => 网盘 (请求视频直链)
客户端 <= Emby 反代服务器 <= OpenList <= 网盘 (返回视频直链,并给出重定向响应)
客户端 => 网盘(客户端拿着网盘的直链直接观看,此时已经没有服务器的事情了,故不会再消耗服务器流量)
这种方式的好处:
本项目初衷: 易用轻巧、小白友好、深度适配阿里云盘 (如果你使用本项目观看其他网盘时出现问题,也欢迎到 issue 区反馈,我会尽量适配它)
如果你有更复杂的需求, 推荐使用功能更完善的反向代理服务:bpking1/embyExternalUrl
OpenList 网盘原画直链播放
Strm 直链播放
OpenList 网盘转码直链播放(阿里云盘)
是否消耗三方流量包流量:🙅
非会员是否限速:自行测试
示例图 ↓:
转码资源直链已达到可正常使用的标准,Emby Web, Emby for AndroidTV 以及其他大部分客户端都可以正常播放,并且不会因为直链过期而中断
局限:
如果是有多个内置音频的,转码直链只能播放其中的默认音频
视频本身的内封字幕会丢失,不过若存在转码字幕,也会适配到转码版本的 PlaybackInfo 信息中,示例图 ↓:
websocket 代理
客户端防转码(转容器)
缓存中间件,实际使用体验不会比直连源服务器差
字幕缓存(字幕缓存时间固定 30 天)
目前还无法阻止 Emby 去本地挂载文件上读取字幕
带字幕的视频首次播放时,Emby 会调用 FFmpeg 将字幕从本地文件中提取出来,再进行缓存
也就是说:
- 首次提取时,速度会很慢,有可能得等个大半天才能看到字幕(使用第三方播放器【如
MX player,Fileball】可以解决)- 带字幕的视频首次播放时,还是会消耗服务器的流量
直链缓存(为了兼容阿里云盘,直链缓存时间目前固定为 10 分钟,其他云盘暂无测试)
大接口缓存(OpenList 转码资源是通过代理并修改 PlaybackInfo 接口实现,请求比较耗时,每次大约 2~3 秒左右,目前已经利用 Go 语言的并发优势,尽力地将接口处理逻辑异步化,快的话 1 秒即可请求完成,该接口的缓存时间目前固定为 12 小时,后续如果出现异常再作调整)
| 名称 | 最后测试版本 | 原画 | 其他说明(原画) | 阿里转码 | 其他说明(阿里转码) |
|---|---|---|---|---|---|
Gemby |
v2.6.4 |
✅ | —— | ✅ | —— |
Emby Web |
4.8.8.0 |
✅ | —— | ✅ | 1. 转码字幕有概率挂载不上 |
可以挂载原画字幕 |
| Emby for iOS | —— | ❓ | ~~没高级订阅测不了~~ | ❓ | ~~没高级订阅测不了~~ |
| Emby for macOS | —— | ❓ | ~~没高级订阅测不了~~ | ❓ | ~~没高级订阅测不了~~ |
| Emby for Android | 3.4.23 | ✅ | —— | ✅ | —— |
| Emby for AndroidTV | 2.0.95g | ✅ | 遥控器调进度可能会触发直链服务器的频繁请求限制,导致视频短暂不可播情况 | ✅ | 无法挂载字幕 |
| Fileball | —— | ✅ | —— | ✅ | —— |
| Infuse | —— | ✅ | 在设置中将缓存方式设置为不缓存可有效防止触发频繁请求 | ❌ | —— |
| VidHub | —— | ✅ | 仅测试至 1.0.7 版本 | ✅ | 仅测试至 1.0.7 版本 |
| Stream Music | 1.3.8 | ✅ | —— | —— | —— |
| Emby for Kodi Next Gen | 11.1.13 | ✅ | —— | ✅ | 1. 需要开启插件设置:播放/视频转码/prores
播放时若未显示转码版本选择,需重置本地数据库重新全量扫描资料库
某个版本播放失败需要切换版本时,必须重启 kodi 才能重新选择版本
无法挂载字幕 |
已有自己的 Emby、OpenList 服务器
Emby 的媒体库路径(本地磁盘路径)是和 OpenList 挂载路径能够对应上的
这一步前缀对应不上没关系,可以在配置中配置前缀映射
path.emby2openlist解决
目前我知道的比较好用的服务有两个:rclone 和 CloudDrive2(简称 cd2)
如果你的网盘跟我一样是阿里云盘,推荐使用 cd2 直接连接阿里云盘,然后根路径和 OpenList 保持即可
在 cd2 中,找到一个
最大缓存大小的配置,推荐将其设为一个极小值(我是 1MB),这样在刮削的时候就不会消耗太多三方权益包的流量⚠️ 不推荐中间服务直接去连接 OpenList 的 WebDav 服务,如果 OpenList Token 刷新失败或者是请求频繁被暂时屏蔽,会导致系统本地的挂载路径丢失,Emby 就会认为资源被删除了,然后元数据就丢了,再重新挂载回来后就需要重新刮削了。
服务器有安装 Docker
Git
非必须,如果你想体验测试版,就需要通过 Git 拉取远程源码构建
正式版可以直接使用现成的 Docker 镜像
git clone --branch v2.8.0 --depth 1 https://github.tbedu.top/https://github.com/AmbitiousJun/go-emby2openlist
cd go-emby2openlist
示例配置为完整版配置,首次部署可以参照核心配置优先跑通程序,再按需补充其他配置
cp config-example.yml config.yml
config.yml 文件关于路径映射的配置示例图:

docker-compose up -d --build
8095,开始使用如需要自定义端口,在第四步编译之前,修改
docker-compose.yml文件中的8095:8095为[自定义端口]:8095即可
docker logs -f go-emby2openlist -n 1000
# 修改 config.yml ...
docker-compose restart
# 获取到最新代码后, 可以检查一下 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 image prune -f
示例配置为完整版配置,首次部署可以参照核心配置优先跑通程序,再按需补充其他配置
参考示例配置,配置好自己的服务器信息,保存并命名为 config.yml
在配置相同目录下,创建 docker-compose.yml 粘贴以下代码:
version: "3.1"
services:
go-emby2openlist:
image: ambitiousjun/go-emby2openlist:v2.8.0
environment:
- TZ=Asia/Shanghai
- GIN_MODE=release
# - HTTP_PROXY=http://127.0.0.1:7890
# - HTTPS_PROXY=http://127.0.0.1:7890
container_name: go-emby2openlist
restart: always
volumes:
- ./config.yml:/app/config.yml
- ./ssl:/app/ssl
- ./custom-js:/app/custom-js
- ./custom-css:/app/custom-css
- ./lib:/app/lib
- ./openlist-local-tree:/app/openlist-local-tree
ports:
- 8095:8095 # http
- 8094:8094 # https
docker-compose up -d --build
使用方式:
ssl 目录中config.yml 中特别说明:
在容器内部,已经将 https 端口写死为 8094,将 http 端口写死为 8095
如果需要自定义端口,仍然是在 docker-compose.yml 中将宿主机的端口映射到这两个端口上即可
已知问题:
可能有部分客户端会出现首次用 https 成功连上了,下次再打开客户端时,就自动变回到 http 连接,目前不太清楚具体的原因
使用方式: 将自定义脚本文件以 .js 后缀命名放到程序根目录下的 custom-js 目录后重启服务自动生效
远程脚本: 将远程脚本的 http 访问地址写入以 .js 后缀命名的文件后(如编辑器报错请无视)放到程序根目录下的 custom-js 目录后重启服务自动生效
注意事项: 确保多个不同的文件必须都是相同的编码格式(推荐 UTF-8)
示例脚本:
| 描述 | 获取脚本 | 自用优化版本 |
|---|---|---|
| 生成外部播放器按钮 | ExternalPlayers.js | --- |
| 首页轮播图 | emby-swiper.js | 媒体库合并 + 每日清空缓存 |
| 隐藏无图片演员 | actorPlus.js | --- |
| 键盘 w/s 控制播放音量 | audio-keyboard.js | --- |
使用方式: 将自定义样式表文件以 .css 后缀命名放到程序根目录下的 custom-css 目录后重启服务自动生效
远程样式表: 将远程样式表的 http 访问地址写入以 .css 后缀命名的文件后(如编辑器报错请无视)放到程序根目录下的 custom-css 目录后重启服务自动生效
注意事项: 确保多个不同的文件必须都是相同的编码格式(推荐 UTF-8)
示例样式:
| 描述 | 获取样式 | 自用优化版本 |
|---|---|---|
| 调整音量调整控件位置 | 音量条+控件修改.css | --- |
| 节目界面样式美化 | 节目界面.txt | 下拉框元素对齐 |
监控扫描 OpenList 目录树变更,在本地磁盘中生成并维护相应结构的目录树,可供 Emby 服务器直接扫描入库,并配合本项目进行直链反代,支持传统 Strm 文件以及附带元数据的虚拟文件生成。
⚠️ 提示:
程序利用 Go 的并发优势,加快了扫描 OpenList 的速度,同时对于 ffmpeg 提取远程文件元数据操作进行了严格的并发控制,同一时刻只会有至多一个文件被提取元数据,扫库的风控风险虽大幅降低,但仍存在!
v2.2.0 以上版本$ claude mcp add go-emby2openlist \
-- python -m otcore.mcp_server <graph>