8.3 KiB
Rapport d'Analyse UPnP - PMO Music vs Serveurs Fonctionnels
Date: 2025-11-26 Problème: Le serveur UPnP de PMO Music n'est pas reconnu par BubbleUPnP
Résumé Exécutif
Le serveur PMO Music MediaServer est correctement découvert via SSDP et répond aux requêtes SOAP, mais présente plusieurs différences avec les serveurs qui fonctionnent (comme Upmpdcli). Les problèmes identifiés sont principalement liés aux en-têtes HTTP et aux métadonnées du device.
Découverte Réseau
Devices UPnP Détectés
| Device | IP | USN | Status |
|---|---|---|---|
| PMO Music MediaServer | 192.168.0.138:8080 | uuid:8b8e9b19-9c65-4d59-b127-b34717658085 | ✅ Découvert |
| Upmpdcli (pizzicato) | 192.168.0.200:49152 | uuid:c110358f-d885-b44a-d6d3-dca6329ead0d | ✅ Découvert |
| Freebox | 192.168.0.254:52424 | uuid:e929a46e-d218-377d-2dde-32bd8080dfbf | ✅ Découvert |
| Jellyfin | 192.168.0.34:8096 | uuid:526dedec-fde2-4224-bac6-06f7b11711cf | ✅ Découvert |
Conclusion SSDP: ✅ PMO Music est correctement annoncé et découvert via SSDP
Comparaison des Descripteurs XML
PMO Music MediaServer
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor> <!-- ⚠️ Version 1.0 -->
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>
<friendlyName>PMOMusic Media Server</friendlyName>
<manufacturer>PMOMusic</manufacturer>
<modelName>PMOMusic Media Server</modelName>
<UDN>uuid:8b8e9b19-9c65-4d59-b127-b34717658085</UDN> <!-- ✅ Format correct -->
<!-- ❌ Pas d'iconList -->
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:ContentDirectory:1</serviceType>
<serviceId>urn:upnp-org:serviceId:ContentDirectory</serviceId>
<SCPDURL>/device/.../service/ContentDirectory/desc.xml</SCPDURL>
<controlURL>/device/.../service/ContentDirectory/control</controlURL>
<eventSubURL>/device/.../service/ContentDirectory/event</eventSubURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
...
</service>
</serviceList>
</device>
</root>
Upmpdcli (Fonctionnel)
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>1</minor> <!-- ✅ Version 1.1 -->
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>
<manufacturer>lesbonscomptes.com/upmpdcli</manufacturer>
<modelName>Upmpdcli Media Server</modelName>
<friendlyName>pizzicato-Music-mediaserver</friendlyName>
<iconList> <!-- ✅ Présence d'icônes -->
<icon>
<mimetype>image/png</mimetype>
<width>64</width>
<height>64</height>
<depth>32</depth>
<url>/uuid-.../icon.png</url>
</icon>
</iconList>
<UDN>uuid:c110358f-d885-b44a-d6d3-dca6329ead0d</UDN>
<serviceList>
<!-- Mêmes services -->
</serviceList>
</device>
</root>
Différences Clés dans le Descripteur
| Élément | PMO Music | Upmpdcli | Impact |
|---|---|---|---|
| specVersion minor | 0 | 1 | ⚠️ Moyen - Certains clients peuvent filtrer par version |
| Ordre des éléments | deviceType, friendlyName, manufacturer, modelName, UDN | deviceType, manufacturer, modelName, friendlyName, iconList, UDN | ⚠️ Faible - Ordre différent mais valide XML |
| iconList | ❌ Absent | ✅ Présent | ⚠️ Moyen - Requis pour certains clients |
| UDN prefix | ✅ uuid: | ✅ uuid: | ✅ Correct |
Comparaison des Réponses SOAP
Test 1: ConnectionManager::GetProtocolInfo
PMO Music
Status: 200 OK
Content-Type: (absent) ⚠️ PROBLÈME CRITIQUE
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:GetProtocolInfoResponse xmlns:u="urn:schemas-upnp-org:service:ConnectionManager:1">
<Source></Source> ⚠️ Vide
<Sink></Sink> ⚠️ Vide
</u:GetProtocolInfoResponse>
</s:Body>
</s:Envelope>
Upmpdcli
Status: 200 OK
Content-Type: text/xml; charset="utf-8" ✅ Présent
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:GetProtocolInfoResponse xmlns:u="urn:schemas-upnp-org:service:ConnectionManager:1">
<Source></Source>
<Sink>http-get:*:audio/flac:*,http-get:*:audio/mp3:*,...</Sink> ✅ Formats listés
</u:GetProtocolInfoResponse>
</s:Body>
</s:Envelope>
Test 2: ContentDirectory::Browse
Les deux serveurs répondent correctement, mais PMO Music manque toujours le header Content-Type.
Problèmes Identifiés par Ordre de Criticité
🔴 CRITIQUE
-
Absence du header Content-Type dans les réponses SOAP
- Impact: Les clients UPnP stricts (comme BubbleUPnP) peuvent rejeter les réponses sans Content-Type
- Spec UPnP: La spécification UPnP Device Architecture 1.0 exige
Content-Type: text/xml; charset="utf-8" - Localisation probable: Dans le code de réponse SOAP du serveur UPnP
- Fichiers à vérifier:
pmoupnp/src/services/service_instance.rs(handler SOAP)pmoupnp/src/soap/builder.rs
-
ProtocolInfo vide pour Source et Sink
- Impact: Les clients ne savent pas quels formats audio sont supportés
- Spec UPnP: ConnectionManager doit annoncer les formats supportés
- Action: Implémenter la liste des formats dans ConnectionManager
🟡 MOYEN
-
specVersion 1.0 au lieu de 1.1
- Impact: Certains clients modernes peuvent filtrer les devices UPnP 1.0
- Solution: Passer à specVersion 1.1
-
Absence d'iconList
- Impact: Pas d'icône visible dans les clients UPnP
- Solution: Ajouter au moins une icône PNG 64x64
🟢 FAIBLE
- Ordre des éléments XML différent
- Impact: Minimal - XML valide dans tous les cas
- Action: Optionnel - standardiser l'ordre
Recommandations d'Implémentation
Priorité 1: Corriger le Content-Type
Localiser le code qui génère les réponses SOAP et ajouter le header:
// Dans pmoupnp/src/services/service_instance.rs ou similaire
(
StatusCode::OK,
[(header::CONTENT_TYPE, "text/xml; charset=\"utf-8\"")], // ← AJOUTER
xml
)
Priorité 2: Implémenter GetProtocolInfo correctement
Dans ConnectionManager, retourner la liste des formats supportés:
// Exemple de formats à supporter
let sink_protocols = vec![
"http-get:*:audio/flac:*",
"http-get:*:audio/mpeg:*",
"http-get:*:audio/mp4:*",
"http-get:*:audio/ogg:*",
// ...
];
Priorité 3: Passer à UPnP 1.1
Changer la specVersion de 1.0 à 1.1 dans le device descriptor.
Priorité 4: Ajouter une icône
Créer une icône PNG 64x64 et l'ajouter au descripteur:
<iconList>
<icon>
<mimetype>image/png</mimetype>
<width>64</width>
<height>64</height>
<depth>32</depth>
<url>/icon.png</url>
</icon>
</iconList>
Fichiers à Modifier
- pmoupnp/src/services/service_instance.rs - Ajouter Content-Type aux réponses SOAP
- pmoupnp/src/devices/device_methods.rs - Ajouter iconList au descripteur
- pmoupnp/src/devices/device.rs - Passer specVersion à 1.1
- pmomediaserver/src/connectionmanager/actions/getprotocolinfo.rs - Implémenter la liste des formats
Tests de Validation
Après les corrections, vérifier:
- ✅
curlsur le descripteur montre specVersion 1.1 et iconList - ✅ Requête SOAP GetProtocolInfo retourne
Content-Type: text/xml - ✅ GetProtocolInfo retourne les formats supportés dans Sink
- ✅ BubbleUPnP détecte et affiche le serveur PMO Music
Conclusion
Le serveur PMO Music est fonctionnellement correct au niveau de SSDP et des services SOAP, mais présente des problèmes de conformité aux standards UPnP qui peuvent causer des rejets par certains clients stricts comme BubbleUPnP.
Les corrections sont simples et localisées. La priorité absolue est d'ajouter le header Content-Type aux réponses SOAP.