113 lines
4.6 KiB
Bash
113 lines
4.6 KiB
Bash
#!/bin/bash
|
|
# =============================================================================
|
|
# script_print.sh - Impression photo pour photomaton
|
|
# =============================================================================
|
|
# Usage: script_print.sh "<filename>" "<media_type>" "<action_config_name>" "<copies>"
|
|
# 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:<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
|
|
|
|
# --- 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 |