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

ScriptRÎle PrincipalTechnologies Clés
serveur_15.pyCƓ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.pyUtilitaire 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)

DossierChemin RelatifDescription
Photos Ă  traiterstatic/photos (UPLOAD_FOLDER)Photos nouvellement tĂ©lĂ©chargĂ©es ou capturĂ©es, en attente d’ĂȘtre affichĂ©es.
Archivesstatic/archives_photos (ARCHIVE_FOLDER)Répertoire de stockage permanent des photos originales aprÚs leur affichage.
Vignettesstatic/thumbnails (THUMBNAIL_FOLDER)Miniatures des photos archivées, utilisées pour la page /archives.
Affichage permanentstatic/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 photos sont traitĂ©es, redimensionnĂ©es Ă  la volĂ©e (_load_and_resize_to_fit Ă  1066×600), affichĂ©es pendant SHOW_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’utilitaire fswebcam pour 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 /youtube utilise yt-dlp pour 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 dossiers download et catalog, 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_ip trouve 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_jpg crĂ©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_frame prend 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 au ImageDisplayController de 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_task s’appuie sur le polling du dossier static/photos toutes les 10 secondes. Une amĂ©lioration majeure serait d’utiliser des bibliothĂšques comme watchdog pour 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/wait pour inclure des informations plus dĂ©taillĂ©es sur la progression du tĂ©lĂ©chargement (si possible avec yt-dlp en 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 comme PyQt ou Kivy) pourrait offrir plus de flexibilitĂ© pour le choix du moniteur et de la plateforme hĂŽte.

Source gen_qr.py

Python

Source serveur_15.py

Python


0 commentaire

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *