Files
MoviePilot/docs/media-server-query-report.md
Aqr-K bf4ef4214e perf(mediaserver): add caller-controlled query projections (#7068)
* perf(mediaserver): add caller-controlled query projections

* test(mediaserver): cover query projection option contracts

---------

Co-authored-by: jxxghp <jxxghp@gmail.com>
2026-10-19 08:33:45 +08:00

3.4 KiB
Raw Blame History

媒体服务器查询优化记录

本次基于 05967cdc0 实现查询内容选择,范围为 Emby、Jellyfin、Plex、Navidrome。 极空间、飞牛、绿联、Vyo 按用户要求跳过,其适配器源码无改动。

调用方使用统一的 MediaServerQueryOptions.fields;省略选项保留原有内容,显式空集合只取操作必需信息。 同步、查重、分集、首页、播放入口及壁纸分别声明所需内容,适配器保留身份匹配与范围过滤依赖。 完整内容组、协议映射及调用文件清单见 查询内容契约。

服务 主要变化
Emby / Jellyfin 按需追加 Fields,独立控制图片和用户数据;精简详情按 Ids 查询,递归及失效缓存回退保留选项
Plex 下发 excludeFields / excludeElements,按需请求 Guid / Media,避免 SDK 自动补查;原生音乐条目标识规范为字符串
Navidrome 精简列表及最新专辑使用服务端 size / offset,跳过不用的数量与封面工作;Subsonic 不提供通用字段裁剪

旧模块 provider 只对已登记的可选 query 参数兼容省略。未改造的四种服务继续按旧客户端签名调用,Agent 原生动作连接前拒绝它们的 query 参数。 未新增 REST 查询参数;Python 门面与 Agent 使用同一内容模型,工具 Schema 从该模型推导。 部分服务端基础属性无法裁剪,Plex 旧版本还可能忽略排除参数;本次未连接真实媒体服务器测量响应字节或耗时。

验证记录

验证使用锁定环境的 Python 3.14.7,pytest 隔离配置、数据库和外部网络。依赖声明及锁文件无改动。

检查 结果
最终媒体查询、调用方、Agent 与文档生成回归 221 通过
最终架构依赖、Adapter 导入、出站及事件策略 168 通过
最终架构契约、Schema 导出与基线 CLI 45 通过
修改的 34 个 Python 文件 Pylint 10.00/10,无诊断
全应用 Pylint 建议性扫描 无诊断
严格 mypy、mypy / Ruff / 复杂度 ratchet 通过
并发、异步阻塞、任务归属、运行时服务定位门禁 通过
启动性能,三次采样 通过
锁文件与离线环境一致性 通过,197 个包无需调整

全量 python tests/run.py 首次运行结果为 16,316 通过、30 失败、15 跳过。 本次发现的契约、导出清单、文档及测试替身遗漏已修正并在上述最终专项中复测。 全量首次结果不代表最终专项结果,也未声称全量通过;修正后未再重复运行全部分片。

另在未修改的 05967cdc0 独立检出中复现了部分音乐标签/封面写入、资源扫描缓存、Windows Shell 环境与性能预算失败。 本机继承的 DEBUG=release 使四个更新配置用例额外记录 DEBUG 规范化;设置测试进程 DEBUG=false 后这组用例通过。 日志关闭用例单独复跑通过。历史无源码字节码目录曾干扰模块清单检查,移出源码树保留后该检查通过。 这些结果保留了全量验证的限制,未通过修改不相关实现或放宽门禁消除失败。

本次架构快照仅登记新增查询契约、两个 SDK 导出及对应依赖;Plex 出站指纹变化只增加 LibrarySection 类型绑定,外连操作集合不变。 同步统计重构清除了两处 Optional 赋值诊断,mypy 基线仅下调该项,没有增加债务额度。