飞牛影视 302 代理与起播延迟优化工具 - 自动解析 .strm 文件并重定向至网盘直链,支持用户身份识别。
.strm 虚拟视频文件PlaybackInfo)的瞬间,后台异步读取 .strm 并提前解析出网盘直链写入缓存,实现客户端起播 0 延迟。🎬 [用户: 张三] 拦截到视频流请求)。SIGINT/SIGTERM 优雅关闭清理,支持基于轮询(Docker 友好)的 config.yaml 配置文件热重载。config.yaml# 代理监听地址
listen: ":28005"
# 飞牛影视服务真实地址
target: "http://127.0.0.1:8005"
# 日志级别: trace / debug / info / warn / error
# 生产环境推荐 info,排查问题推荐 debug
log_level: "info"
# 日志目录(trace/debug级别时写入日志文件,info级别可省略)
log_dir: "./logs"
# 直链缓存过期时间(分钟),默认1小时
cache_ttl: 60
services:
ttfn:
image: skytan/ttfn:latest
container_name: ttfn
ports:
- "28005:28005"
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
| 变量 | 说明 | 默认值 |
|---|---|---|
CONFIG | 配置文件路径 | ./config.yaml |
TZ | 时区 | Asia/Shanghai |
FNTV_CACHE_TTL | 直链缓存过期时间(分钟),优先级高于配置文件的 cache_ttl | 60 |
| 级别 | 输出位置 | 说明 |
|---|---|---|
trace | 文件 | 最详细,记录完整请求/响应头及 Body(仅限排查严重鉴权问题使用) |
debug | 控制台 + 文件 | 记录所有请求、响应及直链后台异步预解析详情 |
info | 控制台 | 只输出关键信息,包括用户身份和重定向跳转行为(推荐生产环境) |
warn | 控制台 | 只输出警告和错误 |
error | 控制台 | 只输出错误 |
[2026-06-28 12:50:00] INFO: 🎯 [用户: 小明] 拦截到 PlaybackInfo 接口
[2026-06-28 12:50:00] INFO: 📄 缓存.strm: MediaSourceId=1a2b3c4d..., ItemId=064d9e7c...
[2026-06-28 12:50:01] INFO: 💾 [异步预解析] 成功缓存直链 (MediaSourceId: 1a2b3c4d...)
[2026-06-28 12:50:02] INFO: 🎬 [用户: 小明] 拦截到视频流请求: /emby/videos/064d9e7c.../stream.mp4
[2026-06-28 12:50:02] INFO: ✅ [用户: 小明] 从缓存获取直链: https://quark-cdn-link.com/file/...
ttfn/
├── cmd/
│ └── main.go # 入口,负责初始化、优雅退出和配置监听
├── internal/
│ ├── cache/
│ │ └── cache.go # 直链缓存与媒体源物理路径映射管理 (双向索引)
│ ├── config/
│ │ └── config.go # 基于轮询的配置热加载管理
│ ├── handler/
│ │ ├── playback.go # 拦截 PlaybackInfo 触发缓存并进行异步预解析
│ │ ├── resolver.go # 基于 HEAD 降级 GET 的直链解析器
│ │ ├── stream.go # 拦截播放流返回 302 重定向
│ │ └── user.go # 提取鉴权 Token 并反查飞牛后端对应用户名
│ ├── logger/
│ │ └── logger.go # 多级日志组件
│ └── proxy/
│ └── server.go # 基于 httputil.ReverseProxy 的代理核心服务
├── config.yaml # 默认配置文件
├── docker-compose.yml # Compose 部署配置
├── Dockerfile # 容器镜像构建文件
└── README.md # 说明文档
1. 客户端(用户) ──(请求 PlaybackInfo)──> [TTFN 代理] ──> [飞牛影视后端]
2. [TTFN 代理] <──(返回 PlaybackInfo JSON)── [飞牛影视后端]
└─ 📌 拦截并提取 .strm 物理路径
└─ 📌 提取鉴权 Token 反查并缓存播放用户名
└─ ⚡ [异步子协程] 读取 .strm 并向云盘发起 HEAD/GET 解析直链,提早写入直链缓存
3. 客户端(用户) ──(请求播放流 /stream.mp4)──> [TTFN 代理]
└─ 🚀 直接命中直链缓存,瞬间返回 302 重定向到云盘直链
4. 客户端(用户) ──(直接连接网盘 CDN 播放)──> [云盘服务]
PlaybackInfo 时会强制调用内置的 ffprobe 探测文件信息。这会直接阻塞飞牛后端。建议让飞牛媒体库的首次完整扫描完成,或者使用媒体信息预提取工具将元数据写入飞牛数据库。.strm 文件放置在 NAS 本地 SSD 或本地硬盘,避免将 .strm 本身放在 rclone 网络挂载盘上,这会导致读取文件文本本身产生明显延迟。[用户: 未知用户]?log_level 临时调整为 trace,查找 /PlaybackInfo 请求头中包含了哪些鉴权字段(如 Authorization 里的其他关键字),修改 internal/handler/user.go 中的 extractToken 函数添加识别。target 顺利请求到 /emby/Users/Me。Content type
Image
Digest
sha256:bf400095e…
Size
9.5 MB
Last updated
3 months ago
docker pull skytan/ttfn