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