#!/usr/bin/env python3
"""Génère les bannières de partage (Open Graph) des 3 sites gardiens.
Rendu HTML → Chromium (Playwright) → orchestrator/web/og-ka{2,4,6}.png
(2400×1260, ratio 1200:630). Langage visuel Groupe KA : papier, encre,
lime, ombres décalées dures + accent/battement ECG propres à chaque agent.
Usage (laptop) : python3 deploy/make_og_images.py
"""
import json
import tempfile
from pathlib import Path
from playwright.sync_api import sync_playwright
ROOT = Path(__file__).resolve().parent.parent
WEB = ROOT / "orchestrator" / "web"
TOPO = json.loads((ROOT / "topology.json").read_text())
# couleur du battement ECG (celle des favicons, plus dense que l'accent pastel)
ECG = {"ka2": "#5b9df5", "ka4": "#ff9f2e", "ka6": "#a78bfa"}
SERVICES_LABEL = {
"ka2": "lou·ka · immo·ka · resto·ka",
"ka4": "auto·ka · food·ka · sorti·ka",
"ka6": "fabri·ka · job·ka · créa·ka",
}
TPL = """
ka·%%NUM%%guardian
groupe·KA
agent gardien autonome · connecteurs du groupe ka
%%TAGLINE_HTML%%
"""
# mot à surligner dans la tagline (image de marque : pastille accent de l'agent)
def tagline_html(agent: str, tagline: str) -> str:
first, _, rest = tagline.partition(" ")
return f'{first} {rest}'
def main() -> None:
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page(viewport={"width": 1200, "height": 630}, device_scale_factor=2)
for agent, me in TOPO["agents"].items():
html = (TPL
.replace("%%NUM%%", agent[-1])
.replace("%%ACCENT%%", me["accent"])
.replace("%%ACCENT2%%", me["accent2"])
.replace("%%ECG%%", ECG[agent])
.replace("%%DOMAIN%%", me["domain"])
.replace("%%SERVICES%%", SERVICES_LABEL[agent])
.replace("%%TAGLINE_HTML%%", tagline_html(agent, me["tagline"])))
tmp = Path(tempfile.gettempdir()) / f"og-{agent}.html"
tmp.write_text(html)
page.goto(tmp.as_uri())
page.evaluate("document.fonts.ready.then(() => {})")
page.wait_for_timeout(900)
out = WEB / f"og-{agent}.png"
page.screenshot(path=str(out))
print(f"✓ {out.relative_to(ROOT)}")
browser.close()
if __name__ == "__main__":
main()