/
/
/
1"""Models for Bose Soundtouch."""
2
3from dataclasses import dataclass, field
4from typing import Annotated
5
6from mashumaro.mixins.json import DataClassJSONMixin
7from mashumaro.types import Alias
8
9from music_assistant.providers.bose_soundtouch.client.schema.enums import (
10 ArtStatus,
11 PlayStatus,
12 SourceStatus,
13)
14
15
16@dataclass
17class Source(DataClassJSONMixin):
18 """Source."""
19
20 source: str | None = None
21 # source account is unique, but not always present
22 source_account: Annotated[str | None, Alias("sourceAccount")] = None
23 source_name: str | None = None
24 status: SourceStatus | None = None
25 is_local: Annotated[bool | None, Alias("isLocal")] = None
26 multiroom_allowed: Annotated[bool | None, Alias("multiroomallowed")] = None
27
28
29@dataclass
30class Sources(DataClassJSONMixin):
31 """Sources."""
32
33 sources: list[Source] = field(default_factory=list)
34
35
36@dataclass
37class BassCapabilities(DataClassJSONMixin):
38 """BassCapabilities."""
39
40 available: Annotated[bool | None, Alias("bassAvailable")] = None
41 minimum: Annotated[int | None, Alias("bassMin")] = None
42 maximum: Annotated[int | None, Alias("bassMax")] = None
43 default: Annotated[int | None, Alias("bassDefault")] = None
44
45
46@dataclass
47class Bass(DataClassJSONMixin):
48 """Bass."""
49
50 target_bass: Annotated[int | None, Alias("targetbass")] = None
51 actual_bass: Annotated[int | None, Alias("actualbass")] = None
52
53
54@dataclass
55class ZoneMember(DataClassJSONMixin):
56 """ZoneMember."""
57
58 ip: Annotated[str | None, Alias("ipaddress")] = None
59 mac: str | None = None
60
61
62@dataclass
63class Zone(DataClassJSONMixin):
64 """Zone."""
65
66 leader: ZoneMember | None = None
67 members: list[ZoneMember] = field(default_factory=list)
68
69
70@dataclass
71class Art(DataClassJSONMixin):
72 """Art."""
73
74 status: ArtStatus | None = None
75 url: str | None = None
76
77
78@dataclass
79class TimeInformation(DataClassJSONMixin):
80 """TimeInformation."""
81
82 total: int | None = None
83 position: int | None = None
84
85
86@dataclass
87class ContentItem(DataClassJSONMixin):
88 """ContentItem."""
89
90 source: str | None = None
91 source_account: Annotated[str | None, Alias("sourceAccount")] = None
92 is_presetable: Annotated[bool | None, Alias("isPresetable")] = None
93 item_name: str | None = None
94
95
96@dataclass
97class NowPlaying(DataClassJSONMixin):
98 """NowPlaying."""
99
100 track: str | None = None
101 artist: str | None = None
102 album: str | None = None
103 station_name: Annotated[str | None, Alias("stationName")] = None
104 description: str | None = None
105 station_location: Annotated[str | None, Alias("stationLocation")] = None
106 play_status: Annotated[PlayStatus | None, Alias("playStatus")] = None
107 genre: str | None = None
108 art: Art | None = None
109 time_information: TimeInformation | None = None
110 content_item: ContentItem | None = None
111 device_id: Annotated[str | None, Alias("deviceID")] = None
112 source: str | None = None
113
114
115@dataclass
116class Volume(DataClassJSONMixin):
117 """Volume."""
118
119 target_volume: Annotated[int | None, Alias("targetvolume")] = None
120 actual_volume: Annotated[int | None, Alias("actualvolume")] = None
121 mute_enabled: Annotated[bool | None, Alias("muteenabled")] = None
122
123
124@dataclass
125class Preset(DataClassJSONMixin):
126 """Preset."""
127
128 id_: Annotated[int | None, Alias("id")] = None
129 created_on: Annotated[int | None, Alias("createdOn")] = None
130 update_on: Annotated[int | None, Alias("updateOn")] = None
131 content_item: ContentItem | None = None
132
133
134@dataclass
135class Presets(DataClassJSONMixin):
136 """Presets."""
137
138 presets: list[Preset] = field(default_factory=list)
139
140
141@dataclass
142class Info(DataClassJSONMixin):
143 """Info."""
144
145 device_id: str
146 name: str
147 model: str | None = None
148 mac_addresses: set[str] | None = None
149 ip_addresses: set[str] | None = None
150 software_version: str | None = None
151