"""Рабочие функции переиндексации (tools/collect.py → build / meta). Вынесены в отдельный лёгкий модуль, чтобы их можно было запускать в процессах (multiprocessing на Windows импортирует модуль заново, поэтому здесь нет rich, интерфейса и состояния сборщика). Каждая функция получает и возвращает только простые данные. """ from __future__ import annotations import json import sys from pathlib import Path _ROOT = Path(__file__).resolve().parents[1] for _p in (_ROOT, _ROOT / "tools", _ROOT / "tools" / "harvest"): if str(_p) not in sys.path: sys.path.insert(0, str(_p)) import harvest_core as hv # noqa: E402 import meta # noqa: E402 from src.html_extract import html_to_text # noqa: E402 PARSERS = {"kinozal": hv.kz_parse, "rutracker": hv.rt_parse, "nnm": hv.nnm_parse} def build_one(task: dict) -> dict: """Один релиз: метки (если нужны) и страница data/pages/.txt (если нужна). task: site, json, html, parse (строить метки), known (уже размечен), page (куда писать текст страницы или None). Ответ: labs, error, skipped (нет меток у нового релиза), wrote. """ out = {"labs": [], "error": None, "skipped": False, "wrote": False} rec = None if task["parse"]: rec = json.loads(Path(task["json"]).read_text(encoding="utf-8")) try: out["labs"], _ = PARSERS[task["site"]](rec) except Exception as exc: # noqa: BLE001 out["error"] = str(exc) if not task["known"]: return out # новый релиз без разбора — пропуск if not out["labs"] and not task["known"]: out["skipped"] = True # без меток страницу в обучение не берём return out if task["page"]: text = html_to_text(Path(task["html"]).read_text(encoding="utf-8")) Path(task["page"]).write_text(text, encoding="utf-8") out["wrote"] = True return out def meta_one(task: dict) -> dict: """Одна строка meta.csv. task: site, rec, name, html, page (готовый текст страницы или None).""" full = "" page = task.get("page") if page and Path(page).exists(): full = Path(page).read_text(encoding="utf-8") # уже разобран при сборке страниц elif task.get("html") and Path(task["html"]).exists(): full = html_to_text(Path(task["html"]).read_text(encoding="utf-8")) return meta.extract(task["site"], task["rec"], task["name"], full)