Files
grabber-ai/tools/rebuild_workers.py
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

62 lines
2.9 KiB
Python

"""Рабочие функции переиндексации (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/<stem>.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)