From cf1a21eb6e1ae20e2703aaf55693b68d6d9eb5b9 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 4 Mar 2022 06:41:51 -0800 Subject: [PATCH] Allow squeezebox to play media sources (#67561) --- .../components/squeezebox/browse_media.py | 21 ++++++++++++++- .../components/squeezebox/media_player.py | 27 ++++++++++++++++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/squeezebox/browse_media.py b/homeassistant/components/squeezebox/browse_media.py index 81d0231ae70..76627119b85 100644 --- a/homeassistant/components/squeezebox/browse_media.py +++ b/homeassistant/components/squeezebox/browse_media.py @@ -1,4 +1,7 @@ """Support for media browsing.""" +import contextlib + +from homeassistant.components import media_source from homeassistant.components.media_player import BrowseError, BrowseMedia from homeassistant.components.media_player.const import ( MEDIA_CLASS_ALBUM, @@ -134,7 +137,7 @@ async def build_item_response(entity, player, payload): ) -async def library_payload(player): +async def library_payload(hass, player): """Create response payload to describe contents of library.""" library_info = { "title": "Music Library", @@ -161,13 +164,29 @@ async def library_payload(player): media_content_type=item, can_play=True, can_expand=True, + thumbnail="https://brands.home-assistant.io/_/squeezebox/logo.png", ) ) + with contextlib.suppress(media_source.BrowseError): + item = await media_source.async_browse_media( + hass, None, content_filter=media_source_content_filter + ) + # If domain is None, it's overview of available sources + if item.domain is None: + library_info["children"].extend(item.children) + else: + library_info["children"].append(item) + response = BrowseMedia(**library_info) return response +def media_source_content_filter(item: BrowseMedia) -> bool: + """Content filter for media sources.""" + return item.media_content_type.startswith("audio/") + + async def generate_playlist(player, payload): """Generate playlist from browsing payload.""" media_type = payload["search_type"] diff --git a/homeassistant/components/squeezebox/media_player.py b/homeassistant/components/squeezebox/media_player.py index 5956b9fdf06..d8a1c29b723 100644 --- a/homeassistant/components/squeezebox/media_player.py +++ b/homeassistant/components/squeezebox/media_player.py @@ -8,7 +8,11 @@ import logging from pysqueezebox import Server, async_discover import voluptuous as vol +from homeassistant.components import media_source from homeassistant.components.media_player import MediaPlayerEntity +from homeassistant.components.media_player.browse_media import ( + async_process_play_media_url, +) from homeassistant.components.media_player.const import ( ATTR_MEDIA_ENQUEUE, MEDIA_TYPE_MUSIC, @@ -53,7 +57,12 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.event import async_call_later from homeassistant.util.dt import utcnow -from .browse_media import build_item_response, generate_playlist, library_payload +from .browse_media import ( + build_item_response, + generate_playlist, + library_payload, + media_source_content_filter, +) from .const import DISCOVERY_TASK, DOMAIN, KNOWN_PLAYERS, PLAYER_DISCOVERY_UNSUB SERVICE_CALL_METHOD = "call_method" @@ -460,7 +469,14 @@ class SqueezeBoxEntity(MediaPlayerEntity): if kwargs.get(ATTR_MEDIA_ENQUEUE): cmd = "add" - if media_type == MEDIA_TYPE_MUSIC: + if media_source.is_media_source_id(media_id): + media_type = MEDIA_TYPE_MUSIC + play_item = await media_source.async_resolve_media(self.hass, media_id) + media_id = play_item.url + + if media_type in MEDIA_TYPE_MUSIC: + media_id = async_process_play_media_url(self.hass, media_id) + await self._player.async_load_url(media_id, cmd) return @@ -554,7 +570,12 @@ class SqueezeBoxEntity(MediaPlayerEntity): ) if media_content_type in [None, "library"]: - return await library_payload(self._player) + return await library_payload(self.hass, self._player) + + if media_source.is_media_source_id(media_content_id): + return await media_source.async_browse_media( + self.hass, media_content_id, content_filter=media_source_content_filter + ) payload = { "search_type": media_content_type,