# 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 — choisi au lieu de Chromium pour économiser la RAM sur RPi 3) - **Traitement image** : Pillow (effets, redimensionnement, export) - **Impression** : CUPS via pycups - **Hotspot WiFi** : hostapd + dnsmasq + Flask (mini serveur upload) - **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 chez Jules (modèle à déterminer) - **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 (findmnt + scan récursif) ui/ main_window.py — Navigation QStackedWidget (4 écrans) screens/ home_screen.py — Accueil, 4 boutons import, status USB live import_screen.py — Galerie de photos (grille scrollable) editor_screen.py — Éditeur complet (voir fonctionnalités ci-dessous) print_screen.py — Prévisualisation + choix format + impression widgets/ crop_overlay.py — Rectangle de crop avec poignées tactiles + grille des tiers goodies_panel.py — Panneau latéral stickers/cadres (charge depuis assets/) multipose_dialog.py — 5 templates multi-pose avec prévisualisation assets/ goodies/ — Stickers PNG (à peupler) frames/ — Cadres photo PNG (à peupler) fonts/ — Polices custom data/ photos/ — Photos importées (gitignored) exports/ — Exports PNG (gitignored) config/ — Configuration (imprimante, WiFi, etc.) ``` ## Fonctionnalités implémentées (2026-03-21) - **Import USB** : polling montages, scan récursif photos (jpg/png/bmp/tiff/webp/heic), bouton vert + compteur quand clé détectée - **Galerie** : grille 4 colonnes avec miniatures cliquables - **Recadrage** : overlay interactif, grille des tiers, poignées tactiles aux coins, zone assombrie - **Rotation** : 90° par clic (transformation réelle, pas juste visuelle) - **Filtres Pillow** : N&B, sépia, vintage (désaturation+contraste), contraste - **Goodies** : panneau latéral toggle, stickers draggable (20% taille scène), cadres overlay - **Multi-pose** : 5 templates (2h, 2v, 3 gauche, 4 grille, 3 bande), remplissage auto depuis galerie - **Texte** : éditable + draggable, police 32pt blanche - **Annuler** : reset à l'image originale - **Export** : scène complète → PNG haute résolution (fichier temporaire) - **Impression** : écran prévisualisation + sélection format (10x15, 13x18, 15x20 cm) ## 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 + venv dans `/opt/photostation/venv/` - Code dans `/opt/photostation/` - Xvfb :99 (1024x600) + VNC port 5900 (sans mot de passe) - Lancer l'app : `source venv/bin/activate && DISPLAY=:99 PYTHONPATH=src python3 src/main.py` - **Lancement local** : `python3 src/main.py` (fenêtré) ou `python3 src/main.py --kiosk` - **Git config** : user `Jules`, email `contact@copydev.fr` - **Credentials git** : stockés dans `/tmp/.git-cred-photostation` ## TODO - [ ] Peupler assets/goodies/ et assets/frames/ avec des stickers et cadres - [ ] Impression CUPS réelle (pycups, détection imprimante, envoi job) - [ ] WiFi hotspot (hostapd + dnsmasq + Flask page upload) - [ ] QR code (génération lien vers page upload) - [ ] Email (réception SMTP) - [ ] Thème/style plus abouti - [ ] Tests sur RPi 3 réel ## Formats d'impression - 10x15 cm - 13x18 cm - 15x20 cm ## Notes - Fichiers `backend/` et `frontend/` dans le repo = version alternative (probablement générée par un autre onglet Claude). Notre approche est dans `src/` (PyQt6). - Les libs xcb nécessaires sur le LXC : libxcb-cursor0, libxcb-xinerama0, libxcb-icccm4, libxcb-keysyms1, libxcb-render-util0, libxcb-shape0, libxcb-xfixes0, libxkbcommon-x11-0, libfontconfig1