From 5bbdc9081f31cfa10acffa4c278ec6ad310d45c0 Mon Sep 17 00:00:00 2001 From: Francwa Date: Wed, 20 May 2026 23:23:08 +0200 Subject: [PATCH] fix(release/parser): collapse chained multi-episode markers to full range MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit S14E09E10E11 previously parsed to episode=9, episode_end=10 — E11 was silently dropped. The parser now takes episodes[-1] as episode_end so the full chain is captured (episode=9, episode_end=11). Intermediate values stay implied. Fixture shitty/archer_multi_episode/ updated from anti-regression of the bug to anti-regression of the fix. --- CHANGELOG.md | 9 +++++++++ alfred/domain/release/parser/pipeline.py | 4 +++- .../releases/shitty/archer_multi_episode/expected.yaml | 7 +++---- 3 files changed, 15 insertions(+), 5 deletions(-) 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"