Fix strip (K60 coupe auto), diagnostic preview, nettoyage

Strip 10x15 :
- Envoie la strip simple avec format 10x15-2up (w288h432-div2)
  le K60 duplique et coupe automatiquement → plus de papier non coupé
- Supprime creer_impression_strip et le 2-up manuel avec marges blanches
- api/imprimer accepte format_papier depuis le frontend
- Frontend stocke formatImpression et le passe à l'impression

Diagnostic preview :
- GET /api/camera/debug : teste capture_preview(), liste les widgets
  config gphoto2, état du thread → permet de voir l'erreur exacte

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-08 16:52:13 +02:00
parent 1364b62297
commit 0b4c5f9430
3 changed files with 46 additions and 8 deletions

View File

@@ -25,7 +25,7 @@ except ImportError:
gp = None
from backend.gallery import lister_photos, compter_photos, supprimer_photo, vider_galerie
from backend.effects import appliquer_filtre, appliquer_overlay, chroma_key, lister_overlays, lister_fonds, lister_cadres, FILTRES
from backend.collage import creer_strip, creer_collage, creer_impression_strip
from backend.collage import creer_strip, creer_collage
from backend.destinations import distribuer_photo, detecter_usb, compteur_restant, reset_compteur, recuperer_booth_password
from backend.printer import lister_imprimantes, imprimer
from backend.mailer import envoyer_photo
@@ -396,6 +396,38 @@ async def api_camera_statut():
}
@app.get("/api/camera/debug")
async def api_camera_debug():
"""Diagnostic complet de la caméra (preview, viewfinder, erreurs gphoto2)."""
info = {
"mode": camera.mode,
"connectee": camera.connectee,
"preview_actif": _preview_actif,
"derniere_frame_ok": _derniere_frame_preview is not None,
"preview_none_count": _preview_none_count,
"capture_en_cours": capture_en_cours,
}
if camera.mode == "gphoto2" and camera.connectee:
loop = asyncio.get_event_loop()
try:
frame = await loop.run_in_executor(None, camera._preview_gphoto2)
info["test_preview"] = "ok" if frame else "retourne None"
info["test_preview_taille"] = len(frame) if frame else 0
except Exception as e:
info["test_preview"] = f"ERREUR : {e}"
try:
cfg_names = []
with camera._gp_lock:
cfg = camera.camera.get_config()
for i in range(cfg.count_children()):
child = cfg.get_child(i)
cfg_names.append(child.get_name())
info["config_widgets_top"] = cfg_names
except Exception as e:
info["config_widgets_top"] = f"ERREUR : {e}"
return info
@app.post("/api/camera/reconnecter")
async def api_camera_reconnecter(body: dict = {}):
camera.deconnecter()
@@ -487,13 +519,13 @@ async def api_strip(donnees: dict):
return JSONResponse({"erreur": f"Photo introuvable : {n}"}, status_code=404)
chemins.append(c)
chemin_strip = creer_strip(chemins)
# Creer aussi la page d'impression (2 bandes sur 10x15 paysage)
chemin_print = creer_impression_strip(chemin_strip)
return {
"nom": chemin_strip.name,
"chemin": f"/data/exports/{chemin_strip.name}",
"impression": chemin_print.name,
"chemin_impression": f"/data/exports/{chemin_print.name}",
# La strip elle-même est envoyée avec format 10x15-2up :
# le K60 duplique et coupe automatiquement via -div2
"impression": chemin_strip.name,
"format_impression": "10x15-2up",
}
@@ -652,8 +684,9 @@ async def api_imprimer(donnees: dict):
chemin = DOSSIER_PHOTOS / nom
if not chemin.exists():
return JSONResponse({"erreur": "Photo introuvable"}, status_code=404)
cadre_override = donnees.get("cadre") # cadre choisi en session, prioritaire sur le config
resultat = imprimer(chemin, copies=copies, cadre_override=cadre_override)
cadre_override = donnees.get("cadre")
format_papier = donnees.get("format_papier") or None
resultat = imprimer(chemin, copies=copies, cadre_override=cadre_override, format_papier=format_papier)
if resultat.get("succes"):
distribuer_photo(chemin, imprimee=True)
return resultat