diff --git a/pmoapp/webapp/src/components/unified/RendererDrawer.vue b/pmoapp/webapp/src/components/unified/RendererDrawer.vue index 5acfe839..1e81e9b1 100644 --- a/pmoapp/webapp/src/components/unified/RendererDrawer.vue +++ b/pmoapp/webapp/src/components/unified/RendererDrawer.vue @@ -36,12 +36,14 @@ const myUdn = computed(() => webRenderer.rendererUdn.value); const filteredRenderers = computed(() => { const udn = myUdn.value; + const normalizedUdn = udn?.replace(/^uuid:/, '') ?? null; return allRenderers.value.filter((r: RendererSummary) => { - // Show only our own WebRenderer based on UDN match - const isWebRenderer = r.model_name?.includes("WebRenderer") ?? false; + // WebRenderers have "Web Audio – " as friendly_name prefix + const isWebRenderer = r.friendly_name?.startsWith("Web Audio – ") ?? false; if (isWebRenderer) { - if (udn === null) return false; - return r.id === udn; + if (normalizedUdn === null) return false; + const normalizedId = r.id.replace(/^uuid:/, ''); + return normalizedId === normalizedUdn; } return true; }); diff --git a/pmoapp/webapp/src/composables/useRenderers.ts b/pmoapp/webapp/src/composables/useRenderers.ts index f9e62ae6..49a9bdc6 100644 --- a/pmoapp/webapp/src/composables/useRenderers.ts +++ b/pmoapp/webapp/src/composables/useRenderers.ts @@ -63,6 +63,7 @@ function ensureSSEInitialized() { id: rendererId, friendly_name: event.friendly_name, model_name: event.model_name, + manufacturer: event.manufacturer, protocol: "upnp", // Valeur par défaut, sera mise à jour par le fetch capabilities: { has_avtransport: false, diff --git a/pmoapp/webapp/src/services/pmocontrol/types.ts b/pmoapp/webapp/src/services/pmocontrol/types.ts index 3c8b1daf..8c4f6f96 100644 --- a/pmoapp/webapp/src/services/pmocontrol/types.ts +++ b/pmoapp/webapp/src/services/pmocontrol/types.ts @@ -29,6 +29,7 @@ export interface RendererSummary { id: string; friendly_name: string; model_name: string; + manufacturer?: string; protocol: RendererProtocolSummary; capabilities: RendererCapabilitiesSummary; online: boolean; diff --git a/pmoapp/webapp/src/views/UnifiedControlView.vue b/pmoapp/webapp/src/views/UnifiedControlView.vue index a231e08e..e7e42f1b 100644 --- a/pmoapp/webapp/src/views/UnifiedControlView.vue +++ b/pmoapp/webapp/src/views/UnifiedControlView.vue @@ -77,9 +77,9 @@ const onlineServersCount = computed( () => allServers.value.filter((s) => s.online).length, ); -// Nombre de renderers online pour afficher dans le badge +// Nombre de renderers online (filtrés) pour afficher dans le badge const onlineRenderersCount = computed( - () => allRenderers.value.filter((r) => r.online).length, + () => filterRenderers(allRenderers.value).filter((r) => r.online).length, ); // Gestion de l'ouverture du drawer depuis le bouton @@ -106,11 +106,14 @@ function handleRendererSelect(rendererId: string) { // Filter to show only our own WebRenderer based on UDN match function filterRenderers(renderers: typeof allRenderers.value) { const myUdn = webRenderer.rendererUdn.value; + const normalizedUdn = myUdn?.replace(/^uuid:/, '') ?? null; return renderers.filter((r) => { - const isWebRenderer = r.model_name?.includes("WebRenderer") ?? false; + // WebRenderers have "Web Audio – " as friendly_name prefix + const isWebRenderer = r.friendly_name?.startsWith("Web Audio – ") ?? false; if (isWebRenderer) { - if (myUdn === null) return false; - return r.id === myUdn; + if (normalizedUdn === null) return false; + const normalizedId = r.id.replace(/^uuid:/, ''); + return normalizedId === normalizedUdn; } return true; }); diff --git a/pmomediarenderer/src/registry.rs b/pmomediarenderer/src/registry.rs index ec6f0032..f7321cf3 100644 --- a/pmomediarenderer/src/registry.rs +++ b/pmomediarenderer/src/registry.rs @@ -358,7 +358,7 @@ impl MediaRendererRegistry { udn_with_prefix.clone(), model.friendly_name().to_string(), model.model_name().to_string(), - "PMOMusic".to_string(), + "PMOMusic-WebRenderer".to_string(), RendererProtocol::UpnpAvOnly, RendererCapabilities { has_avtransport: true,