Files
pmomusic/Blackboard/Report/gestion_progressbar_on_stream.md
Eric Coissac 91c147eafd Implementing the is_playing_a_stream method...
Fournir une gestion correcte de la barre de progression de lecture sur des flux continus...
2026-01-31 12:41:21 +01:00

3.8 KiB

Rapport : Gestion de la barre de progression sur flux continu

Résumé

Implémentation complète de l'étape 2 de la tâche : ajout d'un indicateur visuel "Web Radio" dans l'interface web pour signaler la lecture d'un flux continu (webradio). L'indicateur s'affiche automatiquement à côté de l'indicateur "Attachée à une playlist" dans le composant QueueViewer. Optimisation de la détection de stream avec cache et traitement asynchrone pour éviter de ralentir l'interface.

Fichiers modifiés

Backend (pmocontrol)

  1. pmocontrol/src/openapi.rs

    • Ajout du champ is_stream: bool dans struct FullRendererSnapshot
  2. pmocontrol/src/control_point.rs

    • Modification de la méthode de construction de FullRendererSnapshot pour inclure is_stream via appel à renderer.is_playing_a_stream()
  3. pmocontrol/src/sse.rs

    • Refactorisation : création de la fonction helper media_server_event_to_payload() pour éliminer la duplication de code entre les conversions de MediaServerEvent vers MediaServerEventPayload
    • Remplacement de deux blocs match dupliqués par des appels à cette fonction helper
  4. pmocontrol/src/music_renderer/musicrenderer.rs

    • Ajout d'un log tracing::info!() lors du changement d'état stream pour faciliter le débogage
  5. pmocontrol/src/music_renderer/stream_detection.rs

    • Optimisation majeure : Ajout d'un cache global thread-safe (STREAM_CACHE) pour mémoriser les résultats de détection par URL
    • Ajout d'un set de vérifications en cours (PENDING_CHECKS) pour éviter les doublons de requêtes HTTP sur la même URL
    • Modification de is_continuous_stream_url() pour :
      • Vérifier le cache en premier (retour immédiat si trouvé)
      • Ne pas lancer de nouvelle détection si déjà en cours
      • Lancer la détection HTTP HEAD dans un thread séparé (non-bloquant)
      • Retourner false temporairement pendant la détection, le watcher mettra à jour à la prochaine itération
    • Utilisation de std::sync::LazyLock (stdlib Rust 1.80+) au lieu de lazy_static

Frontend (webapp)

  1. pmoapp/webapp/src/services/pmocontrol/types.ts

    • Ajout du type d'événement SSE stream_state_changed dans RendererEventPayload
    • Ajout du champ is_stream: boolean dans FullRendererSnapshot
  2. pmoapp/webapp/src/composables/useRenderers.ts

    • Ajout de la gestion de l'événement stream_state_changed dans le switch statement
    • Ajout du computed isStream dans le composable useRenderer()
    • Export de isStream dans le retour du composable
  3. pmoapp/webapp/src/components/pmocontrol/QueueViewer.vue

    • Import de l'icône Radio depuis lucide-vue-next
    • Récupération de isStream depuis le composable useRenderer()
    • Ajout d'un conteneur status-indicators pour wrapper les indicateurs
    • Ajout de l'indicateur visuel "Web Radio" avec icône Radio (badge violet)
    • Ajout des styles CSS pour .stream-indicator et .status-indicators

Améliorations d'optimisation

Problème identifié

La détection de stream via requête HTTP HEAD synchrone bloquait l'interface et ralentissait la réactivité.

Solution implémentée

  • Cache en mémoire : Les résultats sont mémorisés par URL (une URL ne change pas de nature)
  • Détection asynchrone : La requête HTTP est déportée dans un thread séparé
  • Anti-doublon : Un mécanisme empêche de relancer une détection déjà en cours pour la même URL
  • Comportement graceful : Retourne false temporairement pendant la première détection, le watcher met à jour l'état dès que le résultat est disponible

Résultat

Interface fluide sans blocage, les indicateurs "Web Radio" apparaissent après quelques centaines de millisecondes lors de la première lecture d'une URL, puis instantanément grâce au cache pour les lectures suivantes.