/
/
/
1"""Helpers for player behavior."""
2
3from music_assistant_models.enums import PlayerType
4
5_DEFAULT_ICONS_BY_PROVIDER = {
6 "airplay": "airplay",
7 "chromecast": "cast",
8 "fully_kiosk": "tablet",
9 "msx_bridge": "tv",
10 "roku_media_assistant": "tv",
11 "sonos": "sonos",
12 "sonos_s1": "sonos",
13 "wiim": "wiim",
14}
15
16_DEFAULT_ICONS_BY_PLAYER_TYPE = {
17 PlayerType.DISPLAY: "monitor",
18 PlayerType.LIGHT: "sun",
19 PlayerType.SOURCE: "vinyl",
20 PlayerType.VISUALIZER: "monitor",
21}
22
23_DEFAULT_ICON_MATCHES = (
24 ("homepod-mini", ("homepod",)),
25 ("apple-tv", ("apple tv", "appletv")),
26 (
27 "google-nest",
28 ("google home", "google nest", "nest audio", "nest hub", "nest mini"),
29 ),
30 ("voice-pe", ("home assistant voice", "voice pe", "voice preview edition")),
31 ("sonos", ("sonos",)),
32 ("wiim", ("wiim",)),
33 ("soundbar", ("sound bar", "soundbar")),
34 ("tv", (" tv", "smarttv", "television")),
35 ("monitor", ("web browser",)),
36 ("laptop", ("laptop", "notebook")),
37 ("smartphone", ("iphone", "mobile application", "smartphone")),
38 ("tablet", ("ipad", "tablet")),
39 ("headphones", ("earbud", "headphone", "headset")),
40 ("bluetooth", ("bluetooth",)),
41 ("radio", ("radio",)),
42 ("car", ("carplay",)),
43)
44
45
46def get_default_player_icon(
47 player_type: PlayerType,
48 provider_domain: str,
49 manufacturer: str | None,
50 model: str | None,
51) -> str:
52 """
53 Return the most appropriate default icon for a player.
54
55 :param player_type: The player's functional type.
56 :param provider_domain: The domain of the player provider.
57 :param manufacturer: The device manufacturer reported by the provider.
58 :param model: The device model reported by the provider.
59 """
60 if player_type in (PlayerType.GROUP, PlayerType.STEREO_PAIR):
61 return "speakers"
62 if player_type_icon := _DEFAULT_ICONS_BY_PLAYER_TYPE.get(player_type):
63 return player_type_icon
64
65 manufacturer_name = (manufacturer or "").casefold()
66 model_name = (model or "").casefold()
67 if manufacturer_name.startswith("apple") and model_name.startswith(("imac", "mac")):
68 return "mac"
69
70 device_description = f"{manufacturer_name} {model_name}"
71 for icon, matches in _DEFAULT_ICON_MATCHES:
72 if any(match in device_description for match in matches):
73 return icon
74
75 if provider_icon := _DEFAULT_ICONS_BY_PROVIDER.get(provider_domain):
76 return provider_icon
77 return "speaker"
78