goon/scripts/verify_gone_backfill.py
goon-foss 0f128d2e17 feat(playback): zgloszenie 404/410 z telefonu sprawdzane z serwera
Zrodlo znikalo tylko po dlugim przytrzymaniu przez uzytkownika. Teraz
zgloszenie "Response code: 404/410" uruchamia w tle ponowny resolve z serwera;
martwe dopiero, gdy ekstraktor mowi "usuniete" albo plik z serwera tez daje
404/410 (dwie kontrole). Na sucho na 84 parach z 14 dni: 0 martwych, 83 zywe,
czyli 410 z telefonu prawie zawsze znaczy zly adres, nie skasowany plik.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 14:16:14 +02:00

38 lines
1.6 KiB
Python

"""Jednorazowo: zrodla, ktore telefony zglosily jako 404/410, sprawdzone z serwera.
Ta sama logika co na zywo (app/playback_gone.py), dla zgloszen sprzed wdrozenia.
docker compose exec -T worker python3 /srv/scripts/verify_gone_backfill.py [dni] [--commit] [--limit N]
Bez --commit tylko liczy.
"""
from __future__ import annotations
import sys
from collections import Counter
from sqlalchemy import text
from app.db import session_scope
from app.playback_gone import verify_gone
days = int(next((a for a in sys.argv[1:] if a.isdigit()), "14"))
commit = "--commit" in sys.argv
limit = int(sys.argv[sys.argv.index("--limit") + 1]) if "--limit" in sys.argv else 100000
with session_scope() as s:
pairs = s.execute(text("""
SELECT DISTINCT e.scene_id, e.origin FROM playback_events e
WHERE e.created_at > now() - make_interval(days => :d) AND e.status = 'error'
AND e.error_detail ~* 'response code: (404|410)' AND e.scene_id IS NOT NULL
AND EXISTS (SELECT 1 FROM playback_sources p WHERE p.scene_id = e.scene_id
AND p.origin = e.origin AND p.dead_at IS NULL)
LIMIT :lim"""), {"d": days, "lim": limit}).all()
print(f"par (scena, serwis) do sprawdzenia: {len(pairs)}, {'NA SERIO' if commit else 'na sucho'}", flush=True)
total: Counter = Counter()
per_origin: dict[str, Counter] = {}
for scene_id, origin in pairs:
r = verify_gone(scene_id, origin, dry_run=not commit)
total.update(r)
per_origin.setdefault(origin, Counter()).update(r)
for o, c in sorted(per_origin.items(), key=lambda kv: -kv[1]["checked"]):
print(f" {o:24s} {dict(c)}")
print("razem:", dict(total))