Сегментация: все строки дорожек под пустым «Перевод:»
docker / build (push) Successful in 1m24s

На rutracker дорожки бывают перечислены по одной на строку под
«Перевод:» без значения; правила брали только первую строку и теряли
остальные (t=6919056: 1 из 4, t=6927571: 1 из 7). Теперь берутся
подряд идущие строки, начинающиеся со слова типа озвучки.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
DenozordecandClaude Opus 5.5 committed 2026-11-07 09:49:35 +07:00
1 parent 3c42d2d4e2
commit e185c73714
2 files changed
+22

No files matched your search

+9
View File
@@ -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
+13
View File
@@ -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}")