Chore: allow to choose default media receiver for cast
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 2 Apr 2025 22:32:44 +0000 (00:32 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 2 Apr 2025 22:32:44 +0000 (00:32 +0200)
music_assistant/providers/chromecast/__init__.py

index 938bf1eb33bdeaeb3067b6b9f1a0c0fb29cf39b1..66325fece8113af91b6d7e94629aa8c32c26a14f 100644 (file)
@@ -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