Files
grabber-ai/tests/par_check.py
T
DenozordecandClaude Sonnet 5.5 efc9a4f56a
docker / build (push) Failing after 39s
Docker-сервис, выбор основы и сравнение моделей, сборщик датасета
- Docker: Dockerfile (CPU), compose с FlareSolverr, настройка через DUB_* переменные,
  токен доступа к /predict, tools/pack_models.py, workflow Gitea Actions, docs/docker.md
- Модель грузится офлайн (config.json рядом с весами); общий код вынесен в src/spans.py,
  сервису не нужны sklearn/matplotlib/pandas
- Обучение: профили tiny2/base/large/modern, запуски в models/runs, реестр и честное
  сравнение на одной тестовой выборке (src/runs.py), пункт меню «Модели»
- Датасет: язык и аудио-параметры дорожек, 18+ по строкам «Аудио», ручные метки по ссылкам,
  переиндексация сохранённого HTML, параллельная сборка, сбалансированная выборка
- Тексты страниц (data/pages) больше не хранятся в git

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 17:19:10 +07:00

45 lines
2.3 KiB
Python

"""Проверка параллельной переиндексации: те же метки, страницы и meta, что и в одном процессе.
Отдельный скрипт, потому что multiprocessing на Windows заново импортирует главный модуль:
tests/run_tests.py без `if __name__ == "__main__"` запустился бы в каждом процессе.
Печатает одну строку JSON.
"""
import json
import sys
import tempfile
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path[:0] = [str(ROOT), str(ROOT / "tools"), str(ROOT / "tools" / "harvest")]
import collect as col # noqa: E402
POST = ("Год выпуска: 2020\nАудио 1: Opus, 6 ch, 221 Kbps | Русский AVO (Дмитрий Пучков)\n"
"Аудио 2: AC3, 6 ch, 448 Kbps | Русский MVO (LostFilm)\n")
def run(base: Path, name: str, workers: int) -> dict:
d = base / name
(d / "raw" / "nnm").mkdir(parents=True)
(d / "labels.csv").write_text("", encoding="utf-8")
for i in range(50):
(d / "raw" / "nnm" / f"{9000 + i}.json").write_text(json.dumps(
{"id": str(9000 + i), "source": "nnm", "ok": True, "title": f"Фильм {i} (2020) BDRip", "post": POST},
ensure_ascii=False), encoding="utf-8")
(d / "raw" / "nnm" / f"{9000 + i}.html").write_text(
f"<html><body><h1>Фильм {i}</h1><div>{POST.replace(chr(10), '<br>')}</div></body></html>", encoding="utf-8")
col.RAW, col.PAGES, col.LABELS = d / "raw", d / "pages", d / "labels.csv"
col.POSTONLY, col.META, col.MANUAL = d / "po.txt", d / "meta.csv", d / "m.txt"
return col.cmd_build(rewrite=True, runner=col.Runner(workers=workers))
if __name__ == "__main__":
base = Path(tempfile.mkdtemp())
a, b = run(base, "serial", 1), run(base, "par", 2)
same = (
(base / "serial" / "labels.csv").read_bytes() == (base / "par" / "labels.csv").read_bytes()
and (base / "serial" / "meta.csv").read_bytes() == (base / "par" / "meta.csv").read_bytes()
and sorted(p.name for p in (base / "serial" / "pages").glob("*.txt"))
== sorted(p.name for p in (base / "par" / "pages").glob("*.txt")))
print("RESULT " + json.dumps({"same": same, "pages": b["pages"], "labeled": [a["labeled"], b["labeled"]]}))