From cddd2afbd82266b2325e69af64875830a447a1ff Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Sat, 21 Feb 2026 00:15:38 +0100 Subject: [PATCH] =?UTF-8?q?Impl=C3=A9mentation=20du=20WebRenderer=20et=20a?= =?UTF-8?q?m=C3=A9liorations=20du=20serveur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout de la fonctionnalité WebRenderer permettant au navigateur de se connecter comme renderer UPnP. - Implémentation du composant Vue useWebRenderer pour gérer la connexion WebSocket et le contrôle audio - Ajout d'un proxy WebSocket dans Vite pour rediriger les requêtes /api/webrenderer/ws vers le serveur - Modification du serveur pour permettre l'enregistrement dynamique de routes et extraction du JoinHandle - Améliorations du parsing des métadonnées AVTransport pour gérer les types String et DIDLLite - Ajout de la détection et du nommage des navigateurs dans le WebRenderer - Mise à jour des dépendances avec tower 0.5.2 - Correction de la gestion des threads lors de l'arrêt du serveur HTTP --- Cargo.lock | 1 + PMOMusic/src/main.rs | 9 +- .../webapp/src/composables/useWebRenderer.ts | 332 ++++++++++++++++++ .../webapp/src/views/UnifiedControlView.vue | 31 +- pmoapp/webapp/vite.config.ts | 5 + .../variables/avtransporturimetadata.rs | 7 + pmoserver/Cargo.toml | 1 + pmoserver/src/server.rs | 21 +- pmowebrenderer/src/handlers.rs | 12 +- pmowebrenderer/src/renderer.rs | 22 +- pmowebrenderer/src/websocket.rs | 14 +- 11 files changed, 443 insertions(+), 12 deletions(-) create mode 100644 pmoapp/webapp/src/composables/useWebRenderer.ts diff --git a/Cargo.lock b/Cargo.lock index 9b98c4bf..262722b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4265,6 +4265,7 @@ dependencies = [ "tokio", "tokio-stream", "tokio-util", + "tower 0.5.2", "tracing", "tracing-subscriber", "utoipa", diff --git a/PMOMusic/src/main.rs b/PMOMusic/src/main.rs index 4f554335..4b55a57a 100644 --- a/PMOMusic/src/main.rs +++ b/PMOMusic/src/main.rs @@ -137,8 +137,13 @@ async fn main() -> Result<(), Box> { info!("✅ PMOMusic is ready!"); info!("Press Ctrl+C to stop..."); - // Attendre le signal Ctrl+C et l'arrêt du serveur HTTP - server.write().await.wait().await; + // Extraire le join_handle AVANT de libérer le write lock, + // pour pouvoir l'awaiter sans tenir le write lock du serveur global. + // (Tenir le write lock pendant wait() bloquerait register_device() dynamique) + let join_handle = server.write().await.take_join_handle(); + if let Some(h) = join_handle { + let _ = h.await; + } // Le serveur HTTP est arrêté, mais des threads (ControlPoint, etc.) peuvent encore tourner // Attendre 2 secondes pour laisser le temps aux threads de se terminer diff --git a/pmoapp/webapp/src/composables/useWebRenderer.ts b/pmoapp/webapp/src/composables/useWebRenderer.ts new file mode 100644 index 00000000..68f52ee2 --- /dev/null +++ b/pmoapp/webapp/src/composables/useWebRenderer.ts @@ -0,0 +1,332 @@ +/** + * Composable pour gérer le WebRenderer navigateur. + * + * Se connecte automatiquement au WebSocket /api/webrenderer/ws au montage + * et se déconnecte proprement au démontage ou à la fermeture de la page. + * + * Le navigateur est ainsi vu comme un renderer UPnP par le ControlPoint. + * Un élément