Allow squeezebox to play media sources (#67561)

This commit is contained in:
Paulus Schoutsen 2022-03-04 06:41:51 -08:00 committed by GitHub
parent 12a7b64e64
commit cf1a21eb6e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 4 deletions

View File

@ -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"]

View File

@ -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,