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 <noreply@anthropic.com>
This commit is contained in:
2026-04-08 22:17:20 +02:00
parent deca890b34
commit 9a6ede02f6
2 changed files with 9 additions and 51 deletions

View File

@@ -63,7 +63,6 @@ class Camera:
self.mode = "simulation" # "gphoto2", "webcam", "simulation" self.mode = "simulation" # "gphoto2", "webcam", "simulation"
self.webcam = None self.webcam = None
self.webcam_index = -1 self.webcam_index = -1
self._preview_webcam_fallback = None
self.preview_dslr_ok = True # True si le dernier preview DSLR a reussi self.preview_dslr_ok = True # True si le dernier preview DSLR a reussi
def connecter(self, source=None) -> bool: def connecter(self, source=None) -> bool:
@@ -86,17 +85,11 @@ class Camera:
except gp.GPhoto2Error as e: except gp.GPhoto2Error as e:
log.warning(f"Pas de DSLR : {e}") log.warning(f"Pas de DSLR : {e}")
# Fallback webcam si pas de source specifique # Pas de DSLR disponible : mode erreur, pas de fallback
if source is None: log.warning("Aucun DSLR disponible, camera non connectee")
webcams = lister_webcams() self.connectee = False
if webcams: self.mode = "erreur"
return self._connecter_webcam(webcams[0]["index"]) return False
# Fallback simulation
log.info("Mode simulation active")
self.connectee = True
self.mode = "simulation"
return True
def _connecter_webcam(self, index: int) -> bool: def _connecter_webcam(self, index: int) -> bool:
"""Connecte une webcam via OpenCV.""" """Connecte une webcam via OpenCV."""
@@ -115,9 +108,6 @@ class Camera:
def deconnecter(self): def deconnecter(self):
"""Deconnecte l'appareil photo.""" """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: if self.camera and GPHOTO2_DISPONIBLE:
try: try:
self.camera.exit() self.camera.exit()
@@ -202,34 +192,10 @@ class Camera:
return self._preview_webcam() return self._preview_webcam()
elif self.mode == "gphoto2": elif self.mode == "gphoto2":
data = self._preview_gphoto2() data = self._preview_gphoto2()
if data: self.preview_dslr_ok = data is not None
self.preview_dslr_ok = True return data # None si le DSLR ne repond pas, pas de fallback
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()
else: else:
return self._preview_simulation() return None # Pas de simulation ni webcam en dehors du mode dedie
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")
def _preview_gphoto2(self) -> bytes | None: def _preview_gphoto2(self) -> bytes | None:
try: try:

View File

@@ -635,15 +635,7 @@ async def traiter_message_ws(msg: dict, ws: WebSocket):
elif type_msg == "preview": elif type_msg == "preview":
import time as _time import time as _time
global _dernier_envoi_erreur_preview global _dernier_envoi_erreur_preview
# Pendant une capture DSLR, utiliser directement la webcam fallback donnees = camera.preview()
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()
if donnees: if donnees:
b64 = base64.b64encode(donnees).decode("ascii") b64 = base64.b64encode(donnees).decode("ascii")
await ws.send_json({"type": "preview", "image": f"data:image/jpeg;base64,{b64}"}) await ws.send_json({"type": "preview", "image": f"data:image/jpeg;base64,{b64}"})