Add media source support to Yamaha MusicCast (#67572)

This commit is contained in:
Paulus Schoutsen 2022-03-07 21:50:25 -08:00 committed by GitHub
parent c9ac0b49f6
commit 46984afbb8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,17 +1,22 @@
"""Implementation of the musiccast media player.""" """Implementation of the musiccast media player."""
from __future__ import annotations from __future__ import annotations
import contextlib
import logging import logging
from aiomusiccast import MusicCastGroupException, MusicCastMediaContent from aiomusiccast import MusicCastGroupException, MusicCastMediaContent
from aiomusiccast.features import ZoneFeature from aiomusiccast.features import ZoneFeature
import voluptuous as vol import voluptuous as vol
from homeassistant.components import media_source
from homeassistant.components.media_player import ( from homeassistant.components.media_player import (
PLATFORM_SCHEMA, PLATFORM_SCHEMA,
BrowseMedia, BrowseMedia,
MediaPlayerEntity, MediaPlayerEntity,
) )
from homeassistant.components.media_player.browse_media import (
async_process_play_media_url,
)
from homeassistant.components.media_player.const import ( from homeassistant.components.media_player.const import (
MEDIA_CLASS_DIRECTORY, MEDIA_CLASS_DIRECTORY,
MEDIA_CLASS_TRACK, MEDIA_CLASS_TRACK,
@ -333,6 +338,10 @@ class MusicCastMediaPlayer(MusicCastDeviceEntity, MediaPlayerEntity):
async def async_play_media(self, media_type: str, media_id: str, **kwargs) -> None: async def async_play_media(self, media_type: str, media_id: str, **kwargs) -> None:
"""Play media.""" """Play media."""
if media_source.is_media_source_id(media_id):
play_item = await media_source.async_resolve_media(self.hass, media_id)
media_id = play_item.url
if self.state == STATE_OFF: if self.state == STATE_OFF:
await self.async_turn_on() await self.async_turn_on()
@ -353,7 +362,9 @@ class MusicCastMediaPlayer(MusicCastDeviceEntity, MediaPlayerEntity):
) )
return return
if parts[0] == "http": if parts[0] in ("http", "https") or media_id.startswith("/"):
media_id = async_process_play_media_url(self.hass, media_id)
await self.coordinator.musiccast.play_url_media( await self.coordinator.musiccast.play_url_media(
self._zone_id, media_id, "HomeAssistant" self._zone_id, media_id, "HomeAssistant"
) )
@ -365,6 +376,15 @@ class MusicCastMediaPlayer(MusicCastDeviceEntity, MediaPlayerEntity):
async def async_browse_media(self, media_content_type=None, media_content_id=None): async def async_browse_media(self, media_content_type=None, media_content_id=None):
"""Implement the websocket media browsing helper.""" """Implement the websocket media browsing helper."""
if media_content_id and media_source.is_media_source_id(media_content_id):
return await media_source.async_browse_media(
self.hass,
media_content_id,
content_filter=lambda item: item.media_content_type.startswith(
"audio/"
),
)
if self.state == STATE_OFF: if self.state == STATE_OFF:
raise HomeAssistantError( raise HomeAssistantError(
"The device has to be turned on to be able to browse media." "The device has to be turned on to be able to browse media."
@ -375,11 +395,13 @@ class MusicCastMediaPlayer(MusicCastDeviceEntity, MediaPlayerEntity):
media_content_provider = await MusicCastMediaContent.browse_media( media_content_provider = await MusicCastMediaContent.browse_media(
self.coordinator.musiccast, self._zone_id, media_content_path, 24 self.coordinator.musiccast, self._zone_id, media_content_path, 24
) )
add_media_source = False
else: else:
media_content_provider = MusicCastMediaContent.categories( media_content_provider = MusicCastMediaContent.categories(
self.coordinator.musiccast, self._zone_id self.coordinator.musiccast, self._zone_id
) )
add_media_source = True
def get_content_type(item): def get_content_type(item):
if item.can_play: if item.can_play:
@ -399,6 +421,21 @@ class MusicCastMediaPlayer(MusicCastDeviceEntity, MediaPlayerEntity):
for child in media_content_provider.children for child in media_content_provider.children
] ]
if add_media_source:
with contextlib.suppress(media_source.BrowseError):
item = await media_source.async_browse_media(
self.hass,
None,
content_filter=lambda item: item.media_content_type.startswith(
"audio/"
),
)
# If domain is None, it's overview of available sources
if item.domain is None:
children.extend(item.children)
else:
children.append(item)
overview = BrowseMedia( overview = BrowseMedia(
title=media_content_provider.title, title=media_content_provider.title,
media_class=MEDIA_CLASS_MAPPING.get(media_content_provider.content_type), media_class=MEDIA_CLASS_MAPPING.get(media_content_provider.content_type),