"""Jednorazowe nadrobienie zaleglosci jednego browse-scrapera (wiecej stron niz w cyklu). Po co: gdy tub byl przez jakis czas nieosiagalny (porndoe: 10 dni HTTP 403 na IP serwerowni, 2026-08-21..31), regularny cykl browse-latest bierze tylko 5 stron i nie dosiegnie tego, co sie nazbieralo. Ten skrypt robi jeden przebieg na N stron dla JEDNEGO sitetagu, tym samym kodem co scheduler (`_ingest_iter_into_run`), wiec wynik laduje w tych samych tabelach i liczy sie tak samo. PULAPKA, przez ktora ten plik powstal: `docker compose run -d ... python3 -u -` ze skryptem podanym przez heredoc na stdin NIE DZIALA. Przy `-d` stdin nie jest domkniety, wiec python czeka na wejscie w nieskonczonosc: kontener "Up 2 days", zero logu, zero zapisow, a z zewnatrz wyglada jak dlugie zadanie. Odpalaj skrypty z pliku, po sciezce. Uzycie (osobny kontener, restart workera go nie ubija): docker compose run -d --rm --name goon-catchup-porndoe worker \ python3 -u /srv/scripts/browse_catchup.py --sitetag porndoecom --pages 14 """ from __future__ import annotations import argparse import logging import sys from app.connectors.base import SourceKind from app.connectors.direct_scrapers import ALL_BROWSE_SCRAPERS from app.scheduler.browse_latest import SCRAPER_SOURCE_NAME, _ingest_iter_into_run log = logging.getLogger("browse-catchup") def main(argv: list[str] | None = None) -> int: p = argparse.ArgumentParser() p.add_argument("--sitetag", required=True, help="np. porndoecom") p.add_argument("--pages", type=int, default=10) a = p.parse_args(argv) logging.basicConfig( level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s", stream=sys.stdout ) for noisy in ("httpx", "httpcore", "urllib3", "curl_cffi"): logging.getLogger(noisy).setLevel(logging.WARNING) klasa = next((c for c in ALL_BROWSE_SCRAPERS if c.sitetag == a.sitetag), None) if klasa is None: log.error("nie ma browse-scrapera o sitetag=%s", a.sitetag) return 2 scraper = klasa() log.info("catchup %s: %d stron", a.sitetag, a.pages) c = _ingest_iter_into_run( source_kind=SourceKind.scraper, source_name=SCRAPER_SOURCE_NAME, run_label=f"browse-catchup:{a.sitetag}", iterator_factory=lambda: scraper.latest_scenes(max_pages=a.pages), ) log.info("KONIEC catchup %s: %s", a.sitetag, c) return 0 if __name__ == "__main__": raise SystemExit(main())