fix: mode descriptions, bordure impression (remove raw+extent), logs httpx silencieux
🚀 Deploy — JH Photomaton / 🔍 Vérification (push) Has been cancelled
🚀 Deploy — JH Photomaton / 🍓 Deploy sur le Pi (push) Has been cancelled

This commit is contained in:
2026-07-17 18:00:00 +02:00
parent 0b612e1302
commit 94def589bd
4 changed files with 149 additions and 141 deletions
+60 -80
View File
@@ -8,10 +8,27 @@
# 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 Node-RED:
# PRINTED:<printer_name>:<copies> en cas de succes
# PRINT_ERROR:<printer_name> en cas d'erreur
# Sortie stdout parsable par printer_service.py:
# PRINTED:<printer_name>:<copies> en cas de succes
# PRINT_ERROR:<printer_name>:<raison> 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
@@ -25,18 +42,6 @@ copies="${4:-1}"
PRINTER_1="Selphy_Blanche_WiFi"
PRINTER_2="Selphy_Noire_WiFi"
# --- Options d'impression Selphy ---
# Mode raw : envoie le JPEG directement a la Selphy
# Postcard.Fullbleed : impression sans bordures
PRINT_OPTIONS="-o media=Postcard.Fullbleed -o raw"
# --- Calibrage bordures pour impression Fullbleed ---
# La Selphy deborde de quelques mm en mode Fullbleed
# On ajoute des marges noires pour compenser et eviter de couper la photo
# Valeurs calibrees pour Canon Selphy CP1300 via WiFi
PRINT_EXTENT="2114x1418"
PRINT_ROLL="-12+8"
# --- Logging ---
LOG_TAG="photomaton-print"
log_info() { logger -t "$LOG_TAG" "[INFO] $1"; echo "[INFO] $1"; }
@@ -59,75 +64,50 @@ if [ "$copies" -lt 1 ] || [ "$copies" -gt 3 ]; then
fi
# --- Preparation de l'image pour impression ---
# Resize a 2000x1333 (ratio 3:2), ajout de marges noires pour compenser
# le debordement Fullbleed, puis decalage pour centrer correctement
filename_no_ext="${filename%.jpg}"
filename_print="${filename_no_ext}_print.jpg"
if command -v convert &>/dev/null; then
log_info "Preparation de l'image pour impression Fullbleed..."
if convert "$filename" \
-resize 2000x1333 \
-background black \
-gravity center \
-extent ${PRINT_EXTENT} \
-roll ${PRINT_ROLL} \
-quality 95 \
"$filename_print" 2>/dev/null; then
FILE_TO_PRINT="$filename_print"
log_info "Image preparee: $filename_print"
else
log_error "Echec de la preparation, impression de l'original"
FILE_TO_PRINT="$filename"
fi
else
log_error "ImageMagick (convert) non installe, impression de l'original"
if ! command -v convert &>/dev/null; then
log_error "ImageMagick (convert) non installe — impression de l'original"
FILE_TO_PRINT="$filename"
fi
# --- Selection de l'imprimante (load balancing) ---
printer_1_status=$(lpstat -p "$PRINTER_1" 2>/dev/null || echo "not found")
printer_2_status=$(lpstat -p "$PRINTER_2" 2>/dev/null || echo "not found")
SELECTED_PRINTER=""
if [[ "$printer_1_status" == *"idle"* ]]; then
SELECTED_PRINTER="$PRINTER_1"
log_info "Imprimante selectionnee: $PRINTER_1 (idle)"
elif [[ "$printer_2_status" == *"idle"* ]]; then
SELECTED_PRINTER="$PRINTER_2"
log_info "Imprimante selectionnee: $PRINTER_2 (idle)"
PRINT_OPTIONS="-o media=Postcard -o fit-to-page"
else
# Aucune idle : choisir celle avec le moins de jobs en attente
jobs_1=$(lpstat -o "$PRINTER_1" 2>/dev/null | wc -l)
jobs_2=$(lpstat -o "$PRINTER_2" 2>/dev/null | wc -l)
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
if [ "$jobs_1" -le "$jobs_2" ] 2>/dev/null; then
SELECTED_PRINTER="$PRINTER_1"
else
SELECTED_PRINTER="$PRINTER_2"
fi
log_info "Aucune imprimante idle, file d'attente sur: $SELECTED_PRINTER (jobs: P1=$jobs_1, P2=$jobs_2)"
fi
# --- Impression ---
log_info "Impression x${copies} sur $SELECTED_PRINTER: $FILE_TO_PRINT"
# Envoi du job CUPS et capture du job ID
job_output=$(lp -n "$copies" -d "$SELECTED_PRINTER" $PRINT_OPTIONS "$FILE_TO_PRINT" 2>&1)
lp_exit=$?
if [ $lp_exit -ne 0 ]; then
log_error "lp a echoue (exit $lp_exit): $job_output"
echo "PRINT_ERROR:${SELECTED_PRINTER}:lp_failed"
[ -f "$filename_print" ] && rm -f "$filename_print" 2>/dev/null
exit 1
fi
# Extraction du job ID (ex: "request id is Selphy_Blanche_WiFi-42 (1 file(s))")
JOB_ID=$(echo "$job_output" | grep -oE '[A-Za-z0-9_-]+-[0-9]+' | head -1)
log_info "Job CUPS accepte: ${JOB_ID:-inconnu}"
# Si le job ID est introuvable, comportement legacy (retour immediat)
if [ -z "$JOB_ID" ]; then
log_info "Job ID non extrait imp
# ── 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