From 9a6ede02f6ae00348d1ef38ef549e60004bd4717 Mon Sep 17 00:00:00 2001 From: Jules Date: Wed, 8 Apr 2026 22:17:20 +0200 Subject: [PATCH] Supprimer tout fallback webcam/simulation quand le DSLR est absent - Preview gphoto2 echoue -> None direct, pas de webcam ni simulation - Connexion sans DSLR -> mode erreur, camera non connectee - Suppression _preview_webcam_fallback et _init_preview_fallback - WS preview : appel direct camera.preview(), plus de logique speciale Co-Authored-By: Claude Sonnet 4.6 --- backend/camera.py | 50 ++++++++--------------------------------------- backend/main.py | 10 +--------- 2 files changed, 9 insertions(+), 51 deletions(-) diff --git a/backend/camera.py b/backend/camera.py index 3d25761..5d41823 100644 --- a/backend/camera.py +++ b/backend/camera.py @@ -63,7 +63,6 @@ class Camera: self.mode = "simulation" # "gphoto2", "webcam", "simulation" self.webcam = None self.webcam_index = -1 - self._preview_webcam_fallback = None self.preview_dslr_ok = True # True si le dernier preview DSLR a reussi def connecter(self, source=None) -> bool: @@ -86,17 +85,11 @@ class Camera: except gp.GPhoto2Error as e: log.warning(f"Pas de DSLR : {e}") - # Fallback webcam si pas de source specifique - if source is None: - webcams = lister_webcams() - if webcams: - return self._connecter_webcam(webcams[0]["index"]) - - # Fallback simulation - log.info("Mode simulation active") - self.connectee = True - self.mode = "simulation" - return True + # Pas de DSLR disponible : mode erreur, pas de fallback + log.warning("Aucun DSLR disponible, camera non connectee") + self.connectee = False + self.mode = "erreur" + return False def _connecter_webcam(self, index: int) -> bool: """Connecte une webcam via OpenCV.""" @@ -115,9 +108,6 @@ class Camera: def deconnecter(self): """Deconnecte l'appareil photo.""" - if self._preview_webcam_fallback: - self._preview_webcam_fallback.release() - self._preview_webcam_fallback = None if self.camera and GPHOTO2_DISPONIBLE: try: self.camera.exit() @@ -202,34 +192,10 @@ class Camera: return self._preview_webcam() elif self.mode == "gphoto2": data = self._preview_gphoto2() - if data: - self.preview_dslr_ok = True - return data - self.preview_dslr_ok = False - # Fallback webcam pour le preview si le DSLR ne supporte pas le live view - if not self._preview_webcam_fallback: - self._init_preview_fallback() - if self._preview_webcam_fallback: - ret, frame = self._preview_webcam_fallback.read() - if ret: - _, buf = cv2.imencode(".jpg", frame, [cv2.IMWRITE_JPEG_QUALITY, 70]) - return buf.tobytes() - return self._preview_simulation() + self.preview_dslr_ok = data is not None + return data # None si le DSLR ne repond pas, pas de fallback else: - return self._preview_simulation() - - def _init_preview_fallback(self): - """Ouvre une webcam pour le preview quand le DSLR ne supporte pas le live view.""" - webcams = lister_webcams() - for wc in webcams: - cap = cv2.VideoCapture(wc["index"]) - if cap.isOpened(): - cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) - cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) - self._preview_webcam_fallback = cap - log.info(f"Preview fallback webcam : {wc['nom']}") - return - log.warning("Aucune webcam disponible pour le preview fallback") + return None # Pas de simulation ni webcam en dehors du mode dedie def _preview_gphoto2(self) -> bytes | None: try: diff --git a/backend/main.py b/backend/main.py index adb63ec..ad638ef 100644 --- a/backend/main.py +++ b/backend/main.py @@ -635,15 +635,7 @@ async def traiter_message_ws(msg: dict, ws: WebSocket): elif type_msg == "preview": import time as _time global _dernier_envoi_erreur_preview - # Pendant une capture DSLR, utiliser directement la webcam fallback - donnees = None - if capture_en_cours and camera._preview_webcam_fallback: - ret, frame = camera._preview_webcam_fallback.read() - if ret: - _, buf = cv2.imencode(".jpg", frame, [cv2.IMWRITE_JPEG_QUALITY, 70]) - donnees = buf.tobytes() - else: - donnees = camera.preview() + donnees = camera.preview() if donnees: b64 = base64.b64encode(donnees).decode("ascii") await ws.send_json({"type": "preview", "image": f"data:image/jpeg;base64,{b64}"})