Fournir une gestion correcte de la barre de progression de lecture sur des flux continus...
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)
-
pmocontrol/src/openapi.rs
- Ajout du champ
is_stream: booldansstruct FullRendererSnapshot
- Ajout du champ
-
pmocontrol/src/control_point.rs
- Modification de la méthode de construction de
FullRendererSnapshotpour inclureis_streamvia appel àrenderer.is_playing_a_stream()
- Modification de la méthode de construction de
-
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 deMediaServerEventversMediaServerEventPayload - Remplacement de deux blocs match dupliqués par des appels à cette fonction helper
- Refactorisation : création de la fonction helper
-
pmocontrol/src/music_renderer/musicrenderer.rs
- Ajout d'un log
tracing::info!()lors du changement d'état stream pour faciliter le débogage
- Ajout d'un log
-
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
falsetemporairement 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
- Optimisation majeure : Ajout d'un cache global thread-safe (
Frontend (webapp)
-
pmoapp/webapp/src/services/pmocontrol/types.ts
- Ajout du type d'événement SSE
stream_state_changeddansRendererEventPayload - Ajout du champ
is_stream: booleandansFullRendererSnapshot
- Ajout du type d'événement SSE
-
pmoapp/webapp/src/composables/useRenderers.ts
- Ajout de la gestion de l'événement
stream_state_changeddans le switch statement - Ajout du computed
isStreamdans le composableuseRenderer() - Export de
isStreamdans le retour du composable
- Ajout de la gestion de l'événement
-
pmoapp/webapp/src/components/pmocontrol/QueueViewer.vue
- Import de l'icône
Radiodepuis lucide-vue-next - Récupération de
isStreamdepuis le composableuseRenderer() - Ajout d'un conteneur
status-indicatorspour wrapper les indicateurs - Ajout de l'indicateur visuel "Web Radio" avec icône Radio (badge violet)
- Ajout des styles CSS pour
.stream-indicatoret.status-indicators
- Import de l'icône
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
falsetemporairement 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.