"""AA-045-F5: Intake-Qualitätsfilter (Scheinsignale gar nicht erst speichern)."""
p = "/opt/struktur/social-media-radar/intake/watch_intake.py"
s = open(p).read()
old = '''def _store(entity: dict, platform: str, url: str, title: str, summary: str,
image_url: str = "") -> str | None:
"""Speichert einen Watch-Treffer als Signal (idempotent über URL-Dedup)."""'''
new = '''def _is_scheinsignal(title: str, url: str) -> str | None:
"""AA-045-F5 §29: erkennt nicht-postwürdige Treffer. Liefert Grund oder None."""
t = (title or "").strip()
tl = t.lower()
if not t or t.startswith("(ohne Titel)"):
return "ohne Titel"
if "instagram.com" in url:
return "Instagram-Seite"
if ".webflow." in tl:
return "CSS-Klassentitel"
# Startseiten-/Sprachvarianten ohne konkreten Beitrag
if any(x in url for x in ("?lang=", "/en-gb", "/en/", "/de/", "/es/", "/ru/", "/sv/")) and len(t) < 30:
return "Startseiten-/Sprachvariante"
return None
def _store(entity: dict, platform: str, url: str, title: str, summary: str,
image_url: str = "") -> str | None:
"""Speichert einen Watch-Treffer als Signal (idempotent über URL-Dedup).
Scheinsignale (Loginseiten, Startseiten, CSS-Klassen) werden abgewiesen."""'''
assert old in s, "anchor1 fehlt"
s = s.replace(old, new)
old2 = ''' expires = (datetime.now(timezone.utc) + timedelta(hours=336)).isoformat()
signal = {'''
new2 = ''' skip_reason = _is_scheinsignal(title, url)
if skip_reason:
return None # kein Signal, kein Fehler (§29)
expires = (datetime.now(timezone.utc) + timedelta(hours=336)).isoformat()
signal = {'''
assert old2 in s, "anchor2 fehlt"
s = s.replace(old2, new2)
open(p, "w").write(s)
print("watch_intake Qualitätsfilter eingebaut")