#!/usr/bin/env python3 """Construye presentacion.html: deck autocontenido (fuentes, logo, screenshot y QR embebidos en base64) para que funcione SIN internet en el festival. Uso: python3 ventas/build.py """ import base64 import io import os import segno HERE = os.path.dirname(os.path.abspath(__file__)) ROOT = os.path.abspath(os.path.join(HERE, "..")) URL = "https://synctaps.tapometer.com" def b64(path): with open(path, "rb") as f: return base64.b64encode(f.read()).decode("ascii") def qr_b64(url): """QR oscuro sobre blanco como PNG base64 (segno trae su propio escritor PNG).""" qr = segno.make(url, error="m") buff = io.BytesIO() qr.save(buff, kind="png", scale=12, border=2, dark="#0e1013", light="#ffffff") return base64.b64encode(buff.getvalue()).decode("ascii") tokens = { "@@FONT_REG@@": b64(os.path.join(ROOT, "web/src/assets/fonts/Hando-Regular.otf")), "@@FONT_BOLD@@": b64(os.path.join(ROOT, "web/src/assets/fonts/Hando-Bold.otf")), "@@LOGO@@": b64(os.path.join(ROOT, "web/src/assets/logo_H_White_1.png")), "@@MENU@@": b64(os.path.join(ROOT, "tv-app/store/screenshots/01_menu.png")), "@@STEP_TV@@": b64(os.path.join(ROOT, "ventas/dashboard/step_tv.png")), "@@STEP_BEERS@@": b64(os.path.join(ROOT, "ventas/dashboard/step_beers.png")), "@@STEP_TAPS@@": b64(os.path.join(ROOT, "ventas/dashboard/step_taps.png")), "@@DASH@@": b64(os.path.join(ROOT, "ventas/dashboard/dash_overview.png")), "@@QR@@": qr_b64(URL), } with open(os.path.join(HERE, "presentacion.src.html"), encoding="utf-8") as f: html = f.read() for tok, val in tokens.items(): if tok not in html: raise SystemExit(f"Falta el placeholder {tok} en la plantilla") html = html.replace(tok, val) out = os.path.join(HERE, "presentacion.html") with open(out, "w", encoding="utf-8") as f: f.write(html) kb = os.path.getsize(out) // 1024 print(f"OK {os.path.relpath(out, ROOT)} ({kb} KB, autocontenido)")