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