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:
@@ -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:
|
||||||
|
|||||||
@@ -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}"})
|
||||||
|
|||||||
Reference in New Issue
Block a user