调用getMetadata(id=playlists)返回多播放列表,Sonos S2仅显示其一且无曲目
问题分析与修复方案
核心问题:集合类型与结构不匹配
Sonos对播放列表的元数据响应有明确规范,你的返回存在两个关键问题:
1. 缺少正确的根集合类型标识
当Sonos请求id="playlists"的元数据时,必须先返回一个类型为playlistList的顶级mediaCollection,再把具体的播放列表项作为子元素嵌套进去,不能直接返回两个playlist类型的mediaCollection。
2. 播放列表项的可访问性配置缺失
单个播放列表的itemType确实是playlist,但必须同时设置canPlay="true"和canEnumerate="true"——Sonos需要canEnumerate来识别该集合可以展开获取内部曲目,只设置canPlay会让它直接尝试播放整个列表,而非请求曲目详情。
修正后的响应示例
<getMetadataResponse> <getMetadataResult> <count>1</count> <index>0</index> <total>1</total> <!-- 根集合:类型为playlistList --> <mediaCollection readOnly="false" userContent="false" renameable="false"> <itemType>playlistList</itemType> <id>playlists</id> <title>我的播放列表</title> <!-- 嵌套具体播放列表项 --> <mediaCollection readOnly="false" userContent="false" renameable="false"> <itemType>playlist</itemType> <id>playlist:29986647</id> <title>playlist-1</title> <albumArtURI>uri1</albumArtURI> <canPlay>true</canPlay> <canEnumerate>true</canEnumerate> </mediaCollection> <mediaCollection readOnly="false" userContent="false" renameable="false"> <itemType>playlist</itemType> <id>playlist:28002250</id> <title>playlist-2</title> <albumArtURI>uri2</albumArtURI> <canPlay>true</canPlay> <canEnumerate>true</canEnumerate> </mediaCollection> </mediaCollection> </getMetadataResult> </getMetadataResponse>
Bonob框架适配建议
基于Bonob框架特性,你需要:
- 处理
playlistsID的元数据请求时,先构建playlistList类型的父集合; - 为每个播放列表实体添加
canEnumerate属性(可通过实体类注解或配置字段设置); - 不要用
trackList替代playlist——trackList用于直接返回曲目列表,不适用于播放列表容器。
之前用albumList替代genre可行,是因为Sonos对部分列表类型有兼容性,但播放列表必须严格遵循playlistList包含playlist的结构。
内容的提问来源于stack exchange,提问作者Dan Gravell
相关产品推荐
相关产品推荐

