From 64ffde41d6899c371016836f2cae8afbca9826ed Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Thu, 3 Apr 2025 00:32:44 +0200 Subject: [PATCH] Chore: allow to choose default media receiver for cast --- .../providers/chromecast/__init__.py | 41 +++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/music_assistant/providers/chromecast/__init__.py b/music_assistant/providers/chromecast/__init__.py index 938bf1eb..66325fec 100644 --- a/music_assistant/providers/chromecast/__init__.py +++ b/music_assistant/providers/chromecast/__init__.py @@ -12,7 +12,14 @@ from typing import TYPE_CHECKING, Any from uuid import UUID import pychromecast -from music_assistant_models.enums import MediaType, PlayerFeature, PlayerState, PlayerType +from music_assistant_models.config_entries import ConfigEntry +from music_assistant_models.enums import ( + ConfigEntryType, + MediaType, + PlayerFeature, + PlayerState, + PlayerType, +) from music_assistant_models.errors import PlayerUnavailableError from music_assistant_models.player import DeviceInfo, Player, PlayerMedia from pychromecast.controllers.media import STREAM_TYPE_BUFFERED, STREAM_TYPE_LIVE, MediaController @@ -34,7 +41,7 @@ from music_assistant.models.player_provider import PlayerProvider from .helpers import CastStatusListener, ChromecastInfo if TYPE_CHECKING: - from music_assistant_models.config_entries import ConfigEntry, ConfigValueType, ProviderConfig + from music_assistant_models.config_entries import ConfigValueType, ProviderConfig from music_assistant_models.provider import ProviderManifest from pychromecast.controllers.media import MediaStatus from pychromecast.controllers.receiver import CastStatus @@ -44,10 +51,26 @@ if TYPE_CHECKING: from music_assistant import MusicAssistant from music_assistant.models import ProviderInstanceType +MASS_APP_ID = "C35B0678" +APP_MEDIA_RECEIVER = "CC1AD845" +CONF_USE_MASS_APP = "use_mass_app" + CAST_PLAYER_CONFIG_ENTRIES = ( CONF_ENTRY_OUTPUT_CODEC, CONF_ENTRY_HTTP_PROFILE, + ConfigEntry( + key=CONF_USE_MASS_APP, + type=ConfigEntryType.BOOLEAN, + label="Use Music Assistant Cast App", + default_value=True, + description="By default, Music Assistant will use a special Music Assistant " + "Cast Receiver app to play media on cast devices. It is tweaked to provide " + "better metadata and future expansion. \n\n" + "If you want to use the official Google Cast Receiver app instead, disable this option, " + "for example if your device has issues with the Music Assistant app.", + category="advanced", + ), ) # originally/officially cast supports 96k sample rate (even for groups) @@ -67,9 +90,6 @@ CONF_ENTRY_SAMPLE_RATES_CAST_GROUP = create_sample_rates_config_entry( ) -MASS_APP_ID = "C35B0678" - - # Monkey patch the Media controller here to store the queue items _patched_process_media_status_org = MediaController._process_media_status @@ -522,7 +542,7 @@ class ChromecastProvider(PlayerProvider): castplayer.player.active_group = ( group_player.player.active_group or group_player.player.player_id ) - elif castplayer.cc.app_id == MASS_APP_ID: + elif castplayer.cc.app_id in (MASS_APP_ID, APP_MEDIA_RECEIVER): castplayer.player.active_source = castplayer.player_id else: castplayer.player.active_source = castplayer.cc.app_display_name @@ -597,10 +617,17 @@ class ChromecastProvider(PlayerProvider): ### Helpers / utils - async def _launch_app(self, castplayer: CastPlayer, app_id: str = MASS_APP_ID) -> None: + async def _launch_app(self, castplayer: CastPlayer) -> None: """Launch the default Media Receiver App on a Chromecast.""" event = asyncio.Event() + if self.mass.config.get_raw_player_config_value( + castplayer.player_id, CONF_USE_MASS_APP, True + ): + app_id = MASS_APP_ID + else: + app_id = APP_MEDIA_RECEIVER + if castplayer.cc.app_id == app_id: return # already active -- 2.34.1