#!/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%%
%%DOMAIN%%
%%SERVICES%%
""" # 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()