all
🚀 Deploy — JH Photomaton / 🔍 Vérification (push) Has been cancelled
🚀 Deploy — JH Photomaton / 🍓 Deploy sur le Pi (push) Has been cancelled

This commit is contained in:
2026-07-17 00:44:22 +02:00
parent 209f81aa3d
commit 9a006f1457
23 changed files with 3712 additions and 484 deletions
+8 -40
View File
@@ -1,16 +1,6 @@
"""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
"""
"""Webhooks recus de photobooth-app via plugin_commander."""
import asyncio
import logging
from fastapi import APIRouter, Request, Query
@@ -18,7 +8,6 @@ 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
@@ -33,30 +22,25 @@ async def photobooth_webhook(
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)
led.play("countdown", countdown_duration=DEFAULT_COUNTDOWN)
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))
event_svc = getattr(request.app.state, "event_service", None)
if event_svc:
slug = request.app.state.config.event.slug
asyncio.create_task(event_svc.increment(slug, "photos_taken"))
case "start":
led.play("idle")
@@ -65,28 +49,12 @@ async def photobooth_webhook(
led.play("off")
case _:
logger.debug("Événement inconnu: %s", event_key)
logger.debug("Evenement 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