如何使用 Python soco 播放 Sonos 播放列表?

How can I play a Sonos playlist using Python soco?

我正在尝试从 Python soco 加载一个 sonos 播放列表,以便我可以从我的 PC 控制音乐。

感谢soco的开发者。播放我的音乐库中的单个曲目和流式传输互联网音频非常方便。我只是还没有想出如何使用 sonos 播放列表。

设区域为 SoCo object,代表 Sonos 扬声器或扬声器对。每个区域都有一个当前 queue 存储在其 zone.contentDirectory 中。我想我需要用播放列表中的曲目替换此 queue,但我还没有找到如何枚举播放列表中的曲目。此外,播放播放列表 URI 不起作用。

sonos 播放列表列表可用

import soco

zone = soco.Soco('192.168.1.249')
zone.get_playlists()

一个特定的播放列表可以通过其标题获得

pl = zone.get_sonos_playlist_by_attr('title', 'Dance').

当我查看播放列表的详细信息时,唯一的曲目信息 似乎是 Sonos 设备上的一个 uri。

>>> pprint(pl.to_dict())
{u'desc': None,
 u'item_id': u'SQ:28',
 u'parent_id': u'SQ:',
 u'resources': [{u'bitrate': None,
                 u'bits_per_sample': None,
                 u'color_depth': None,
                 u'duration': None,
                 u'import_uri': None,
                 u'nr_audio_channels': None,
                 u'protection': None,
                 u'protocol_info': 'file:*:audio/mpegurl:*',
                 u'resolution': None,
                 u'sample_frequency': None,
                 u'size': None,
                 u'uri': 'file:///jffs/settings/savedqueues.rsq#28'}],
 u'restricted': True,
 u'title': u'Dance'}

但是这个uri不能用zone.play_uri()播放。

>>> zone.play_uri('file:///jffs/settings/savedqueues.rsq#28')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/soco/core.py", line 104, in inner_function
    return function(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/soco/core.py", line 483, in play_uri
    ('CurrentURIMetaData', meta)
  File "/usr/local/lib/python2.7/dist-packages/soco/services.py", line 181, in _dispatcher
    return self.send_command(action, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/soco/services.py", line 408, in send_command
    self.handle_upnp_error(response.text)
  File "/usr/local/lib/python2.7/dist-packages/soco/services.py", line 469, in handle_upnp_error
    error_xml=xml_error
soco.exceptions.SoCoUPnPException: UPnP Error 714 received: Illegal MIME-Type from 192.168.1.249

我想我需要将 queue 替换为播放列表 uri 中的曲目,但如何获取它们?

您必须使用不同的方法。首先你必须清除队列(如果你想删除旧曲目),然后你可以使用 add_uri_to_queue 将播放列表曲目添加到 Sonos 队列,最后你可以使用 play.

import soco

sonos = soco.SoCo("192.168.1.249")

uri = "file:///jffs/settings/savedqueues.rsq#28"
sonos.clear_queue()
sonos.add_uri_to_queue(uri=uri)
sonos.play_from_queue(index=0)