Explorer
/tmp/patch_images_p3.py
← Zurück ↓ Download
from pathlib import Path

# Persist the complete image part of the intake signal model.
p = Path('/opt/struktur/social-media-radar/signal_db.py')
s = p.read_text()
old = '''        # AA-045: Felder des einheitlichen Signalmodells befuellen\n        aa045_enrich.enrich_signal_row(conn, signal_id, data)\n\n        # AA-045-F5: Watch-Entity-Felder\n'''
new = '''        # AA-045: Felder des einheitlichen Signalmodells befuellen\n        aa045_enrich.enrich_signal_row(conn, signal_id, data)\n\n        # Bildfelder des einheitlichen Signalmodells persistieren.\n        # image_found darf nur vom Intake/Refresh gesetzt werden, nachdem eine\n        # belastbare Bildquelle ermittelt bzw. validiert wurde.\n        if data.get("image_url"):\n            conn.execute("""\n                UPDATE signals SET image_url=?, image_source=?, image_found=?,\n                    final_article_url=?, cached_image_path=?, image_checked_at=?\n                WHERE signal_id=?\n            """, (\n                data.get("image_url"), data.get("image_source") or "",\n                int(bool(data.get("image_found"))),\n                data.get("final_article_url"), data.get("cached_image_path"),\n                data.get("image_checked_at"), signal_id,\n            ))\n\n        # AA-045-F5: Watch-Entity-Felder\n'''
if old not in s:
    raise SystemExit('signal_db target not found')
p.write_text(s.replace(old, new, 1))

# RSS explicit enclosure/media image is a real candidate and is now persisted as such.
p = Path('/opt/struktur/social-media-radar/intake/rss_intake.py')
s = p.read_text()
old = '            "image_url":            item.get("image_url", ""),\n'
new = '            "image_url":            item.get("image_url", ""),\n            "image_source":          ("rss_media" if item.get("image_url") else ""),\n            "image_found":           1 if item.get("image_url") else 0,\n'
if old not in s:
    raise SystemExit('rss target not found')
p.write_text(s.replace(old, new, 1))

# Relative/protocol-relative OG image URLs must be resolved against the final article URL.
p = Path('/opt/struktur/social-media-radar/intake/og_fetch.py')
s = p.read_text()
s = s.replace('import urllib.error\n', 'import urllib.error\nfrom urllib.parse import urljoin\n')
s = s.replace('        img_url = _extract_og_image(html)\n', '        img_url = _extract_og_image(html)\n        if img_url:\n            img_url = urljoin(final_url, img_url)\n')
p.write_text(s)

# The Cockpit API must expose the cache field as well as the explicit URL field.
p = Path('/opt/struktur/social-media-agent/app.py')
s = p.read_text()
old = '            " COALESCE(source_count,1) as source_count, topic_de, image_url,"\n'
new = '            " COALESCE(source_count,1) as source_count, topic_de, image_url,"\n            " COALESCE(cached_image_path,\'\') as cached_image_path,"\n'
if old not in s:
    raise SystemExit('app select target not found')
p.write_text(s.replace(old, new, 1))