diff --git a/CHANGELOG.md b/CHANGELOG.md index 77328d6..a2c33fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,15 @@ callers). ## [Unreleased] +### Fixed + +- **Multi-episode chain (e.g. `S14E09E10E11`) now collapses to a full + range.** The parser previously captured `episode=9, episode_end=10` + and dropped E11+. It now returns `episode=first, episode_end=last`, + with intermediate values implied. Fixture + `shitty/archer_multi_episode/` updated from anti-regression-of-bug + to anti-regression-of-fix. + ### Added - **`LanguageRepository` port** in `alfred.domain.shared.ports`. Structural diff --git a/alfred/domain/release/parser/pipeline.py b/alfred/domain/release/parser/pipeline.py index 68f8b55..de0a883 100644 --- a/alfred/domain/release/parser/pipeline.py +++ b/alfred/domain/release/parser/pipeline.py @@ -113,7 +113,9 @@ def _parse_season_episode(text: str) -> tuple[int, int | None, int | None] | Non if not episodes: return None - return season, episodes[0], episodes[1] if len(episodes) >= 2 else None + # For chained multi-episode markers (E09E10E11), the range is the + # first → last episode. Intermediate values are implied. + return season, episodes[0], episodes[-1] if len(episodes) >= 2 else None # NxNN form if "X" in upper: diff --git a/tests/fixtures/releases/shitty/archer_multi_episode/expected.yaml b/tests/fixtures/releases/shitty/archer_multi_episode/expected.yaml index c63881d..75469f1 100644 --- a/tests/fixtures/releases/shitty/archer_multi_episode/expected.yaml +++ b/tests/fixtures/releases/shitty/archer_multi_episode/expected.yaml @@ -1,14 +1,13 @@ release_name: "Archer.S14E09E10E11.1080p.WEB.h264-ETHEL" -# Tech debt: triple-episode chain (E09E10E11) — current parser captures -# episode=9 and episode_end=10, but E11 is lost. Anti-regression: lock in -# the partial behavior so any future improvement is intentional. +# Triple-episode chain (E09E10E11) — the parser collapses the chain to a +# range (episode=first, episode_end=last). Intermediate values are implied. parsed: title: "Archer" year: null season: 14 episode: 9 - episode_end: 10 + episode_end: 11 quality: "1080p" source: "WEB" codec: "h264"