Backend FastAPI complet : camera gphoto2, filtres/overlays Pillow, chroma key OpenCV, multi-shot/collage, GIF, impression CUPS, email SMTP, QR code. Frontend web vanilla (HTML/CSS/JS) pour Chromium kiosk. Menu admin cache (appui long coin ecran). Toutes les fonctionnalites activables/desactivables. Scripts install + systemd pour RPi4. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
82 lines
2.4 KiB
Python
82 lines
2.4 KiB
Python
import logging
|
|
from pathlib import Path
|
|
|
|
from backend.config import charger_config
|
|
|
|
log = logging.getLogger("photobooth.printer")
|
|
|
|
# Essayer d'importer cups
|
|
try:
|
|
import cups
|
|
CUPS_DISPONIBLE = True
|
|
except ImportError:
|
|
CUPS_DISPONIBLE = False
|
|
log.warning("pycups non installe, impression indisponible")
|
|
|
|
|
|
def lister_imprimantes() -> list[dict]:
|
|
"""Liste les imprimantes disponibles via CUPS."""
|
|
if not CUPS_DISPONIBLE:
|
|
return [{"nom": "[Simulation] Imprimante virtuelle", "statut": "prete"}]
|
|
|
|
try:
|
|
conn = cups.Connection()
|
|
imprimantes = conn.getPrinters()
|
|
return [
|
|
{
|
|
"nom": nom,
|
|
"statut": "prete" if info.get("printer-state") == 3 else "occupee",
|
|
"info": info.get("printer-info", ""),
|
|
}
|
|
for nom, info in imprimantes.items()
|
|
]
|
|
except cups.IPPError as e:
|
|
log.error(f"Erreur CUPS : {e}")
|
|
return []
|
|
|
|
|
|
def imprimer(chemin_photo: Path, imprimante: str | None = None, copies: int | None = None) -> bool:
|
|
"""Imprime une photo sur l'imprimante configuree."""
|
|
config = charger_config()
|
|
conf_imp = config.get("impression", {})
|
|
|
|
if imprimante is None:
|
|
imprimante = conf_imp.get("imprimante")
|
|
if copies is None:
|
|
copies = conf_imp.get("copies", 1)
|
|
|
|
if not chemin_photo.exists():
|
|
log.error(f"Fichier introuvable : {chemin_photo}")
|
|
return False
|
|
|
|
if not CUPS_DISPONIBLE:
|
|
log.info(f"[Simulation] Impression de {chemin_photo} x{copies}")
|
|
return True
|
|
|
|
try:
|
|
conn = cups.Connection()
|
|
|
|
if imprimante is None:
|
|
imprimante = conn.getDefault()
|
|
if imprimante is None:
|
|
imprimantes = conn.getPrinters()
|
|
if imprimantes:
|
|
imprimante = list(imprimantes.keys())[0]
|
|
else:
|
|
log.error("Aucune imprimante trouvee")
|
|
return False
|
|
|
|
options = {
|
|
"copies": str(copies),
|
|
"media": conf_imp.get("format", "10x15"),
|
|
"fit-to-page": "true",
|
|
}
|
|
|
|
job_id = conn.printFile(imprimante, str(chemin_photo), "Photobooth", options)
|
|
log.info(f"Impression lancee : job #{job_id} sur {imprimante}")
|
|
return True
|
|
|
|
except cups.IPPError as e:
|
|
log.error(f"Erreur impression : {e}")
|
|
return False
|