From 063cfac1c07c895e79cc884242d0aba1fc570dab Mon Sep 17 00:00:00 2001 From: Andrew Sayre <6730289+andrewsayre@users.noreply.github.com> Date: Fri, 10 Jan 2025 20:51:19 +0000 Subject: [PATCH] Use enums --- pyheos/command/__init__.py | 6 ++++++ pyheos/player.py | 25 ++++++------------------- pyheos/system.py | 4 ++-- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/pyheos/command/__init__.py b/pyheos/command/__init__.py index cb20e6f..0d8e3ce 100644 --- a/pyheos/command/__init__.py +++ b/pyheos/command/__init__.py @@ -160,6 +160,12 @@ TEnum = TypeVar("TEnum", bound=ReprEnum) +def optional_int(value: str | None) -> int | None: + if value is not None: + return int(value) + return None + + def parse_enum( key: str, data: dict[str, Any], enum_type: type[TEnum], default: TEnum ) -> TEnum: diff --git a/pyheos/player.py b/pyheos/player.py index bc460bb..b5f8778 100644 --- a/pyheos/player.py +++ b/pyheos/player.py @@ -6,7 +6,7 @@ from datetime import datetime from typing import TYPE_CHECKING, Any, Final, Optional, cast -from pyheos.command import parse_enum +from pyheos.command import optional_int, parse_enum from pyheos.dispatch import DisconnectType, EventCallbackType, callback_wrapper from pyheos.media import MediaItem, QueueItem, ServiceOption from pyheos.message import HeosMessage @@ -98,7 +98,7 @@ class HeosNowPlayingMedia: current_position: int | None = None current_position_updated: datetime | None = None duration: int | None = None - supported_controls: Sequence[str] = field( + supported_controls: Sequence[ControlType] = field( default_factory=lambda: CONTROLS_ALL, init=False ) options: Sequence[ServiceOption] = field( @@ -120,19 +120,12 @@ def _update_from_message(self, message: HeosMessage) -> None: self.image_url = data.get(c.ATTR_IMAGE_URL) self.album_id = data.get(c.ATTR_ALBUM_ID) self.media_id = data.get(c.ATTR_MEDIA_ID) - self.queue_id = self.__get_optional_int(data.get(c.ATTR_QUEUE_ID)) - self.source_id = self.__get_optional_int(data.get(c.ATTR_SOURCE_ID)) + self.queue_id = optional_int(data.get(c.ATTR_QUEUE_ID)) + self.source_id = optional_int(data.get(c.ATTR_SOURCE_ID)) self.options = ServiceOption._from_options(message.options) self._update_supported_controls() self.clear_progress() - @staticmethod - def __get_optional_int(value: Any) -> int | None: - try: - return int(str(value)) - except (TypeError, ValueError): - return None - def _update_supported_controls(self) -> None: """Updates the supported controls based on the source and type.""" new_supported_controls = CONTROLS_ALL if self.source_id is not None else [] @@ -205,12 +198,6 @@ class HeosPlayer: group_id: int | None = field(repr=False, hash=False, compare=False, default=None) heos: Optional["Heos"] = field(repr=False, hash=False, compare=False, default=None) - @staticmethod - def __get_optional_int(value: str | None) -> int | None: - if value is not None: - return int(value) - return None - @staticmethod def _from_data( data: dict[str, Any], @@ -232,7 +219,7 @@ def _from_data( control=parse_enum( c.ATTR_CONTROL, data, VolumeControlType, VolumeControlType.UNKNOWN ), - group_id=HeosPlayer.__get_optional_int(data.get(c.ATTR_GROUP_ID)), + group_id=optional_int(data.get(c.ATTR_GROUP_ID)), heos=heos, ) @@ -253,7 +240,7 @@ def _update_from_data(self, data: dict[str, Any]) -> None: self.control = parse_enum( c.ATTR_CONTROL, data, VolumeControlType, VolumeControlType.UNKNOWN ) - self.group_id = HeosPlayer.__get_optional_int(data.get(c.ATTR_GROUP_ID)) + self.group_id = optional_int(data.get(c.ATTR_GROUP_ID)) async def _on_event(self, event: HeosMessage, all_progress_events: bool) -> bool: """Updates the player based on the received HEOS event. diff --git a/pyheos/system.py b/pyheos/system.py index 65b8092..1ebc8bf 100644 --- a/pyheos/system.py +++ b/pyheos/system.py @@ -19,7 +19,7 @@ class HeosHost: serial: str | None version: str ip_address: str - network: str + network: NetworkType @classmethod def from_data(cls, data: dict[str, str]) -> "HeosHost": @@ -37,7 +37,7 @@ def from_data(cls, data: dict[str, str]) -> "HeosHost": data.get(c.ATTR_SERIAL), data[c.ATTR_VERSION], data[c.ATTR_IP_ADDRESS], - data[c.ATTR_NETWORK], + c.parse_enum(c.ATTR_NETWORK, data, NetworkType, NetworkType.UNKNOWN), )