#!/bin/bash # ============================================================================= # script_print.sh - Impression photo pour photomaton # ============================================================================= # Usage: script_print.sh "" "" "" "" # Appele par photobooth-app via l'action Share "Impression" # # Imprimantes: Canon Selphy CP1300 x2 via WiFi (blanche + noire) # Load balancing: utilise l'imprimante idle, sinon file d'attente sur la 1ere # # Sortie stdout parsable par printer_service.py: # PRINTED:: en cas de succes # PRINT_ERROR:: en cas d'erreur # ============================================================================= # # ── CALIBRAGE IMPRESSION ───────────────────────────────────────────────────── # # Selphy CP1300 — papier Postcard 150x100mm (ratio exact 3:2) # Image traitée par photobooth-app : 2000x1333 (ratio 3:2) # Résolution cible à 300 dpi : 1772x1181 px # # TEST_MODE contrôle la méthode de préparation : # A — resize 1772x1181 + media=Postcard + fit-to-page (pas de raw) # → marges blanches possibles si le driver ajoute des marges # B — resize 1860x1240 (overscan 5%) + media=Postcard.Fullbleed + print-scaling=fill # → image légèrement agrandie puis rognée par la Selphy pour remplir le papier # # Après validation, laisser la valeur qui donne le meilleur résultat. # ============================================================================= TEST_MODE="B" # A ou B set -uo pipefail # --- Parametres --- filename="${1:-}" media_type="${2:-}" action_config_name="${3:-}" copies="${4:-1}" # --- Noms des imprimantes CUPS (WiFi) --- PRINTER_1="Selphy_Blanche_WiFi" PRINTER_2="Selphy_Noire_WiFi" # --- Logging --- LOG_TAG="photomaton-print" log_info() { logger -t "$LOG_TAG" "[INFO] $1"; echo "[INFO] $1"; } log_error() { logger -t "$LOG_TAG" "[ERROR] $1"; echo "[ERROR] $1"; } # --- Validation --- if [ -z "$filename" ]; then log_error "Aucun fichier specifie" exit 1 fi if [ ! -f "$filename" ]; then log_error "Fichier introuvable: $filename" exit 1 fi if [ "$copies" -lt 1 ] || [ "$copies" -gt 3 ]; then log_error "Nombre de copies invalide: $copies (doit etre entre 1 et 3)" exit 1 fi # --- Preparation de l'image pour impression --- filename_no_ext="${filename%.jpg}" filename_print="${filename_no_ext}_print.jpg" if ! command -v convert &>/dev/null; then log_error "ImageMagick (convert) non installe — impression de l'original" FILE_TO_PRINT="$filename" PRINT_OPTIONS="-o media=Postcard -o fit-to-page" else log_info "Preparation image (mode ${TEST_MODE})..." if [ "$TEST_MODE" = "A" ]; then # ── MODE A : 300 dpi exact, fit-to-page ───────────────────────────── # Resize à la résolution native 300 dpi du Selphy (150x100mm). # Le driver CUPS aligne l'image sur le papier sans rognage. # Si des marges blanches apparaissent, passer au mode B. if convert "$filename" \ -resize 1772x1181 \ -gravity center \ -background white \ -extent 1772x1181 \ -quality 95 \ "$filename_print" 2>/dev/null; then FILE_TO_PRINT="$filename_print" PRINT_OPTIONS="-o media=Postcard -o fit-to-page" log_info "Image preparee (mode A): 1772x1181 → $filename_print" else log_error "Echec convert mode A — impression original" FILE_TO_PRINT="$filename" PRINT_OPTIONS="-o media=Postcard -o fit-to-page" fi else # ── MODE B : overscan 5% + fullbleed fill ─────────────────────────── # Image légèrement agrandie (5% overscan) pour que la Selphy en mode # Fullbleed puisse rogner les bords sans laisser de marges blanches. # print-scaling=fill remplace le raw mode et laisse le driver gérer # l'alignement — élimine les bordures noires de l'ancien script. if convert "$filename" \ -resize 1860x1240 \ -gravity center \ -background white \ -extent 1860x1240 \ -quality 95 \ "$filename_print" 2>/dev/null; then FILE_TO_PRINT="$filename_print" PRINT_OPTIONS="-o media=Postcard.Fullbleed -o print-scaling=fill" log