飞牛影视 / Emby 代理工具 - 自动解析 .strm 文件并重定向到真实直链
.strm MediaSource:8095 → :8096)DirectStreamUrl 并禁用转码/stream、/universal 请求,302 到 strm 真实直链.strm 文件、远程 URL、115 直链解析strm_path_map)config.yaml.example 为 config.yaml,按实际环境修改目标地址./fntv-proxy 或使用 Docker Compose:28005,Emby :8095)
config.yaml已加入.gitignore,本地内网地址不会被提交到仓库。
复制示例配置并编辑:
cp config.yaml.example config.yaml
config.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])。
.ts 分片)→ 不是单个文件,probe 无法像扫文件那样得到完整元数据不是。 根因在夸克 + 夸克 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:
log_level 改为 debug 查看 [Emby] 前缀日志strm_path_map 是否需要替换 strm 内的 URL 地址Content type
Image
Digest
sha256:24d8210b9…
Size
9.5 MB
Last updated
4 months ago
docker pull jimboo7339/fntv-proxy