From f9cd3063fb1788efaa340992d66087ab55a7ad78 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Sun, 1 Mar 2026 17:53:59 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20la=20prise=20en=20charge=20de=20l'?= =?UTF-8?q?h=C3=B4te=20du=20serveur=20pour=20les=20renderers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cette mise à jour ajoute la prise en charge de l'adresse IP du serveur hébergeant les renderers UPnP. Cela permet d'afficher l'adresse IP des renderers dans l'interface utilisateur lorsqu'ils ont des noms identiques. Les modifications incluent : - Mise à jour des types pour inclure le champ server_host - Extraction de l'adresse IP depuis la location UPnP - Affichage de l'adresse IP dans l'interface utilisateur pour les renderers avec des noms en double - Modification des appels à register_device pour désactiver le SSDP lors de l'enregistrement des renderers Cela améliore la clarté de l'interface utilisateur en permettant de distinguer les renderers avec des noms identiques mais hébergés sur des serveurs différents. --- PMOMusic/src/main.rs | 4 ++-- .../src/components/unified/RendererDrawer.vue | 13 +++++++++++-- pmoapp/webapp/src/services/pmocontrol/types.ts | 1 + pmocontrol/src/openapi.rs | 2 ++ pmocontrol/src/pmoserver_ext.rs | 8 ++++++++ pmoupnp/src/upnp_server.rs | 8 +++++--- pmowebrenderer/src/registry.rs | 2 +- 7 files changed, 30 insertions(+), 8 deletions(-) diff --git a/PMOMusic/src/main.rs b/PMOMusic/src/main.rs index 4b55a57a..bf0570ae 100644 --- a/PMOMusic/src/main.rs +++ b/PMOMusic/src/main.rs @@ -74,7 +74,7 @@ async fn main() -> Result<(), Box> { let renderer_instance = server .write() .await - .register_device(MEDIA_RENDERER.clone()) + .register_device(MEDIA_RENDERER.clone(), true) .await .expect("Failed to register MediaRenderer"); @@ -85,7 +85,7 @@ async fn main() -> Result<(), Box> { let server_instance = server .write() .await - .register_device(MEDIA_SERVER.clone()) + .register_device(MEDIA_SERVER.clone(), true) .await .expect("Failed to register MediaServer"); diff --git a/pmoapp/webapp/src/components/unified/RendererDrawer.vue b/pmoapp/webapp/src/components/unified/RendererDrawer.vue index fa7b561c..88a82dc7 100644 --- a/pmoapp/webapp/src/components/unified/RendererDrawer.vue +++ b/pmoapp/webapp/src/components/unified/RendererDrawer.vue @@ -116,6 +116,15 @@ const offlineRenderers = computed(() => allRenderers.value.filter((r: RendererSummary) => !r.online), ); +// Noms de renderers qui apparaissent plus d'une fois (online + offline) +const duplicateNames = computed(() => { + const counts = new Map(); + for (const r of allRenderers.value) { + counts.set(r.friendly_name, (counts.get(r.friendly_name) ?? 0) + 1); + } + return new Set([...counts.entries()].filter(([, n]) => n > 1).map(([name]) => name)); +}); + function close() { emit("update:modelValue", false); } @@ -296,7 +305,7 @@ async function handleTransferQueue(event: Event, targetRendererId: string) { getProtocolLabel( renderer.protocol, ) - }} + }}{{ duplicateNames.has(renderer.friendly_name) && renderer.server_host ? ` [${renderer.server_host}]` : '' }}
@@ -383,7 +392,7 @@ async function handleTransferQueue(event: Event, targetRendererId: string) {

- {{ renderer.friendly_name }} + {{ renderer.friendly_name }}{{ duplicateNames.has(renderer.friendly_name) && renderer.server_host ? ` [${renderer.server_host}]` : '' }}

, } /// Protocole exposé par le renderer diff --git a/pmocontrol/src/pmoserver_ext.rs b/pmocontrol/src/pmoserver_ext.rs index f76ec5a6..eb5330b8 100644 --- a/pmocontrol/src/pmoserver_ext.rs +++ b/pmocontrol/src/pmoserver_ext.rs @@ -102,6 +102,13 @@ async fn list_renderers(State(state): State) -> Json) -> Json>() diff --git a/pmoupnp/src/upnp_server.rs b/pmoupnp/src/upnp_server.rs index 9ebe2d0f..467755b8 100644 --- a/pmoupnp/src/upnp_server.rs +++ b/pmoupnp/src/upnp_server.rs @@ -97,6 +97,7 @@ pub trait UpnpServerExt { async fn register_device( &mut self, device: Arc, + with_ssdp: bool, ) -> Result, DeviceError>; /// Retourne le nombre de devices enregistrés. @@ -232,6 +233,7 @@ impl UpnpServerExt for Server { async fn register_device( &mut self, device: Arc, + with_ssdp: bool, ) -> Result, DeviceError> { use tracing::info; @@ -259,8 +261,8 @@ impl UpnpServerExt for Server { .register(di.clone()) .map_err(|e| DeviceError::UrlRegistrationError(e))?; - // Annoncer via SSDP (si initialisé) - if self.ssdp_enabled() { + // Annoncer via SSDP (si initialisé et demandé) + if with_ssdp && self.ssdp_enabled() { let ssdp_opt = SSDP_SERVER.read().unwrap(); if let Some(ref ssdp) = *ssdp_opt { use crate::config_ext::UpnpConfigExt; @@ -507,7 +509,7 @@ mod tests { "Test Renderer".to_string(), )); - let instance = server.register_device(device).await.unwrap(); + let instance = server.register_device(device, false).await.unwrap(); // Vérifier que le device est dans le registre assert_eq!(server.device_count(), 1); diff --git a/pmowebrenderer/src/registry.rs b/pmowebrenderer/src/registry.rs index 7e1c81eb..7cb187b7 100644 --- a/pmowebrenderer/src/registry.rs +++ b/pmowebrenderer/src/registry.rs @@ -263,7 +263,7 @@ impl RendererRegistry { let mut server = server_arc.write().await; server - .register_device(Arc::new(device)) + .register_device(Arc::new(device), false) .await .map_err(|e| WebRendererError::RegistrationError(e.to_string()))? };