#6728·MoviePilot

[Feature Request]: Emby 订阅缺集检查未遵循“同步媒体库”选择,云端同名媒体导致误判不缺集

Author: gcttsCreated Sep 18, 2026Updated Sep 18, 2026
Labelsfeature request

当前程序版本

V3.0.3

运行环境

Docker

功能改进类型

主程序

功能改进

问题描述

Emby 同时配置了本地硬盘媒体库与115云端媒体库

ImageImage

MoviePilot 的 Emby 设置中,“同步媒体库”只选择了本地库,没有选择任何云端库。

当本地库与云端库存在同名、同年份、相同 TMDB ID 的电视剧时,MoviePilot 在订阅缺集检查中仍会读取云端库的剧集,并将云端已有集数计入本地已存在集数,导致本地缺失剧集不再下载。

例如:

  • 本地媒体库实际只有 S01E01-E03;
  • 云端媒体库存在 S01E01-E17;
  • MoviePilot 只配置同步本地媒体库;
  • 搜索订阅时,MoviePilot 仍判断 S01E01-E17 已存在,只将 E18 以后判定为缺集;
  • 因此站点已有的 E04-E17 不会被下载。

该问题在未安装第三方订阅助手插件的情况下仍可稳定复现。

站点适配采集文件

不适用

参考资料

期望

所有媒体存在性检查都应遵循媒体服务器配置中的 sync_libraries

  • 只在已选择的媒体库中查找电影和电视剧;
  • 未选择的媒体库不应参与订阅缺集、重复判断或已存在判断;
  • 同名媒体存在于多个库时,应优先或仅匹配所选库中的项目。

初步代码定位

sync_libraries 在同步阶段能够正确过滤媒体库:

python
selected_libraries = [
    library for library in libraries
    if not sync_libraries
    or "all" in sync_libraries
    or str(library.id) in sync_libraries
]

相关位置:

https://github.com/jxxghp/MoviePilot/blob/v3/app/chain/mediaserver.py

但 Emby 电视剧存在性查询使用服务器级接口 /emby/Items,没有传入用户 ID、媒体库 ID 或 ParentId,也没有依据 self._sync_libraries 过滤:

python
url = f"{self._host}emby/Items"
params = {
    "IncludeItemTypes": "Series",
    "Fields": "ProductionYear",
    "Recursive": "true",
    "SearchTerm": name,
    "Limit": 10,
    "api_key": self._apikey
}

随后代码直接返回第一个名称和年份匹配的项目:

python
for res_item in res_items:
    if res_item.get("Name") == name and (
            not year or str(res_item.get("ProductionYear")) == str(year)):
        return res_item.get("Id")

相关位置:

https://github.com/jxxghp/MoviePilot/blob/v3/app/modules/emby/emby.py

get_tv_episodes() 再使用该 Item ID 查询 /emby/Shows/{item_id}/Episodes,没有校验项目是否属于已选择媒体库。

电影的 get_movies() 同样使用全局 /emby/Items,可能存在相同问题。

建议

建议让电影、电视剧存在性查询统一遵循 self._sync_libraries,可考虑:

  1. all 模式下,按每个已选媒体库 ID 使用 ParentId 分别查询;或
  2. 查询时获取 PathParentId/祖先信息,并过滤掉不属于已选媒体库的结果;
  3. 对外部传入或缓存的电视剧 Item ID,也校验其所属媒体库;若不属于已选库,则丢弃并在已选库中重新搜索;
  4. 电影查询同步应用相同过滤逻辑;
  5. 增加以下回归测试:同一个 Emby 中,本地库和云端库存在同名同年份、相同 TMDB ID 的两个媒体项目。