* perf(mediaserver): add caller-controlled query projections * test(mediaserver): cover query projection option contracts --------- Co-authored-by: jxxghp <jxxghp@gmail.com>
3.4 KiB
媒体服务器查询优化记录
本次基于 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 基线仅下调该项,没有增加债务额度。