Skip to content

Commit

Permalink
Merge pull request #42 from noahhusby/feat/output-select
Browse files Browse the repository at this point in the history
Add preset list
  • Loading branch information
noahhusby authored Oct 17, 2024
2 parents e1c31c5 + 5bb98c4 commit 114b326
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 10 deletions.
1 change: 1 addition & 0 deletions aiostreammagic/endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
POWER = "/system/power"
ZONE_AUDIO_OUTPUT = "/zone/audio/output"
DISPLAY = "/system/display"
PRESET_LIST = "/presets/list"
29 changes: 29 additions & 0 deletions aiostreammagic/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,35 @@ class PlayStateMetadata(DataClassORJSONMixin):
album: str | None = field(metadata=field_options(alias="album"), default=None)


@dataclass
class PresetList(DataClassORJSONMixin):
"""Data class representing StreamMagic preset table."""

start: int = field(metadata=field_options(alias="start"), default=1)
end: int = field(metadata=field_options(alias="end"), default=99)
max_presets: int = field(metadata=field_options(alias="max_presets"), default=99)
presettable: bool = field(
metadata=field_options(alias="presettable"), default=False
)
presets: list[Preset] = field(metadata=field_options(alias="presets"), default=None)


@dataclass
class Preset(DataClassORJSONMixin):
"""Data class representing StreamMagic preset."""

preset_id: int = field(metadata=field_options(alias="id"), default=None)
name: str = field(metadata=field_options(alias="name"), default=None)
type: str = field(metadata=field_options(alias="type"), default=None)
preset_class: str = field(metadata=field_options(alias="class"), default=None)
state: str = field(metadata=field_options(alias="state"), default=None)
is_playing: bool = field(metadata=field_options(alias="is_playing"), default=False)
art_url: str = field(metadata=field_options(alias="art_url"), default=None)
airable_radio_id: int = field(
metadata=field_options(alias="airable_radio_id"), default=None
)


@dataclass
class NowPlaying(DataClassORJSONMixin):
"""Data class representing NowPlaying state."""
Expand Down
33 changes: 25 additions & 8 deletions aiostreammagic/stream_magic.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
Display,
DisplayBrightness,
Update,
PresetList,
)
from . import endpoints as ep
from .const import _LOGGER
Expand All @@ -44,14 +45,15 @@ def __init__(self, host):
self.connect_task: Task | None = None
self.state_update_callbacks: list[Any] = []
self._allow_state_update = False
self.info: Info | None = None
self.sources: list[Source] | None = None
self.state: State | None = None
self.play_state: PlayState | None = None
self.now_playing: NowPlaying | None = None
self.audio_output: AudioOutput | None = None
self.display: Display | None = None
self.update: Update | None = None
self.info: Optional[Info] = None
self.sources: Optional[list[Source]] = None
self.state: Optional[State] = None
self.play_state: Optional[PlayState] = None
self.now_playing: Optional[NowPlaying] = None
self.audio_output: Optional[AudioOutput] = None
self.display: Optional[Display] = None
self.update: Optional[Update] = None
self.preset_list: Optional[PresetList] = None
self._attempt_reconnection = False
self._reconnect_task: Optional[Task] = None
self.position_last_updated: datetime = datetime.now()
Expand Down Expand Up @@ -156,6 +158,7 @@ async def _connect_handler(self, res):
self.audio_output,
self.display,
self.update,
self.preset_list,
) = await asyncio.gather(
self.get_info(),
self.get_sources(),
Expand All @@ -165,6 +168,7 @@ async def _connect_handler(self, res):
self.get_audio_output(),
self.get_display(),
self.get_update(),
self.get_preset_list(),
)
subscribe_state_updates = {
self.subscribe(self._async_handle_info, ep.INFO),
Expand All @@ -176,6 +180,7 @@ async def _connect_handler(self, res):
self.subscribe(self._async_handle_audio_output, ep.ZONE_AUDIO_OUTPUT),
self.subscribe(self._async_handle_display, ep.DISPLAY),
self.subscribe(self._async_handle_update, ep.UPDATE),
self.subscribe(self._async_handle_preset_list, ep.PRESET_LIST),
}
subscribe_tasks = set()
for state_update in subscribe_state_updates:
Expand Down Expand Up @@ -326,6 +331,11 @@ async def get_update(self) -> Update:
data = await self.request(ep.UPDATE)
return Update.from_dict(data["params"]["data"])

async def get_preset_list(self) -> PresetList:
"""Get preset list information from device."""
data = await self.request(ep.PRESET_LIST)
return PresetList.from_dict(data["params"]["data"])

async def _async_handle_info(self, payload) -> None:
"""Handle async info update."""
params = payload["params"]
Expand Down Expand Up @@ -391,6 +401,13 @@ async def _async_handle_update(self, payload) -> None:
self.update = Update.from_dict(params["data"])
await self.do_state_update_callbacks()

async def _async_handle_preset_list(self, payload) -> None:
"""Handle async preset list update."""
params = payload["params"]
if "data" in params:
self.preset_list = PresetList.from_dict(params["data"])
await self.do_state_update_callbacks()

async def power_on(self) -> None:
"""Set the power of the device to on."""
await self.request(ep.POWER, params={"power": "ON"})
Expand Down
4 changes: 3 additions & 1 deletion examples/subscribe.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import asyncio

from aiostreammagic import StreamMagicClient
from aiostreammagic.stream_magic import StreamMagicClient
from aiostreammagic.models import CallbackType

HOST = "192.168.20.218"
Expand All @@ -14,6 +14,8 @@ async def on_state_change(client: StreamMagicClient, callback_type: CallbackType
print(f"State: {client.state}")
print(f"Play State: {client.play_state}")
print(f"Now Playing: {client.now_playing}")
print(f"Display: {client.display}")
print(f"Preset List: {client.preset_list}")


async def main():
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "aiostreammagic"
version = "2.7.0"
version = "2.8.0"
description = "An async python package for interfacing with Cambridge Audio / Stream Magic compatible streamers."
authors = ["Noah Husby <[email protected]>"]
maintainers = ["Noah Husby <[email protected]>"]
Expand Down

0 comments on commit 114b326

Please sign in to comment.