fix(plex): skip episodes with missing season or episode numbers

This commit is contained in:
ranzhigg
2026-09-04 07:51:22 +08:00
parent b8fd1b9958
commit 08b5e9d34c
2 changed files with 51 additions and 0 deletions
+3
View File
@@ -353,6 +353,9 @@ class Plex:
for episode in episodes:
if season is not None and episode.seasonNumber != int(season):
continue
# Plex 空条目可能缺少季集号,不能传入后续季集模型校验。
if episode.seasonNumber is None or episode.index is None:
continue
if episode.seasonNumber not in season_episodes:
season_episodes[episode.seasonNumber] = []
season_episodes[episode.seasonNumber].append(episode.index)
+48
View File
@@ -0,0 +1,48 @@
from types import SimpleNamespace
from typing import Optional
from unittest.mock import Mock
import pytest
from app.modules.plex.plex import Plex
from app.schemas.types import MediaSource
@pytest.mark.parametrize(
("numbers", "season", "expected"),
[
([(None, 1), (1, None), (None, None), (1, 2)], None, {1: [2]}),
([(None, 1), (1, None), (1, 2), (2, 1)], 1, {1: [2]}),
([(None, 1), (1, None), (None, None)], None, {}),
([(0, 1), (1, 0), (1, 2)], None, {0: [1], 1: [0, 2]}),
([(0, 1), (1, 1)], 0, {0: [1]}),
],
ids=["missing-numbers", "season-filter", "all-invalid", "preserve-zero", "specials"],
)
def test_plex_tv_episodes_skips_missing_numbers(
numbers: list[tuple[Optional[int], Optional[int]]],
season: Optional[int],
expected: dict[int, list[int]],
) -> None:
"""缺失季集号不能进入同步结果,合法的零值和季过滤应保持不变。"""
plex = Plex.__new__(Plex)
plex._plex = Mock()
show = Mock()
show.key = "/library/metadata/123"
show.guids = [{"id": "tmdb://12345"}]
show.episodes.return_value = [
SimpleNamespace(seasonNumber=season_number, index=episode_number)
for season_number, episode_number in numbers
]
plex._plex.fetchItem.return_value = show
item_id, episodes = plex.get_tv_episodes(
item_id="123",
media_source=MediaSource.TMDB,
media_id="12345",
season=season,
)
assert item_id == show.key
assert episodes == expected
plex._plex.library.search.assert_not_called()