Files
photostation/memoire.md
Jules c2c27b1892 Tarification + écran récap avec prix
Config admin :
- Tarification activable avec paliers (ex: 1-5 = 0.50€, 6-10 = 0.40€)
- Fonction calculate_price() utilitaire

Galerie :
- Affiche "X impressions — Y.YY €" quand tarification activée

Écran impression/récap :
- Galerie des photos sélectionnées avec miniatures + quantité (xN)
- Prix total en haut
- Choix du format d'impression
- Bouton IMPRIMER

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 23:54:10 +01:00

5.3 KiB
Raw Blame History

Photostation

Description

Borne d'impression photo tactile. Les utilisateurs importent leurs photos (USB, WiFi, QR code, email), les éditent (recadrage, rotation, effets, goodies, multi-pose, texte) et les impriment sur imprimante sublimation.

Concept

Ce n'est PAS un photobooth (pas de capture photo). C'est une station de transfert/impression : les utilisateurs arrivent avec leurs propres photos et la borne permet de les éditer et imprimer.

Stack technique

  • Interface : PyQt6 / QGraphicsScene (natif, léger, tactile)
  • Traitement image : Pillow (effets, redimensionnement, export)
  • Impression : CUPS via pycups
  • Serveur upload : Flask (thread daemon, page upload mobile-friendly)
  • Email : IMAP polling (thread daemon)
  • QR : qrcode (Python)

Matériel

  • Prototype : Raspberry Pi 3B+ (1GB RAM) — en stock chez Jules
  • Cible : Portable vers RPi 4 ou 5 sans aucun changement de code
  • Écran tactile : en stock, 10" 4/3 visé (interface responsive)
  • Imprimante sublimation : à acheter (pistes : DNP DS620A, Mitsubishi CP-D90DW)
  • Pas de capture photo — les utilisateurs apportent leurs propres photos

Architecture

src/
  main.py                         — Point d'entrée (--kiosk pour plein écran)
  services/
    usb_watcher.py                — Détection USB par polling
    upload_server.py              — Serveur Flask d'upload (WiFi + QR)
    imap_watcher.py               — Polling IMAP pour réception email
  ui/
    style.py                      — Styles responsive (tailles en % de la fenêtre)
    main_window.py                — Navigation QStackedWidget (4 écrans)
    screens/
      home_screen.py              — Accueil, 4 modes, config admin (appui long 5s)
      import_screen.py            — Galerie photos (cartes, quantités, pastille ratio)
      editor_screen.py            — Éditeur (crop ratio, rotation, filtres, goodies, multi-pose, texte)
      print_screen.py             — Choix format, recadrage ratio, impression
    widgets/
      crop_overlay.py             — Rectangle de crop ratio verrouillé, bord à bord
      goodies_panel.py            — Panneau stickers/cadres
      multipose_dialog.py         — Templates multi-pose
      config_dialog.py            — Config admin complète

Fonctionnalités implémentées (2026-03-21)

Modes d'import

  • USB : polling montages, scan récursif, bouton vert + compteur
  • QR Code : mini QR sur le bouton, serveur Flask upload, bouton vert quand photos reçues → galerie directe
  • WiFi : même serveur Flask, affiche nom AP + mot de passe
  • Email : IMAP polling configurable, affiche adresse mail

Galerie

  • Cartes à taille fixe, miniatures centrées (QPushButton + icon)
  • Clic sur la photo → ouvre l'éditeur avec cadre de recadrage auto si ratio ≠ 3:2
  • Boutons − / quantité / + centrés sous chaque photo
  • Pastille orange (point) si ratio ≠ 3:2
  • Résumé "X photos — Y impressions"
  • Bouton Valider → écran impression

Éditeur

  • Recadrage ratio verrouillé 3:2 (auto si ratio ≠ 3:2), bord à bord
  • Rotation 90°, filtres (N&B, sépia, vintage, contraste)
  • Multi-pose (5 templates, même photo dupliquée, crop to fill)
  • Goodies (stickers draggable, cadres overlay)
  • Texte éditable draggable
  • Export scène → PNG haute résolution

Impression

  • Formats activables par format dans la config (10x15, 13x18, 15x20)
  • Imprimante CUPS assignable par format
  • Cadre de recadrage au ratio du format, bord à bord, déplaçable

Config admin (appui long 5s sur "Photostation")

  • WiFi : nom AP, mot de passe
  • Serveur upload : IP d'écoute, port, URL publique (QR code)
  • Email IMAP : activer/désactiver, serveur, port, user, password, dossier, intervalle
  • Formats d'impression : checkbox par format + imprimante CUPS
  • Sauvegardé dans config/settings.json

Interface

  • Responsive : toutes tailles en % de la fenêtre
  • Fonctionne en 800x480, 1024x768, 1280x1024, 1920x1080
  • Mode kiosk sans WM (FramelessWindowHint + setGeometry)
  • Guard anti-boucle de zoom dans resizeEvent

Dev

  • Repo Gitea : https://git.copydev.fr/jules/photostation
  • Token Gitea : 4bc923c47cf363a866daa1e1a6cf22bc44a78bc5 (claude-photostation)
  • LXC dev : ID 164, hostname photostation, IP 192.168.111.164
    • Debian 12, 2GB RAM, 2 cores
    • Python 3 + PyQt6 6.10.2 + Pillow 12.1.1 + Flask 3.1.3 + venv /opt/photostation/venv/
    • Code dans /opt/photostation/
    • Xvfb :99 (1280x1024) + VNC port 5900 (sans mot de passe)
    • 50 photos test dans /media/usb_test/ (bind mount simulé)
    • Scripts test : test_gallery.py, test_editor.py, test_multipose.py, test_print.py
  • NPM : photo.copydev.fr → 192.168.111.164:8080 (proxy id=58, cert wildcard *.copydev.fr)
  • Git config : user Jules, email contact@copydev.fr

TODO

  • Tarification : prix en € dans la galerie, tarif unitaire + paliers configurables
  • Écran récap après Valider : photos sélectionnées + quantités + prix total
  • Impression CUPS réelle
  • Hotspot WiFi captif (hostapd + dnsmasq — RPi spécifique)
  • Peupler assets/goodies/ et assets/frames/
  • Tests sur RPi 3 réel

Formats d'impression

Format Ratio Dimensions cm
10x15 1.5 (3:2) 10 × 15
13x18 1.385 13 × 18
15x20 1.333 (4:3) 15 × 20