"""Webhooks reçus de photobooth-app via plugin_commander. photobooth-app envoie un GET sur /api/webhook/photobooth?event_key=XXX&mediaitem_type=image pour chaque événement de capture. Événements : counting → countdown en cours (LEDs remplissage vert) capture → flash photo (LEDs flash blanc) captured → photo prise (LEDs violet) finished → traitement terminé (LEDs bleu → retour idle + relay ON) start/stop → démarrage/arrêt photobooth-app """ import logging from fastapi import APIRouter, Request, Query logger = logging.getLogger(__name__) router = APIRouter() # Durée par défaut du countdown (en secondes) — peut être overridé par action DEFAULT_COUNTDOWN = 5.0 @router.get("/webhook/photobooth") async def photobooth_webhook( request: Request, event_key: str = Query(default=""), mediaitem_type: str = Query(default=""), ): led = request.app.state.led_service btn = request.app.state.button_service ws = request.app.state.ws_manager logger.info("Webhook photobooth: event=%s type=%s", event_key, mediaitem_type) await ws.broadcast({"type": "photobooth_event", "event": event_key, "media_type": mediaitem_type}) match event_key: case "counting": # Countdown en cours — remplissage LED vert # On cherche la durée du countdown dans la config de l'action courante countdown_duration = _get_countdown_duration(request) led.play("countdown", countdown_duration=countdown_duration) case "capture": # Flash photo led.play("capture") case "captured": # Photo prise, traitement en cours led.play("captured") case "finished": # Traitement terminé led.play("finished") # Réactive le relay après l'animation "finished" (durée ~2s gérée par le service LED) import asyncio asyncio.create_task(_delayed_relay_on(btn, 2.5)) case "start": led.play("idle") case "stop": led.play("off") case _: logger.debug("Événement inconnu: %s", event_key) return {"ok": True, "event": event_key} async def _delayed_relay_on(btn, delay: float): import asyncio await asyncio.sleep(delay) if btn: btn.relay_on() def _get_countdown_duration(request: Request) -> float: """ Essaie de récupérer la durée du countdown depuis la config photobooth-app en lisant le dernier index d'action déclenché par le bouton. Retourne la valeur par défaut si indisponible. """ try: btn = request.app.state.button_service # On pourrait stocker le dernier index dans le button_service # Pour l'instant on retourne 5s par défaut return DEFAULT_COUNTDOWN except Exception: return DEFAULT_COUNTDOWN