docker / build (push) Failing after 39s
- 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>
62 lines
2.9 KiB
Python
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)
|