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 *