/
/
/
1"""Chromecast Player provider for Music Assistant, utilizing the pychromecast library."""
2
3from __future__ import annotations
4
5from typing import TYPE_CHECKING
6
7from pychromecast.controllers.media import MediaController
8
9from music_assistant.constants import CONF_ENTRY_MANUAL_DISCOVERY_IPS
10
11from .provider import ChromecastProvider
12
13if TYPE_CHECKING:
14 from music_assistant_models.config_entries import ConfigEntry, ConfigValueType, ProviderConfig
15 from music_assistant_models.enums import ProviderFeature
16 from music_assistant_models.provider import ProviderManifest
17
18 from music_assistant.mass import MusicAssistant
19 from music_assistant.models import ProviderInstanceType
20
21SUPPORTED_FEATURES: set[ProviderFeature] = (
22 set()
23) # we don't have any special supported features (yet)
24
25# Monkey patch the Media controller here to store the queue items
26_patched_process_media_status_org = MediaController._process_media_status
27
28
29def _patched_process_media_status(self: MediaController, data: dict) -> None:
30 """Process STATUS message(s) of the media controller."""
31 _patched_process_media_status_org(self, data)
32 for status_msg in data.get("status", []):
33 if items := status_msg.get("items"):
34 self.status.current_item_id = status_msg.get("currentItemId", 0)
35 self.status.items = items
36
37
38# Apply the monkey patch
39MediaController._process_media_status = _patched_process_media_status
40
41
42async def setup(
43 mass: MusicAssistant, manifest: ProviderManifest, config: ProviderConfig
44) -> ProviderInstanceType:
45 """Initialize provider(instance) with given configuration."""
46 return ChromecastProvider(mass, manifest, config, SUPPORTED_FEATURES)
47
48
49async def get_config_entries(
50 mass: MusicAssistant,
51 instance_id: str | None = None,
52 action: str | None = None,
53 values: dict[str, ConfigValueType] | None = None,
54) -> tuple[ConfigEntry, ...]:
55 """
56 Return Config entries to setup this provider.
57
58 instance_id: id of an existing provider instance (None if new instance setup).
59 action: [optional] action key called from config entries UI.
60 values: the (intermediate) raw values for config entries sent with the action.
61 """
62 # ruff: noqa: ARG001
63 return (CONF_ENTRY_MANUAL_DISCOVERY_IPS,)
64