From f0829cbfac532b31fd14677b025107f6a3ee2085 Mon Sep 17 00:00:00 2001 From: Aaron Hertz Date: Sun, 18 Aug 2019 20:23:03 +0000 Subject: [PATCH 1/4] Add handling for Sonos playlists in media_player.play_media --- homeassistant/components/sonos/media_player.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sonos/media_player.py b/homeassistant/components/sonos/media_player.py index a4d461f289f2..8be8a26acbab 100644 --- a/homeassistant/components/sonos/media_player.py +++ b/homeassistant/components/sonos/media_player.py @@ -938,9 +938,21 @@ def play_media(self, media_type, media_id, **kwargs): """ Send the play_media command to the media player. + If media_type is "playlist", media_id should be a Sonos + Playlist name. Otherwise, media_id should be a URI. + If ATTR_MEDIA_ENQUEUE is True, add `media_id` to the queue. """ - if kwargs.get(ATTR_MEDIA_ENQUEUE): + if media_type == "playlist": + try: + playlists = self.soco.get_sonos_playlists() + playlist = next(p for p in playlists if p.title == media_id) + self.soco.clear_queue() + self.soco.add_to_queue(playlist) + self.soco.play_from_queue(0) + except StopIteration: + _LOGGER.error('Could not find a Sonos playlist named "%s".', media_id) + elif kwargs.get(ATTR_MEDIA_ENQUEUE): try: self.soco.add_uri_to_queue(media_id) except SoCoUPnPException: From e7df8a601b2509b8b15fa388222d6a033e0a9487 Mon Sep 17 00:00:00 2001 From: Aaron Hertz Date: Sun, 18 Aug 2019 20:33:25 +0000 Subject: [PATCH 2/4] Avoid breaking change by falling back to previous behavior --- homeassistant/components/sonos/media_player.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sonos/media_player.py b/homeassistant/components/sonos/media_player.py index 8be8a26acbab..68adcd4537b1 100644 --- a/homeassistant/components/sonos/media_player.py +++ b/homeassistant/components/sonos/media_player.py @@ -950,9 +950,12 @@ def play_media(self, media_type, media_id, **kwargs): self.soco.clear_queue() self.soco.add_to_queue(playlist) self.soco.play_from_queue(0) + return except StopIteration: _LOGGER.error('Could not find a Sonos playlist named "%s".', media_id) - elif kwargs.get(ATTR_MEDIA_ENQUEUE): + # Fall through to the previous behavior, in case someone is relying on + # passing a URI with a media_type of "playlist" + if kwargs.get(ATTR_MEDIA_ENQUEUE): try: self.soco.add_uri_to_queue(media_id) except SoCoUPnPException: From b685ededcf7d019fcbc2a1aa9b3683b9545020e2 Mon Sep 17 00:00:00 2001 From: Aaron Hertz Date: Sun, 18 Aug 2019 21:15:58 +0000 Subject: [PATCH 3/4] Use the proper MEDIA_TYPE_PLAYLIST constant. --- homeassistant/components/sonos/media_player.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sonos/media_player.py b/homeassistant/components/sonos/media_player.py index 68adcd4537b1..7c8e4af88d7c 100644 --- a/homeassistant/components/sonos/media_player.py +++ b/homeassistant/components/sonos/media_player.py @@ -15,6 +15,7 @@ from homeassistant.components.media_player.const import ( ATTR_MEDIA_ENQUEUE, MEDIA_TYPE_MUSIC, + MEDIA_TYPE_PLAYLIST, SUPPORT_CLEAR_PLAYLIST, SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, @@ -943,7 +944,7 @@ def play_media(self, media_type, media_id, **kwargs): If ATTR_MEDIA_ENQUEUE is True, add `media_id` to the queue. """ - if media_type == "playlist": + if media_type == MEDIA_TYPE_PLAYLIST: try: playlists = self.soco.get_sonos_playlists() playlist = next(p for p in playlists if p.title == media_id) From bcf75391b08f238942d3685960f9ad04be4b0407 Mon Sep 17 00:00:00 2001 From: Aaron Hertz Date: Sun, 18 Aug 2019 22:57:21 +0000 Subject: [PATCH 4/4] Addressed comments, restricting media_type to music or playlist --- .../components/sonos/media_player.py | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/sonos/media_player.py b/homeassistant/components/sonos/media_player.py index 7c8e4af88d7c..86e306213345 100644 --- a/homeassistant/components/sonos/media_player.py +++ b/homeassistant/components/sonos/media_player.py @@ -944,30 +944,30 @@ def play_media(self, media_type, media_id, **kwargs): If ATTR_MEDIA_ENQUEUE is True, add `media_id` to the queue. """ - if media_type == MEDIA_TYPE_PLAYLIST: + if media_type == MEDIA_TYPE_MUSIC: + if kwargs.get(ATTR_MEDIA_ENQUEUE): + try: + self.soco.add_uri_to_queue(media_id) + except SoCoUPnPException: + _LOGGER.error( + 'Error parsing media uri "%s", ' + "please check it's a valid media resource " + "supported by Sonos", + media_id, + ) + else: + self.soco.play_uri(media_id) + elif media_type == MEDIA_TYPE_PLAYLIST: try: playlists = self.soco.get_sonos_playlists() playlist = next(p for p in playlists if p.title == media_id) self.soco.clear_queue() self.soco.add_to_queue(playlist) self.soco.play_from_queue(0) - return except StopIteration: - _LOGGER.error('Could not find a Sonos playlist named "%s".', media_id) - # Fall through to the previous behavior, in case someone is relying on - # passing a URI with a media_type of "playlist" - if kwargs.get(ATTR_MEDIA_ENQUEUE): - try: - self.soco.add_uri_to_queue(media_id) - except SoCoUPnPException: - _LOGGER.error( - 'Error parsing media uri "%s", ' - "please check it's a valid media resource " - "supported by Sonos", - media_id, - ) + _LOGGER.error('Could not find a Sonos playlist named "%s"', media_id) else: - self.soco.play_uri(media_id) + _LOGGER.error('Sonos does not support a media type of "%s"', media_type) @soco_error() def join(self, slaves):