Fournir une gestion correcte de la barre de progression de lecture sur des flux continus...
65 lines
3.8 KiB
Markdown
65 lines
3.8 KiB
Markdown
# 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)
|
|
|
|
6. **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`
|
|
|
|
7. **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
|
|
|
|
8. **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.
|