飞牛影视 / Emby 代理工具 - 自动解析 .strm 文件并重定向到真实直链
- 基于飞牛影视 0.9.3 版本
- 可选启用 Emby 302 代理(与飞牛代理独立运行,互不影响)
- 已测试夸克网盘生成的 strm
- 已测试 115 网盘生成的 strm #1
- 如有问题请提 issue
- ✅ 透明代理飞牛影视服务
- ✅ 自动缓存 PlaybackInfo 中的
.strmMediaSource - ✅ 拦截视频流请求,返回 302 重定向到真实 URL
- ✅ 支持日志级别配置
- ✅ 缓存过期时间可配置
- ✅ 优雅关闭
- ✅ 独立端口代理 Emby 服务(默认
:8095→:8096) - ✅ 改写 PlaybackInfo,注入
DirectStreamUrl并禁用转码 - ✅ 拦截
/stream、/universal请求,302 到 strm 真实直链 - ✅ 支持本地
.strm文件、远程 URL、115 直链解析 - ✅ 可选 strm 内 URL 路径映射(
strm_path_map) - ✅ 本地媒体自动回源,代理失败可配置回源策略
- 复制
config.yaml.example为config.yaml,按实际环境修改目标地址 - 运行
./fntv-proxy或使用 Docker Compose - 将播放器地址指向代理端口(飞牛
:28005,Emby:8095)
config.yaml已加入.gitignore,本地内网地址不会被提交到仓库。
复制示例配置并编辑:
cp config.yaml.example config.yamlconfig.yaml 示例:
# 飞牛影视代理
listen: ":28005"
target: "http://127.0.0.1:8005"
# 日志级别: trace / debug / info / warn / error
log_level: "info"
log_dir: "./logs"
# 直链缓存过期时间(分钟),默认 60
cache_ttl: 60
# Emby 302 代理(默认关闭,不影响飞牛代理)
emby:
enabled: false
listen: ":8095"
target: "http://127.0.0.1:8096"
cache_ttl: 60
proxy_error_strategy: "origin" # origin: 失败回源 | reject: 返回错误
# strm 内 URL 路径映射(可选)
# strm_path_map:
# - "https://old-host:8094 => http://localhost:8095"| 配置项 | 说明 | 默认值 |
|---|---|---|
emby.enabled |
是否启用 Emby 代理 | false |
emby.listen |
Emby 代理监听地址 | :8095 |
emby.target |
Emby 源站地址 | http://127.0.0.1:8096 |
emby.cache_ttl |
Emby 直链缓存(分钟),0 表示使用全局 cache_ttl |
0 |
emby.proxy_error_strategy |
代理失败策略:origin 回源 / reject 报错 |
origin |
emby.strm_path_map |
strm 文件内 URL 片段替换,格式 旧地址 => 新地址 |
无 |
启用 Emby 后,客户端应连接代理地址(如 http://服务器IP:8095),而非直连 Emby 端口。
services:
fntv-proxy:
image: jimboo7339/fntv-proxy:latest
container_name: fntv-proxy
ports:
- "28005:28005" # 飞牛影视代理
- "8095:8095" # Emby 代理(启用 emby.enabled 时需要)
volumes:
# 挂载 strm 文件目录(根据实际路径修改)
# 前后路径必须一致:宿主机是什么路径,容器内就是什么路径
- /vol00/strm:/vol00/strm:ro
- /vol01/strm:/vol01/strm:ro
# 挂载配置文件(用于热重载)
- ./config.yaml:/app/config.yaml:ro
environment:
- CONFIG=/app/config.yaml
restart: unless-stopped注意:strm 路径一定要挂载到 Docker 容器中,否则播放失败,找不到 strm 文件。
| 变量 | 说明 | 默认值 |
|---|---|---|
CONFIG |
配置文件路径 | ./config.yaml |
TZ |
时区 | Asia/Shanghai |
FNTV_CACHE_TTL |
直链缓存过期时间(分钟) | 60 |
FNTV_EMBY_ENABLED |
是否启用 Emby 代理 | false |
FNTV_EMBY_LISTEN |
Emby 代理监听地址 | :8095 |
FNTV_EMBY_TARGET |
Emby 源站地址 | http://127.0.0.1:8096 |
注意:FNTV_CACHE_TTL 优先级高于配置文件中的 cache_ttl。
| 级别 | 输出位置 | 说明 |
|---|---|---|
trace |
文件 | 最详细,记录完整请求/响应头、体(排查问题用) |
debug |
控制台 + 文件 | 记录所有请求和响应 |
info |
控制台 | 只输出关键信息(推荐生产环境) |
warn |
控制台 | 只输出警告和错误 |
error |
控制台 | 只输出错误 |
log_level: "trace"
log_dir: "./logs"日志文件将包含:
=== REQUEST ===
Method: GET
URL: /Items/xxx/PlaybackInfo?MediaSourceId=yyy
Headers:
User-Agent: xxx
Authorization: xxx
Body: {...}
===============
=== RESPONSE ===
Request: GET /Items/xxx/PlaybackInfo
Status: 200
Headers:
Content-Type: application/json
================
fntv-proxy/
├── cmd/
│ └── main.go # 入口
├── internal/
│ ├── config/
│ │ ├── config.go # 配置管理(热重载)
│ │ └── emby.go # Emby 配置
│ ├── proxy/
│ │ └── server.go # 飞牛影视代理服务器
│ ├── emby/
│ │ ├── server.go # Emby 代理服务器
│ │ ├── playback.go # PlaybackInfo 改写
│ │ ├── stream.go # 302 重定向
│ │ └── path.go # 路径解析
│ ├── handler/
│ │ ├── playback.go # 飞牛 PlaybackInfo 处理
│ │ ├── stream.go # 飞牛 Stream 处理
│ │ └── linktype.go # 直链类型识别(HLS / FILE)
│ ├── cache/
│ │ └── cache.go # MediaSource 缓存
│ └── logger/
│ └── logger.go # 日志
├── config.yaml.example # 配置示例(复制为 config.yaml 使用)
├── docker-compose.yml
├── Dockerfile
└── README.md
1. 播放器 → PlaybackInfo → 代理缓存 MediaSource(含 .strm 路径)
↓
2. 播放器 → stream.mp4 / stream.MOV → 代理
↓
3. 代理查缓存 → 读取 .strm → 请求获取真实 URL
↓
4. 代理返回 302 → 播放器 → 真实 URL 播放
1. 播放器 → PlaybackInfo → 代理改写 JSON(DirectStreamUrl + 禁用转码)
↓
2. 播放器 → /Videos/{id}/stream → 代理
↓
3. 代理查缓存 → 读取 .strm / 远程 URL → 跟随重定向链
↓
4. 代理返回 302 → 播放器 → 网盘真实直链播放
本地媒体(非 strm)会重定向到 /original,由 Emby 源站直接提供。
使用 OpenList 夸克 TV 驱动 生成 strm 并走 302 播放时,夸克 CDN 对同一库里的不同影片可能返回两种不同直链。代理只做透明 302 转发,不会把 HLS 转成 mp4,也无法凭空补全媒体库元数据。
| 类型 | 日志标记 | 典型 URL 特征 | 播放 | 时长/码率/分辨率 |
|---|---|---|---|---|
| FILE | 📡 直链类型: FILE |
无 .m3u8,夸克 CDN hash 路径直链 |
✅ | ✅ 通常可获取 |
| HLS | 📡 直链类型: HLS (m3u8) |
含 media.m3u8(如 video-play-*.drive.quark.cn/.../media.m3u8) |
✅(播放器需支持 HLS) | ❌ 通常无法获取 |
strm 文件名可能是 第01集.mp4,但 smartstrm 跟随重定向后,夸克实际返回的不一定是文件直链,也可能是 HLS 转码流。
HLS(无媒体信息):
✅ [Emby] 最终直链: https://video-play-hp-zb.drive.quark.cn/.../media.m3u8?...
📡 [Emby] 直链类型: HLS (m3u8) → 预计无文件元数据(时长/码率/分辨率)
FILE(有媒体信息):
✅ [Emby] 最终直链: https://video-play-p-zb.drive.quark.cn/.../6a36772f...?flag=ho&...
📡 [Emby] 直链类型: FILE → 预计可获取文件元数据
飞牛代理输出格式相同,前缀为 📡 直链类型:(无 [Emby])。
- strm 只是 URL 指针,飞牛/Emby 扫描时需要 probe 真实媒体
- mp4/mov 文件直链可被 ffprobe 解析 → 有时长、分辨率、码率
- m3u8 是播放列表(指向多个
.ts分片)→ 不是单个文件,probe 无法像扫文件那样得到完整元数据 - 飞牛原版对这些片源也会显示 HLS 模式,与是否走本代理无关
不是。 根因在夸克 + 夸克 TV 驱动的返回策略:部分内容只给 HLS 流。本工具仅做 302,不改变夸克返回的链接类型。
| 方案 | 说明 |
|---|---|
| 看日志确认 | 播放时看 HLS (m3u8) 还是 FILE,即可解释 Emby/飞牛里有没有时长信息 |
| TMDB 刮削 | 用外部元数据补时长、分辨率(不依赖文件 probe) |
| 驱动/配置 | 若 OpenList 支持强制下载直链,部分片源可变为 FILE 类型 |
| m3u8 反代 | 复杂方案(如解析 playlist),仍难完整补码率/分辨率 |
A: 飞牛代理支持 stream.mp4、stream.MOV 等所有格式。Emby 代理支持 /stream、/universal 路径。
A: 默认 60 分钟,可通过 cache_ttl(飞牛)或 emby.cache_ttl(Emby)配置。
A: 修改 log_level: debug 或 trace,debug/trace 级别会写入 ./logs 目录。
A: 可以。两者使用不同端口,默认飞牛 :28005、Emby :8095,在同一进程中并行运行。
A: 飞牛代理始终运行;Emby 需设置 emby.enabled: true。飞牛代理仍会监听 :28005,如不需要可忽略该端口。
A: 播放日志若显示 直链类型: HLS (m3u8),说明夸克返回的是 HLS 流而非文件直链,飞牛/Emby 通常无法获取文件级元数据。详见上方 夸克网盘与 HLS 直链说明。
A:
- 确认客户端连接的是代理端口(8095),不是 Emby 原端口(8096)
- 确认 strm 文件目录已挂载到容器/代理所在机器
- 将
log_level改为debug查看[Emby]前缀日志 - 检查
strm_path_map是否需要替换 strm 内的 URL 地址
- 飞牛代理主要针对 夸克网盘 在 openlist 的 夸克 TV 驱动 挂载下实现 302
- Emby 代理参考 qmediasync 的 emby302 思路实现,适用于 strm / 网盘直链场景
- 只要 strm 文件中的地址能正常下载,即可通过本工具实现第三方播放器播放
- 经测试 CapyPlayer、Vidhub、爆米花 下播放器正常播放