
I. đ PrĂ©sentation GĂ©nĂ©rale du Projet
Ce projet est un systĂšme complet, basĂ© sur Python, Flask et Tkinter, conçu pour animer un Ă©vĂ©nement (probablement NoĂ«l, comme suggĂ©rĂ© par les noms de dossiers noel2025_prod). Il combine un serveur web interactif pour la gestion de mĂ©dias (photos et musique) avec un contrĂŽleur d’affichage dĂ©diĂ© pour une prĂ©sentation dynamique et autonome.
L’objectif principal est de permettre aux participants de l’Ă©vĂ©nement de contribuer en temps rĂ©el (via QR code/web upload) des photos et des requĂȘtes audio, tandis que le serveur gĂšre l’affichage des images, l’archivage, la planification des captures automatiques et le tĂ©lĂ©chargement audio de maniĂšre sĂ©curisĂ©e et organisĂ©e.

Le systĂšme est modulaire et s’appuie fortement sur le multithreading pour dissocier l’interface web (Flask) de la logique d’affichage plein Ă©cran (Tkinter) et des tĂąches lourdes (tĂ©lĂ©chargement, surveillance de dossiers, capture).
II. đ§© Architecture Technique et Organisation des Fichiers
L’architecture est structurĂ©e autour de deux scripts principaux et d’une organisation stricte des dossiers :
1. Structure des Scripts
| Script | RÎle Principal | Technologies Clés |
serveur_15.py | CĆur du systĂšme : serveur web, gestionnaire de mĂ©dias (photos/MP3), contrĂŽleur d’affichage (Tkinter), planification des tĂąches. | Flask, Tkinter, threading, subprocess, yt-dlp. |
gen_qr.py | Utilitaire d’installation : dĂ©tection d’IP, gĂ©nĂ©ration de QR code, superposition sur un fond pour crĂ©er l’image permanente de connexion. | qrcode, PIL (Pillow), socket. |
2. Organisation des Dossiers (Définis dans serveur_15.py)
| Dossier | Chemin Relatif | Description |
| Photos Ă traiter | static/photos (UPLOAD_FOLDER) | Photos nouvellement tĂ©lĂ©chargĂ©es ou capturĂ©es, en attente d’ĂȘtre affichĂ©es. |
| Archives | static/archives_photos (ARCHIVE_FOLDER) | Répertoire de stockage permanent des photos originales aprÚs leur affichage. |
| Vignettes | static/thumbnails (THUMBNAIL_FOLDER) | Miniatures des photos archivées, utilisées pour la page /archives. |
| Affichage permanent | static/permanent (PERMANENT_FOLDER) | Contient des images (ex: QR code) affichées en permanence, contrÎlées par leur nom de fichier (screen_x_y_filename). |
| MP3 TĂ©lĂ©chargĂ©s | ../noel2025_prod/mp3_download (MP3_FOLDER) | Fichiers MP3 convertis depuis YouTube via l’interface web. |
| MP3 Catalogue | ../noel2025_prod/mp3_catalog (MP3_FOLDER_CATALOG) | Fichiers MP3 gérés manuellement (e.g., liste de lecture de base). |
III. âïž FonctionnalitĂ©s du Serveur (serveur_15.py)
1. ContrĂŽle d’Affichage MultithreadĂ© (Tkinter)
Le composant ImageDisplayController est essentiel :
- SĂ©paration des prĂ©occupations : Il maintient l’affichage graphique complĂštement sĂ©parĂ© du serveur web Flask, Ă©vitant les blocages.
- MĂ©canisme de Queue : Les demandes d’affichage sont envoyĂ©es via une queue thread-safe (
display_queue) que la boucle principale Tkinter surveille. - Affichage Dynamique : Les images du dossier
photossont traitĂ©es, redimensionnĂ©es Ă la volĂ©e (_load_and_resize_to_fitĂ 1066×600), affichĂ©es pendantSHOW_DURATION(5 secondes), puis archivĂ©es et converties en vignette. - Affichage Statistique : GĂšre l’affichage des images du dossier
permanent(e.g., le QR code) en utilisant leurs coordonnées encodées dans le nom de fichier (screen_x_y_filename).
2. Gestion et Traitement des Photos (TĂąches de Fond)
Deux tĂąches de fond (threads daemon) assurent le flux continu :
process_photos_task: Le gestionnaire de flux de photos. Il poll le dossier d’upload toutes les 10 secondes, prend la plus ancienne photo pour garantir l’ordre de traitement, la redimensionne, l’affiche, crĂ©e une vignette et la dĂ©place ensuite vers le dossier d’archive.scheduled_capture_task: La capture planifiĂ©e. Elle utilise l’utilitairefswebcampour prendre une photo haute rĂ©solution (1920×1080) toutes les 10 minutes (600 secondes), assurant un contenu continu mĂȘme sans interaction utilisateur.
3. Gestion Audio (Module YouTube MP3)
Ce module est un ajout sophistiquĂ© permettant de transformer l’interface web en un jukebox :
- Recherche Filtrée : La route
/youtubeutiliseyt-dlppour rechercher des vidĂ©os et applique un filtre strict pour n’afficher que celles dont la durĂ©e est infĂ©rieure Ă 10 minutes (MAX_DURATION_SECONDS). - TĂ©lĂ©chargement Asynchrone : La route
/youtube/download/<video_id>lance le processus de conversion YouTube vers MP3 dans un thread de travail séparé (download_worker) pour ne pas bloquer le serveur web. - Nommage Sécurisé : Le titre de la vidéo est récupéré, nettoyé des caractÚres illégaux par
nettoyer_nom_fichier, et utilisé pour générer un nom de fichier horodaté et lisible :AAAAmmjj_HHMMSS_titre_nettoye.mp3. - Suivi de Statut : Le statut du téléchargement est suivi via un dictionnaire global (
DOWNLOAD_STATUS) protĂ©gĂ© par un verrou (DOWNLOAD_LOCK), et exposĂ© via l’endpoint/youtube/check/<video_id>pour le polling AJAX depuis la page d’attente.
4. Gestion des MP3 Téléchargés
Le module /mp3_manager permet une administration centralisée :
list_mp3_files: Agrége les fichiers MP3 des dossiersdownloadetcatalog, fournissant leur taille et leur origine.- Sécurité de Suppression : Le formulaire POST utilise un mécanisme de vérification de chemin absolu (en comparant
os.path.abspath(folder)avec les dossiers autorisĂ©s) pour garantir que l’utilisateur ne peut supprimer que les fichiers prĂ©sents dans les deux rĂ©pertoires MP3 dĂ©signĂ©s, empĂȘchant ainsi les attaques de traversĂ©e de rĂ©pertoire.
IV. đ Utilitaire QR Code (gen_qr.py)
Le rĂŽle de ce script est d’assurer une installation sans friction en gĂ©nĂ©rant l’outil de connexion pour les participants.
1. Connexion Dynamique
- DĂ©tection d’IP : La fonction
_detect_local_iptrouve l’adresse IP du serveur sur le rĂ©seau local, garantissant que le QR code est utilisable immĂ©diatement sans configuration manuelle de l’IP. - GĂ©nĂ©ration PrĂ©cise : La fonction
generate_qr_jpgcrĂ©e le code QR pour l’URL complĂšte (http://[IP]:5000/photos) avec une taille en pixels et une bordure exactes.
2. Personnalisation Visuelle
- Superposition : La fonction
superpose_qr_on_frameprend le QR code gĂ©nĂ©rĂ© et le place automatiquement au centre d’une image de fond prĂ©dĂ©finie (e.g., un cadre de NoĂ«l), crĂ©ant une image finale conviviale et thĂ©matique. - DĂ©ploiement : Cette image finale est sauvegardĂ©e dans le dossier
static/permanent/avec le nom structurĂ© (e.g.,0_5_5_qr.jpg), permettant auImageDisplayControllerde l’afficher en permanence dĂšs le dĂ©marrage du serveur.
V. SynthĂšse et Perspectives d’Ăvolution du Projet
đ Conclusion : Un SystĂšme MultimĂ©dia Robuste et Engageant
Le projet actuel, articulĂ© autour de serveur_15.py et gen_qr.py, reprĂ©sente une solution d’animation Ă©vĂ©nementielle remarquablement intĂ©grĂ©e et thread-safe. En dissociant habilement l’interface web (Flask) du moteur d’affichage (Tkinter), il garantit Ă la fois une haute disponibilitĂ© du serveur et une expĂ©rience utilisateur fluide pour la projection plein Ă©cran.
La gestion automatique du flux de photos (upload, redimensionnement, affichage temporaire, archivage) et la mise en place d’un jukebox YouTube-to-MP3 asynchrone crĂ©ent une plateforme interactive et dynamique. L’initialisation sĂ©curisĂ©e et visuellement attrayante grĂące au gĂ©nĂ©rateur de QR code (gen_qr.py) complĂšte ce tableau en fournissant un point d’entrĂ©e immĂ©diat pour les participants.
Ce systĂšme est une base solide et opĂ©rationnelle pour un Ă©vĂ©nement tel que NoĂ«l 2025, prouvant l’efficacitĂ© de l’intĂ©gration de technologies disparates (Web, GUI, Utilitaires SystĂšme) au sein d’une architecture Python maĂźtrisĂ©e.
đ Perspectives d’AmĂ©lioration et Pistes d’Ăvolution
Pour pĂ©renniser le projet et en Ă©tendre les capacitĂ©s, plusieurs pistes d’amĂ©lioration pourraient ĂȘtre explorĂ©es, touchant la performance, l’expĂ©rience utilisateur et la modularitĂ© :
1. Amélioration de la Robustesse et de la Performance
- Remplacement du Polling par des Notifications : L’actuelle
process_photos_tasks’appuie sur le polling du dossierstatic/photostoutes les 10 secondes. Une amĂ©lioration majeure serait d’utiliser des bibliothĂšques commewatchdogpour mettre en place une surveillance des Ă©vĂ©nements de systĂšme de fichiers. Cela permettrait de dĂ©clencher le traitement photo immĂ©diatement aprĂšs l’upload, rĂ©duisant le dĂ©lai d’affichage et libĂ©rant des ressources CPU. - ContrĂŽle de l’Audio : Actuellement, le systĂšme tĂ©lĂ©charge les MP3 mais ne les lit pas. L’intĂ©gration d’un lecteur audio (potentiellement dans un thread dĂ©diĂ© ou via une bibliothĂšque comme
pygame.mixer) permettrait de lire les MP3 tĂ©lĂ©chargĂ©s ou ceux du catalogue, offrant un contrĂŽle complet de l’ambiance sonore.
2. AmĂ©lioration de l’ExpĂ©rience Utilisateur (UX)
- Interface d’Administration : DĂ©velopper une interface web protĂ©gĂ©e par mot de passe pour le panneau d’administration. Cela permettrait de :
- Modifier les variables de configuration (durĂ©e d’affichage, intervalle de capture, etc.) sans redĂ©marrer le serveur.
- Gérer et prévisualiser les images permanentes.
- Lancer/arrĂȘter la lecture audio.
- Retour Visuel pour les TĂ©lĂ©chargements : AmĂ©liorer la page d’attente
/youtube/waitpour inclure des informations plus dĂ©taillĂ©es sur la progression du tĂ©lĂ©chargement (si possible avecyt-dlpen mode verbeux, mais filtrĂ© pour l’utilisateur), plutĂŽt qu’un simple statut ‘PENDING’.
3. Modularité et Déploiement
- Conteneurisation (Docker) : Le dĂ©ploiement actuel nĂ©cessite l’installation des dĂ©pendances Python (
qrcode[pil],Flask,yt-dlp, etc.) ainsi que des utilitaires systĂšmes (fswebcam) et de l’environnement graphique (Tkinter). L’encapsulation du projet dans un conteneur Docker simplifierait massivement le dĂ©ploiement sur diffĂ©rents systĂšmes, rendant le projet portable. - Abstraction de l’Affichage : Remplacer le contrĂŽleur d’affichage basĂ© sur
Tkinter(qui nĂ©cessite un environnement X-Windows) par une solution plus lĂ©gĂšre ou headless pour l’affichage (par exemple, en utilisant un navigateur en mode kiosque contrĂŽlĂ© Ă distance ou une bibliothĂšque graphique plus orientĂ©e vers le mĂ©dia commePyQtouKivy) pourrait offrir plus de flexibilitĂ© pour le choix du moniteur et de la plateforme hĂŽte.
Source gen_qr.py
Source serveur_15.py
0 commentaire