Skip to content

feat: enrich Plex metadata with MediaInfo - #8

Merged
InfinityPacer merged 1 commit into
mainfrom
feat/mediainfo-enrichment
Aug 28, 2026
Merged

InfinityPacer merged 1 commit into
mainfrom
feat/mediainfo-enrichment

Conversation

@InfinityPacer

Copy link
Copy Markdown
Owner

变更说明

Plex 的 STRM 条目通常缺少容器、编解码器、分辨率和 Stream 技术字段。本变更将已有的 MediaInfo fallback 基础接入单项 metadata 响应:缓存命中时直接补充缺失字段,冷缓存最多等待 5 秒,超时或任何不确定情况均原样返回 Plex 响应,探测继续在后台完成。

投影只处理认证的 GET /library/metadata/{ratingKey},严格要求唯一的 ratingKey、Media 和 Part。它只补充白名单技术字段,不覆盖 Plex 已有值,不创建未知 Stream 身份,也不处理 batch、children、HEAD、Range、Part、decision、universal start 或 timeline 请求。

SQLite 配置提升为 Gateway 级 DATABASE_PATH,默认文件为 plex-gateway.db。连接、WAL 和按模块迁移由 internal/database 统一管理,MediaInfo 只拥有自己的表。该未发布能力不保留旧 MEDIAINFO_DB_PATH 或 mediainfo.db 兼容入口。

多客户端仍共享成功的 singleflight 和持久记录。如果共享探测因某个 User-Agent 失败,使用不同 User-Agent 的 waiter 会在自身截止时间内接力重试,避免一个客户端的 CDN 兼容失败抑制其他客户端。

安全与性能边界

  • 默认冷等待上限为 5 秒,独立 enrichment 并发上限为 4。
  • 单响应缓冲上限默认为 8 MiB,超限立即回到透明转发。
  • gzip、Content-Length 和缓存 validator 在发生改写时按新响应重建。
  • STRM 在探测前后重新读取并校验 fingerprint,变化时放弃投影。
  • Plex Token、Cookie、Authorization 和 CDN URL 不写入 MediaInfo 记录或指标。
  • 播放 302 数据面不等待 MediaInfo,MediaInfo 初始化失败也不阻断透明代理。

验证

  • go test -count=1 ./...
  • go test -race -count=1 ./...
  • go vet ./...
  • actionlint
  • docker build -t plex-gateway:f2-local .
  • 跨 User-Agent 失败接力测试普通运行 100 次、Race 运行 20 次
  • 真实 gateway.New、ReverseProxy、SQLite 与 MediaInfo Service 组合测试普通运行 50 次、Race 运行 20 次

组合测试覆盖冷等待超时原样返回、worker 后台持久化、第二次 gzip 热增强、validator 清理,以及 Part、decision、universal start、timeline 零 MediaInfo Provider 调用。

真实 NAS、MediaVault、CDN 与 HDR/Dolby Vision 客户端消费验收属于后续部署叶,不在本 PR 中声明完成。

@InfinityPacer
InfinityPacer merged commit f271fc1 into main Aug 28, 2026
1 check passed
@InfinityPacer
InfinityPacer deleted the feat/mediainfo-enrichment branch August 28, 2026 20:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant