From 0a918666b307e75a53f8fdc28cfe3f968076002b Mon Sep 17 00:00:00 2001 From: Jules Date: Fri, 5 Jun 2026 22:32:46 +0200 Subject: [PATCH] =?UTF-8?q?Camera=20:=20viewfinder=20permanent=20+=20previ?= =?UTF-8?q?ew=20live=20pendant=20compte=20=C3=A0=20rebours?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - activer_viewfinder() à la connexion DSLR (miroir levé dès le démarrage) - activer_viewfinder() après chaque capture (certains Canon le désactivent) - Suppression desactiver_viewfinder() — miroir ne redescend plus jamais - lancerPreview() au début du compte à rebours, arreterPreview() juste avant la capture - Preview live fonctionnel : l'utilisateur se voit pendant tout le compte à rebours Co-Authored-By: Claude Sonnet 4.6 --- backend/camera.py | 26 ++++++++------------------ frontend/js/camera.js | 4 ++-- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/backend/camera.py b/backend/camera.py index c92a335..da9e409 100644 --- a/backend/camera.py +++ b/backend/camera.py @@ -85,6 +85,7 @@ class Camera: self.connectee = True self.mode = "gphoto2" log.info("Camera DSLR connectee") + self.activer_viewfinder() return True except gp.GPhoto2Error as e: log.warning(f"Pas de DSLR : {e}") @@ -157,6 +158,7 @@ class Camera: ) tmp_path = str(chemin_dest) + ".tmp" fichier_camera.save(tmp_path) + self.activer_viewfinder() # Miroir relevé immédiatement après la prise img = PILImage.open(tmp_path) if img.width > 4000: ratio = 4000 / img.width @@ -199,31 +201,19 @@ class Camera: return None # Pas de simulation ni webcam en dehors du mode dedie def activer_viewfinder(self): - """Active le LiveView sur les Canon.""" + """Active le LiveView (miroir levé en permanence) sur les Canon.""" if self.mode != "gphoto2" or not self.connectee: return try: - cfg = self.camera.get_config() - vf = cfg.get_child_by_name("viewfinder") - vf.set_value(1) - self.camera.set_config(cfg) + with self._gp_lock: + cfg = self.camera.get_config() + vf = cfg.get_child_by_name("viewfinder") + vf.set_value(1) + self.camera.set_config(cfg) log.info("Viewfinder activé") except Exception as e: log.warning(f"Viewfinder non supporté : {e}") - def desactiver_viewfinder(self): - """Désactive le LiveView.""" - if self.mode != "gphoto2" or not self.connectee: - return - try: - cfg = self.camera.get_config() - vf = cfg.get_child_by_name("viewfinder") - vf.set_value(0) - self.camera.set_config(cfg) - log.info("Viewfinder désactivé") - except Exception as e: - log.warning(f"Viewfinder non supporté : {e}") - def _preview_gphoto2(self) -> bytes | None: try: fichier = self.camera.capture_preview() diff --git a/frontend/js/camera.js b/frontend/js/camera.js index de8ce72..986e528 100644 --- a/frontend/js/camera.js +++ b/frontend/js/camera.js @@ -111,12 +111,12 @@ async function lancerCapture() { compteurEl.textContent = `Photo ${i + 1} / ${nbPhotos}`; } - // Compte a rebours SANS preview (libere la camera) + lancerPreview(); // Miroir live pendant le compte à rebours await compteARebours(); + arreterPreview(); // Libère le bus USB gphoto2 pour la capture afficherFlash(); - // Preview arrete -> capture propre sans conflit gphoto2 const promesseCapture = apiPost('/api/capturer').catch(() => null); let resultat = await promesseCapture; let erreurReseau = false;