0

当我更新到 5.4 版时,我不再可以选择在“播放列表”容器中创建播放列表,也无法将曲目添加到其中已经存在的播放列表。在 5.3 版中,它运行良好。我还检查了 Sonos 上的其他音乐服务,同样的问题。播放列表编辑文档中未指定的用户内容播放列表规范是否有任何更改?

这就是我添加用户内容容器的方式:

$result->mediaCollection[] = array('id'=>'playlists', 'title'=>'My Playlists', 'itemType'=>'favorites', 'containsFavorite'=>true, 'displayType'=>'genreList', 'readOnly'=>false, 'userContent'=>true, 'renameable'=>true, 'albumArtURI'=>PATH.'/img.png');

编辑:
我正在使用 Android 控制器(5.4 版,内​​部版本 29590261),我正在 Play:1(5.4 版,内​​部版本 29591030)上进行测试。
我可以将歌曲/播放列表添加到已经存在的播放列表或新的播放列表(通过长按歌曲以获取扩展元数据,然后“将曲目添加到'服务名称'播放列表”),但我不知道怎么做的是:删除播放列表,重命名播放列表,以及编辑播放列表中的歌曲(重新排序、删除歌曲)。我没有 5.3 版的屏幕截图,但播放列表容器的右上角(三个垂直点)有一个按钮,可以从中编辑播放列表或创建新播放列表(查看下面的屏幕截图,来自 5.4 版)。我错过了什么吗?

播放列表容器 长按播放列表容器

编辑2:
我弄清楚是什么导致了这个问题。我正在使用 .wsdl 进行测试,以便能够实现自定义项目显示(这不再是测试版,正如我从添加新 SMAPI 功能页面中了解到的那样)。当我从 Sonos 文档恢复到正常的Sonos.wsdl 文件时,信息和选项按钮再次出现。如何在保持信息和选项按钮以及播放列表编辑的所有功能不变的同时使用自定义项目显示?

注意:Sonos(beta).wsdl 在这里,但它不再可用。

编辑 3:我从Sonos 文档
下载了 Sonos.wsdl ,但我仍然看不到该按钮。为了重现该问题,请检查以下 PHP 实现和 Presentation Map XML 代码:

PHP实现:

