/
/
/
1"""Chromecast Player provider for Music Assistant, utilizing the pychromecast library."""
2
3from __future__ import annotations
4
5from typing import TYPE_CHECKING, Any, cast
6
7from pychromecast.controllers.media import MediaController
8
9from .provider import ChromecastProvider
10
11if TYPE_CHECKING:
12 from music_assistant_models.config_entries import ProviderConfig
13 from music_assistant_models.enums import ProviderFeature
14 from music_assistant_models.provider import ProviderManifest
15
16 from music_assistant.mass import MusicAssistant
17 from music_assistant.models import ProviderInstanceType
18
19SUPPORTED_FEATURES: set[ProviderFeature] = (
20 set()
21) # we don't have any special supported features (yet)
22
23# Monkey patch the Media controller here to store the queue items
24_patched_process_media_status_org = MediaController._process_media_status
25
26
27def _patched_process_media_status(self: MediaController, data: dict[str, object]) -> None:
28 """Process STATUS message(s) of the media controller."""
29 _patched_process_media_status_org(self, data)
30 for status_msg in cast("list[dict[str, Any]]", data.get("status", [])):
31 if items := status_msg.get("items"):
32 self.status.current_item_id = status_msg.get("currentItemId", 0) # type: ignore[attr-defined]
33 self.status.items = items # type: ignore[attr-defined]
34
35
36# Apply the monkey patch
37MediaController._process_media_status = _patched_process_media_status # type: ignore[method-assign]
38
39
40async def setup(
41 mass: MusicAssistant, manifest: ProviderManifest, config: ProviderConfig
42) -> ProviderInstanceType:
43 """Initialize provider(instance) with given configuration."""
44 return ChromecastProvider(mass, manifest, config, SUPPORTED_FEATURES)
45