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>
- /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>
- 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>
- 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>
- 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>
- 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>
- Overlay cadre sur les 3 ecrans : live (capture), preview (filtres), partage
- chargerCadreImpose() au debut de chaque capture : affiche le cadre event
- Photos sauvegardees sans cadre, cadre applique uniquement a l'impression
- afficherCadreOverlay cherche d'abord dans les cadres evenement
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Palette bois fonce (#1a0f08/#2b1810), bronze (#b08d57), parchemin (#f0e6d2).
Polices MedievalSharp + Cinzel. Boutons style bois sculpte avec bordures bronze.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- CRUD evenements : creer, activer, editer, supprimer dans panneau admin
- Cadres specifiques par evenement (aucun/disponible/defaut/impose)
- Fix cadre paysage deformé : rotation auto si orientation ne correspond pas
- Photos non imprimees vont dans sous-dossier "non_imprimees" (USB/FTP)
au lieu d'etre ignorees ; booth recoit toujours toutes les photos
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remplace le toggle "Site internet" par "Galerie en ligne" dans le panneau Destinations
- Supprime la section dupliquée "Galerie Live" du panneau Fonctions
- Le booth reçoit toutes les photos (imprimées ou non), le filtre sauvegarder_tout ne s'applique qu'à USB/FTP
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- QR code inclut le mot de passe (?p=XXXX) pour acces direct sans saisie
- Supprime le code texte visible sur l'ecran d'accueil, QR plus petit
- Bouton admin 'Imprimer flyer QR galerie' genere un 10x15 avec
nom evenement, QR code, texte invitation, design assorti
- Auto-login ajoute cote serveur booth (booth.copydev.fr)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Formulaire email : overlay fullscreen au lieu d'inline (debordait de l'ecran)
- Historique emails : stocke chaque adresse dans data/emails_history.json
- Suggestions : affiche les emails deja saisis en pills cliquables,
filtrees au fur et a mesure de la saisie
- API GET /api/emails/historique + DELETE pour reset
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
La coupe physique du K60 n'est jamais parfaitement centree, donc une marge
noire trop fine fait perdre la pellicule d'un cote du strip dedouble. Marge
de coupe (perforations) elargie de 34 a 55px (~4.6mm) de chaque cote.
Ajoute aussi un warmup LiveView (_chauffer_liveview) juste apres la remontee
du miroir post-capture : consomme les ~1-2s de stabilisation pendant le
spinner de traitement plutot que de laisser le preview du countdown suivant
figé sur l'ancienne photo.
La PageSize CUPS w288h432-div2 declare la meme taille de page que w288h432
(confirme par le PPD Mitsubishi) : le K60 coupe la feuille pleine apres
impression, il ne duplique pas une image fournie a taille reduite. On envoyait
la bande seule (600x1800) sous cette PageSize, donc CUPS l'etirait pour
remplir la feuille 1200x1800 puis le K60 la coupait en 2 — d'ou la photo
etiree et coupee au lieu de 2 bandes identiques.
Ajoute aussi le miroir horizontal sur le preview live (selfie) et un flou de
chargement pendant le bref delai de remontee du miroir DSLR apres capture,
pour eviter l'impression d'image figee sur la photo precedente.
creer_strip() produisait une bande paysage (1800x595) alors que printer.py
('10x15-2up' -> PageSize ...-div2) et tous les cadres existants (assets/cadres/strip/*.png)
attendent une bande portrait fixe 600x1800 (5x15cm), dupliquee et coupee
automatiquement par l'imprimante. Le mismatch faisait pivoter/etirer
l'image a l'impression (StpiShrinkOutput=Crop sur un ratio incompatible),
d'ou le rendu deforme coupe en 2 mauvais morceaux au lieu de 2 pellicules
identiques.
- creer_strip() : bande 600x1800 portrait, photos empilees verticalement,
perforations sur les cotes (au lieu de haut/bas)
- Cadre de visee live (camera.js) : formule de ratio mise a jour en
consequence pour rester fidele au resultat final
L'apercu live montrait le plein cadre camera (ratio ~3:2) alors que le
recadrage final de chaque case (creer_strip/creer_collage) est plus carre
(~1.11:1 pour 3 photos en pellicule) : le cadrage visualise pendant le
compte a rebours ne correspondait pas au resultat imprime.
Ajoute un cadre pointille superpose au live preview, dimensionne en
reproduisant cote JS la meme formule de recadrage que backend/collage.py,
visible uniquement en mode multi-shot (strip ou collage).
Le bloc partage (photo + boutons + form impression) pouvait depasser la
hauteur de l'ecran quand le choix du nombre d'exemplaires s'affichait.
La miniature absorbe maintenant l'espace restant (flex + min-height:0)
au lieu d'une hauteur fixe en vh, les autres elements gardent leur taille.
- Flash integre Canon activable/desactivable depuis l'admin (configurer_flash)
- Popup de choix de cadre juste avant impression, layout sans defilement (flex nowrap + aspect-ratio)
- Capture : ignore camera_erreur pendant une capture en cours (laisse l'API trancher)
- surveiller_dslr : grace period preview augmentee a 2s, reapplique la config camera apres reconnexion
- start.sh simplifie (Chromium gere par kiosk-session.sh), remote debugging port 9222 active
- camera.py : désactiver LiveView avant capture (viewfinder=0) → miroir abaissé →
AF phase-détection Canon actif. Remplace _declencher_af_liveview (autofocusdrive=1
pouvait bloquer sur certains corps Canon). activer_viewfinder() après la prise.
- main.py : fix bug global _preview_actif dans api_capturer (était variable locale,
le global restait True). Timeout asyncio 20s sur run_in_executor pour éviter freeze
permanent si capture bloque. Logs INFO avant/après capture.
- camera.js + index.html + style.css : spinner "Capture en cours..." entre le flash
et l'affichage du résultat. Cacher le spinner dans afficherErreurCapture aussi.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Icône discrète coin bas-gauche, visible seulement si photostation installée
- Popup PIN (4 chiffres) avant lancement
- Backend : /api/photostation/disponible + /api/photostation/lancer
- kiosk-session.sh : Chromium attend le flag /tmp/photostation_running avant redémarrage
- Script install-photostation.sh pour déploiement sur la Surface
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Intégration selphy_print (backend CUPS dyesub Mitsubishi CP-K60DW-S)
- Formats impression : 15x20, 10x15, 10x15 2-strips avec cadre et orientation portrait/paysage
- Cadres d'impression par format (strip/10x15/15x20) : upload, sélection, aperçu live
- Cadres démo générés : pellicule noir/vintage/couleurs + bordures classique/doré/rose gold
- Écran de choix de cadre avant capture (clic direct, aperçu grand format)
- Filtres réduits à 3 (Couleur, N&B, Sépia) et appliqués sur tous les strips
- Port 80 via authbind, route /admin avec redirection auto depuis poste distant
- Autologin LightDM corrigé (pam-autologin-service)
- Bouton évacuer bourrage papier dans admin
- Fix : _gp_lock manquant dans Camera.__init__
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Endpoint /api/systeme/info : IPs par interface, hostname, uptime,
disque, RAM, temperature CPU, version Python, statut camera
- Onglet Infos dans le backoffice avec affichage visuel (barres, couleurs)
- Bouton Actualiser pour rafraichir les donnees en temps reel
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Overlay semi-transparent sur le preview quand camera_erreur recue
- Timeout 3s : si aucune frame recue, affiche l'erreur automatiquement
- Disparait des que les frames reprennent (camera_ok ou nouvelle frame)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>