diff --git a/scripts/sxyprn_reap_dead.py b/scripts/sxyprn_reap_dead.py index 2dc6ad7..91a8f46 100644 --- a/scripts/sxyprn_reap_dead.py +++ b/scripts/sxyprn_reap_dead.py @@ -78,6 +78,8 @@ def _probe(page_url: str) -> str: def main(argv: list[str] | None = None) -> int: p = argparse.ArgumentParser() p.add_argument("--limit", type=int, default=0, help="ile źródeł sprawdzić (0 = wszystkie żywe)") + p.add_argument("--after-id", default=None, + help="pomin zrodla o id <= podanego (wznowienie przerwanego przebiegu)") p.add_argument("--dry-run", action="store_true", help="nie oznaczaj, tylko policz") a = p.parse_args(argv) @@ -87,9 +89,17 @@ def main(argv: list[str] | None = None) -> int: for noisy in ("httpx", "httpcore", "urllib3"): logging.getLogger(noisy).setLevel(logging.WARNING) + # Wznowienie bez mielenia od nowa: przebieg idzie ZAWSZE `ORDER BY id`, więc wszystko + # poniżej podanego id zostało już sprawdzone. Bez tego wznowienie po przerwaniu + # sprawdzało ponownie 100 tys. źródeł POTWIERDZONYCH jako żywe, czyli 73% pracy i + # tyle samo zbędnych żądań do sxyprn (2026-08-27). Granicę bierzesz z bazy: + # SELECT max(id::text)::uuid FROM playback_sources + # WHERE dead_reason = 'sxyprn-reap: Post Not Found'; + _po_id = f"AND id > '{a.after_id}'" if a.after_id else "" sql = f""" SELECT id, page_url FROM playback_sources WHERE origin = '{_ORIGIN}' AND dead_at IS NULL AND page_url IS NOT NULL + {_po_id} ORDER BY id """ if a.limit: