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))