From 4cb2b369ab982faec305fa64fa97b58d73fba1a6 Mon Sep 17 00:00:00 2001 From: Estrella Pan Date: Sun, 12 Jul 2026 21:07:12 +0200 Subject: [PATCH] fix(parser): preserve CJK movie words in titles --- .../parser/analyser/tokenizer/classic.py | 5 +++- .../parser/analyser/tokenizer/parser.py | 5 +++- backend/src/test/test_parser_selector.py | 28 +++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/backend/src/module/parser/analyser/tokenizer/classic.py b/backend/src/module/parser/analyser/tokenizer/classic.py index 820ea387..ffb650c6 100644 --- a/backend/src/module/parser/analyser/tokenizer/classic.py +++ b/backend/src/module/parser/analyser/tokenizer/classic.py @@ -71,7 +71,10 @@ _PV = re.compile( ) _NCOP = re.compile(r"(? None: ) +@pytest.mark.parametrize( + "parse", + [parse_classic_release_title, selector.preview.parse_release_title], + ids=["classic", "preview"], +) +@pytest.mark.parametrize("title", ["某剧场作品", "小剧场", "某劇場作品", "小劇場"]) +def test_cjk_movie_word_inside_title_is_not_consumed(parse, title: str) -> None: + parsed = parse(f"[SubGroup] {title} Movie [1080p][MP4]") + + assert parsed is not None + assert parsed.title_zh == title + assert parsed.media_type is MediaType.MOVIE + + +@pytest.mark.parametrize( + "parse", + [parse_classic_release_title, selector.preview.parse_release_title], + ids=["classic", "preview"], +) +def test_standalone_cjk_movie_marker_is_still_consumed(parse) -> None: + parsed = parse("[SubGroup] 某动画 / Some Anime 剧场 [1080p][MP4]") + + assert parsed is not None + assert parsed.title_zh == "某动画" + assert parsed.title_en == "Some Anime" + assert parsed.media_type is MediaType.MOVIE + + def test_selector_uses_classic_without_preview_fallback( monkeypatch: pytest.MonkeyPatch, ) -> None: