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
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
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)
)
-MASS_APP_ID = "C35B0678"
-
-
# Monkey patch the Media controller here to store the queue items
_patched_process_media_status_org = MediaController._process_media_status
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
### 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