From e185c73714de3e474c131e583656de5ad006dcab Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sat, 7 Nov 2026 09:49:35 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B5=D0=B3=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F:=20=D0=B2=D1=81=D0=B5=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B8=20=D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0=B5?= =?UTF-8?q?=D0=BA=20=D0=BF=D0=BE=D0=B4=20=D0=BF=D1=83=D1=81=D1=82=D1=8B?= =?UTF-8?q?=D0=BC=20=C2=AB=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4:?= =?UTF-8?q?=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit На rutracker дорожки бывают перечислены по одной на строку под «Перевод:» без значения; правила брали только первую строку и теряли остальные (t=6919056: 1 из 4, t=6927571: 1 из 7). Теперь берутся подряд идущие строки, начинающиеся со слова типа озвучки. Co-Authored-By: Claude Opus 5.5 --- src/html_extract.py | 9 +++++++++ tests/run_tests.py | 13 +++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/html_extract.py b/src/html_extract.py index 44f10c5..7f2212a 100644 --- a/src/html_extract.py +++ b/src/html_extract.py @@ -47,6 +47,10 @@ RE_SEP = re.compile( r"\s*(?:\+|;|/)\s*(?=Проф|Люб|Авт|Дубл|Многоголос|Двухголос|Одноголос)", re.I) +# строка, начинающаяся со слова типа озвучки (продолжение списка под «Перевод:») +RE_TYPE_START = re.compile( + r"^\s*(?:Проф|Люб|Авт|Дубл|Многоголос|Двухголос|Одноголос)", re.I) + SELECTORS = ("div.post_body", "div[id^=post-text-]", ".postbody", "#tabs") @@ -122,6 +126,11 @@ def extract_segments(text: str) -> list[str]: if j >= len(lines): break body, i = lines[j].strip(), j + 1 + # rutracker: «Перевод:» и под ним по строке на дорожку — берём + # подряд идущие строки, начинающиеся со слова типа + while i < len(lines) and RE_TYPE_START.match(lines[i]): + body += " ; " + lines[i].strip() + i += 1 else: i += 1 continue diff --git a/tests/run_tests.py b/tests/run_tests.py index 9ae3d43..84231f9 100644 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -102,6 +102,19 @@ segs = extract_segments("Перевод:\nПрофессиональный (ду check("значение на следующей строке", segs == ["Профессиональный (дублированный) Невафильм"], f"got {segs}") +segs = extract_segments( + "Перевод: \n" + "Профессиональный (дублированный) | Cinema Tone Production\n" + "Профессиональный (псевдодублированный) | HDRezka Studio\n" + "Профессиональный (многоголосый закадровый) | HDRezka Studio\n" + "Профессиональный (многоголосый закадровый) | TVShows\n" + "\nОригинальная аудиодорожка: Английская\n") +check("список строк под «Перевод:» (rt 6919056)", segs == [ + "Профессиональный (дублированный) | Cinema Tone Production", + "Профессиональный (псевдодублированный) | HDRezka Studio", + "Профессиональный (многоголосый закадровый) | HDRezka Studio", + "Профессиональный (многоголосый закадровый) | TVShows"], f"got {segs}") + segs = extract_segments("Перевод: Профессиональный (двухголосый закадровый) + Любительский (одноголосый закадровый)") check("разделитель +", len(segs) == 2, f"got {segs}")