- notifier_booth_impression() : appelle /gallery/{event}/photo/{name}/imprimee
apres chaque impression pour mettre a jour le statut dans la galerie en ligne
- Luminosite impression par defaut +15% (corrige photos sombres a l'impression)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Preview live continue pendant la surprise (overlay par-dessus)
- Capture DSLR lancee pendant la surprise (1s de reaction)
- Flash blanc couvre tout PUIS on masque surprise + preview derriere
- Plus de frame flou visible entre surprise et photo
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Preview stoppe AVANT la surprise (plus de frame flou)
- Capture DSLR lancee en meme temps que la surprise (apiPost en parallele)
- 800ms de reaction pendant que le DSLR travaille
- Flash + masquer surprise apres le declenchement
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Watchdog connectivite toutes les 60s (check TCP 1.1.1.1:53)
- Si offline : scan WiFi et reconnexion auto aux reseaux enregistres
- Si internet restaure : flush immediat des spools (email + galerie)
- Surprise : capture declenchee 500ms apres affichage (au lieu de 1.7s apres)
pour capturer la reaction naturelle des gens
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Spool galerie booth : si upload echoue, photo stockee dans
data/booth_spool.json et retentee toutes les 5 min
- Email spool : retry periodique (5 min) au lieu de juste au demarrage
- Les deux spools traites dans la meme boucle async
- Message frontend spool : "sera envoyee des que possible"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- _log_impression() ecrit chaque demande dans data/impressions.jsonl
(timestamp, photo, copies, format, succes, event_id, detail CUPS)
- Delai entre copies passe de 1s a 3s pour fiabiliser multi-copies Mitsubishi
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Backend: reveiller_canon() poll USB toutes les 1s (max 20s) au lieu de sleep(15+25),
3 tentatives gphoto2, temps total 10-30s au lieu de 40s fixe.
Frontend: attend 40s meme si reveil_en_cours=false (reconnexion auto),
messages plus clairs ("Touchez l'ecran et reessayez").
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ce fichier contient SMTP, relais, surprise, evenement actif —
il ne doit jamais etre ecrase par un git pull.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Evite le freeze percu : image prechargee au boot, fade 200ms,
attente img.onload si pas encore prete, re-precharge apres affichage.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Messages erreur camera/impression: texte novice ("Oups!", "Reessayez") au lieu de jargon technique
- kiosk-session.sh: lit le port depuis config.json (plus de http://localhost en dur), healthcheck /api/config, supprime git pull auto au boot
- Activer evenement: reset automatique du compteur photos
- Activer evenement: sync booth.event_id quand galerie live active
- Port par defaut backend: 80 → 8080
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- /api/camera/statut expose reveil_en_cours pour que le frontend sache
- lancerCapture() poll toutes les 2s (max 60s) si Canon en réveil au lieu de fail immédiat
- Fix CSS countdown: .compte-a-rebours span était à 14rem (écrasait .anim-texte par spécificité)
→ chiffres clamp(2rem, 8vw, 5rem), texte clamp(0.8rem, 3vw, 1.5rem)
- Bump cache versions (style v17, camera v18)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Nouvelle carte 'Poses perdues' dans le panneau consommables
- Le ratio ruban optimal pour 10x15 est 0.5 (10cm sur 20cm de panneau)
- Diagnostic enrichi : alerte epuisement, ruban avant papier, % gaspille
- Reset poses perdues avec le ruban
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Onglet Consommables dans General : barres de progression papier/ruban, compteur photos
- Capacites configurables (feuilles par bobine / poses par bobine)
- Reset individuel papier/ruban (quand on change la bobine)
- Diagnostic ratio ruban/papier pour verifier que le rembobinage fonctionne
- Tracking automatique a chaque impression (format-aware)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Reorganisation menu admin en 2 rubriques (General / Evenement)
- Destinations deplace dans Evenement
- Nouveau panneau Videos : upload par situation (montage, depannage, bourrage, rechargement)
- Nouveau panneau Surprise : photo/video affichee ~1s avant capture pour provoquer sourire
- Toggle rembobinage ruban Mitsubishi (StpiDecklist) pour economiser le ruban sur petits formats
- Historique email cloisonne par evenement
- Memoire projet consolidee dans memoire.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Galerie admin : onglet avec sélection photos + impression par lot
- Compteur : compte les copies (×N) et non plus 1 par impression
- Flash blanc immédiat après countdown pour masquer le délai AF
- Erreur imprimante : petit toast discret au lieu de bannière plein écran
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sans ça le Canon reste en LiveView et utilise le contrast-detect AF
(lent et imprécis). Le sleep(0.2) reste supprimé.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Supprime sleep(0.2) avant capture et viewfinder off inutile
- Déplace activer_viewfinder + chauffer_liveview dans un thread
daemon après le save, pour retourner la photo immédiatement
- Supprime pause(150ms) frontend entre fin countdown et capture
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
share.js était chargé après app.js et redéfinissait afficherQR()
avec l'ancienne version (mauvaise URL, mauvais éléments DOM).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Le strip est généré en portrait 600x1800 par design. L'orientation
"paysage" configurée pour 10x15 le faisait pivoter, et rotation_180
l'inversait. Résultat : bandes imprimées à l'envers avec une seule
photo visible par bande après coupe.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- afficherQR() génère un QR vers /g/{event}/view/{photo}?p=
- Page photo-view.html : plein écran + bouton télécharger + galerie
- QR accueil reste la galerie complète, QR après capture = la photo
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Watchdog (30s) : vérifie backend, caméra, chromium, tue les orphelins,
reboot auto après 10 échecs consécutifs (~5min sans service)
- kiosk-session.sh : tue les backends orphelins au démarrage, trap EXIT
pour cleanup quand le kiosk est tué
- camera.py : force release USB avec timeout 2s quand connecter() échoue
- main.py : uvicorn.run(app) au lieu de string pour éviter double import
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Quand capture_preview() echoue (I/O error, miroir bloque), le thread
preview n'envoyait plus de commande PTP au Canon → l'appareil finissait
par s'eteindre via auto power off. Ajoute un keepalive de secours via
get_config() qui declenche ptp_canon_eos_keepdeviceon cote libgphoto2.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Check /tmp/photobooth-maintenance pour bloquer le restart loop
- Vérifie qu'aucun backend ne tourne avant d'en lancer un nouveau
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Module backend/wifi.py : scan nmcli, connexion, mots de passe persistés dans data/wifi_passwords.json
- Gère la locale FR (oui/non), déduplique les AP multiples, prend le meilleur signal
- Onglet WiFi dans le menu admin avec statut, scan, clavier virtuel AZERTY complet
- Réseaux enregistrés avec bouton connecter/oublier et affichage temporaire du mdp
- API: /api/wifi/status, /api/wifi/scan, /api/wifi/connect, /api/wifi/saved, /api/wifi/password/{ssid}
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- WebSocket : reconnexion avec backoff exponentiel au lieu de reload page
- Ecran pause avec tasse de cafe quand le backend est injoignable
- Endpoint /api/health pour monitoring externe
- Watchdog systemd (sd_notify READY=1 + WATCHDOG=1 toutes les 10s)
- Service systemd durci (Type=notify, WatchdogSec=30, KillMode, limites)
- WiFi watchdog : script + timer systemd, verifie la gateway toutes les 60s
- Destinations : fallback url_tunnel (WireGuard) en priorite
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- camera.py: fix fuite FD USB sur échec reconnexion (gp.Camera non libéré),
cleanup PTP session avant init, catch toutes exceptions preview/capture,
deconnecter() avec timeout thread + force del pour libérer le port USB
- main.py: thread preview anti-crash (outer try/except), reconnexion DSLR
même si preview actif, notification camera_erreur après échec capture,
intégration module éclairage (analyse luminosité visage via WS)
- printer.py: mode pellicule (-2up) ignoré par le cadre imposé événement
- eclairage.py: nouveau module analyse luminosité visage (Haar + HSV)
- camera.js: indicateur éclairage temps réel (score/100 + visages)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- impression.offsets_coupe_mm : {haut, bas, gauche, droite} compense la coupe asymétrique
- impression.rotation_180 : retourne l'image si le driver inverse le sens
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Les dimensions FORMATS sont en portrait — sans inversion, une photo paysage
était crop en portrait pour l'impression.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- surveiller_dslr: reset USB ioctl après 2 échecs, double reset après 3
- deconnecter(): timeout threading 3s pour éviter blocage PTP
- CSS: .preview-live .cadre-overlay sans scaleX(-1)
- Admin événement: lien direct vers galerie en ligne
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Toggles formats (10x15, 15x20, strip) par evenement
- Strip desactive masque le bouton pellicule sur l'accueil
- Cadre impose/defaut s'applique uniquement sur 10x15 et 15x20 (pas strip)
- Upload cadre evenement le copie dans les deux formats automatiquement
- Section cadres admin simplifiee (un seul bloc au lieu de 3)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>