define('BASE_PATH', rtrim("http://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']), '/'));

class SonosAPI
{
    public function getMetadata($args)
    {
        $result = new StdClass();
        $result->index = $args->index;
        switch($args->id) {
            case 'root':
                $result->mediaCollection[] = array('id'=>'playlists', 'title'=>'My Playlists', 'itemType'=>'favorites', 'displayType'=>'genreList', 'readOnly'=>false, 'userContent'=>true, 'renameable'=>true, 'albumArtURI'=>BASE_PATH.'/image.png');
                $result->count = $result->total = 1;
                break;
            case 'playlists':
                $result->mediaCollection[] = array('id'=>'123', 'title'=>'Title', 'itemType'=>'playlist', 'displayType'=>'genreList', 'canPlay'=>true, 'readOnly'=>false, 'userContent'=>false, 'renameable'=>true, 'albumArtURI'=>BASE_PATH.'/image.png');
                $result->count = $result->total = 1;
                break;
        }

        return array('getMetadataResult' => $result);
    }

}

$server = new SoapServer("Sonos.wsdl", array('cache_wsdl' => 0)); // disable cache in development
$server->setClass('SonosAPI');

try {
    $server->handle();
} catch (Exception $e) {
    Log("[ERROR] ".$e->getMessage());
}

?>

演示地图文件:

<?xml version="1.0" encoding="utf-8" ?>
<Presentation>

    <PresentationMap type="DisplayType">
        <DisplayType id="genreGrid">
            <DisplayMode>GRID</DisplayMode>
        </DisplayType>
        <DisplayType id="genreList">
            <DisplayMode>LIST</DisplayMode>
        </DisplayType>
        <DisplayType id="genreHero">
            <DisplayMode>HERO</DisplayMode>
        </DisplayType>
        <DisplayType id="genreEditorial">
            <DisplayMode>EDITORIAL</DisplayMode>
        </DisplayType>
        <DisplayType id="twoLine">
          <Lines>
            <Line token="title"/>
            <Line token="summary"/>
          </Lines>
        </DisplayType>
    </PresentationMap>

</Presentation>

对根的 getMetadata 的 XML 响应(包含播放列表容器):

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns1="http://www.sonos.com/Services/1.1" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Body>
      <ns1:getMetadataResponse>
         <ns1:getMetadataResult>
            <ns1:index>0</ns1:index>
            <ns1:count>4</ns1:count>
            <ns1:total>4</ns1:total>
            <ns1:mediaCollection>
               <ns1:id>rootlang:ar</ns1:id>
               <ns1:itemType>collection</ns1:itemType>
               <ns1:displayType>genreGrid</ns1:displayType>
               <ns1:title>Arabic</ns1:title>
               <ns1:albumArtURI>{SOME LINK}</ns1:albumArtURI>
            </ns1:mediaCollection>
            <ns1:mediaCollection>
               <ns1:id>rootlang:en</ns1:id>
               <ns1:itemType>collection</ns1:itemType>
               <ns1:displayType>genreGrid</ns1:displayType>
               <ns1:title>International</ns1:title>
               <ns1:albumArtURI>{SOME LINK}</ns1:albumArtURI>
            </ns1:mediaCollection>
            <ns1:mediaCollection>
               <ns1:id>rootlang:default</ns1:id>
               <ns1:itemType>collection</ns1:itemType>
               <ns1:displayType>genreGrid</ns1:displayType>
               <ns1:title>Arabic + International</ns1:title>
               <ns1:albumArtURI>{SOME LINK}</ns1:albumArtURI>
            </ns1:mediaCollection>
            <ns1:mediaCollection renameable="true" readOnly="false" userContent="true">
               <ns1:id>playlists</ns1:id>
               <ns1:itemType>favorites</ns1:itemType>
               <ns1:displayType>genreList</ns1:displayType>
               <ns1:title>My Playlists</ns1:title>
               <ns1:albumArtURI>{SOME LINK}</ns1:albumArtURI>
            </ns1:mediaCollection>
         </ns1:getMetadataResult>
      </ns1:getMetadataResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

对播放列表的 getMetadata 的 XML 响应:

 <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns1="http://www.sonos.com/Services/1.1" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Body>
      <ns1:getMetadataResponse>
         <ns1:getMetadataResult>
            <ns1:index>0</ns1:index>
            <ns1:count>1</ns1:count>
            <ns1:total>1</ns1:total>
            <ns1:mediaCollection renameable="true" readOnly="false" userContent="false">
               <ns1:id>playlist:19663408</ns1:id>
               <ns1:itemType>playlist</ns1:itemType>
               <ns1:displayType>genreList</ns1:displayType>
               <ns1:title>Test Playlist</ns1:title>
               <ns1:canPlay>true</ns1:canPlay>
               <ns1:albumArtURI>{SOME LINK}</ns1:albumArtURI>
            </ns1:mediaCollection>
         </ns1:getMetadataResult>
      </ns1:getMetadataResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
4

1 回答 1

0

最新的生产软件更新中提供了自定义显示类型。您使用的 beta wsdl 适用于 v5.4,它现在是当前的生产版本。确保您使用的是 wsdl 的生产版本,并且您将拥有信息和选项,并且还可以访问自定义显示类型(前提是它们在您的服务中正确启用)。

但是,我已经确认,在启用播放列表编辑的情况下,将显示类型与播放列表容器一起使用时确实存在错误。解决方法是从根播放列表和子播放列表容器中删除 displayType 节点(不需要更改所有其他使用 displayType 的容器)。这种解决方法已经过测试并且有效。我们已经打开了一个问题来在内部跟踪这个问题。

于 2015-08-06T16:42:18.933 回答