From e1599b7c4787e60fc1083570d93d72bf1d13dd4b Mon Sep 17 00:00:00 2001 From: Nathan Spencer Date: Tue, 25 Nov 2025 19:08:02 +0000 Subject: [PATCH] Address PR review --- custom_components/oasis_mini/browse_media.py | 29 ++++++------------- custom_components/oasis_mini/media_player.py | 4 +-- .../pyoasiscontrol/clients/mqtt_client.py | 2 +- .../oasis_mini/pyoasiscontrol/device.py | 14 ++++++--- .../oasis_mini/pyoasiscontrol/utils.py | 7 ++++- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/custom_components/oasis_mini/browse_media.py b/custom_components/oasis_mini/browse_media.py index 6d0994c..d0cdc74 100644 --- a/custom_components/oasis_mini/browse_media.py +++ b/custom_components/oasis_mini/browse_media.py @@ -17,6 +17,7 @@ from homeassistant.components.media_player import ( from .pyoasiscontrol import OasisCloudClient from .pyoasiscontrol.const import TRACKS +from .pyoasiscontrol.utils import get_track_ids_from_playlist, get_url_for_image _LOGGER = logging.getLogger(__name__) @@ -77,6 +78,7 @@ async def build_playlists_root(cloud: OasisCloudClient) -> BrowseMedia: thumbnail=get_first_image_for_playlist(playlist), ) for playlist in playlists + if "id" in playlist ] return BrowseMedia( @@ -100,14 +102,7 @@ async def build_playlist_item(cloud: OasisCloudClient, playlist_id: int) -> Brow title = playlist.get("name") or f"Playlist #{playlist_id}" - # Adjust this if the field name differs - track_ids = playlist.get("patterns") or [] - # Normalize to ints - try: - track_ids = [track["id"] for track in track_ids] - except Exception: - track_ids = [] - + track_ids = get_track_ids_from_playlist(playlist) children = [build_track_item(track_id) for track_id in track_ids] return BrowseMedia( @@ -133,11 +128,7 @@ def build_tracks_root() -> BrowseMedia: media_content_type=MEDIA_TYPE_OASIS_TRACK, can_play=True, can_expand=False, - thumbnail=( - f"https://app.grounded.so/uploads/{image}" - if (image := meta.get("image")) - else None - ), + thumbnail=get_url_for_image(meta.get("image")), ) for track_id, meta in TRACKS.items() ] @@ -157,25 +148,23 @@ def build_tracks_root() -> BrowseMedia: def build_track_item(track_id: int) -> BrowseMedia: """Build a single track node for a given track id.""" meta = TRACKS.get(track_id) or {} - title = meta.get("name") or f"Track #{track_id}" - image = meta.get("image") return BrowseMedia( - title=title, + title=meta.get("name") or f"Track #{track_id}", media_class=MediaClass.IMAGE, media_content_id=str(track_id), media_content_type=MEDIA_TYPE_OASIS_TRACK, can_play=True, can_expand=False, - thumbnail=f"https://app.grounded.so/uploads/{image}", + thumbnail=get_url_for_image(meta.get("image")), ) def get_first_image_for_playlist(playlist: dict[str, Any]) -> str | None: """Get the first image from a playlist dictionary.""" - for track in playlist.get("patterns"): + for track in playlist.get("patterns") or []: if image := track.get("image"): - return f"https://app.grounded.so/uploads/{image}" + return get_url_for_image(image) return None @@ -239,7 +228,7 @@ async def async_search_media( media_content_type=MEDIA_TYPE_OASIS_PLAYLIST, can_play=True, can_expand=True, - thumbnail=None, + thumbnail=get_first_image_for_playlist(pl), ) ) diff --git a/custom_components/oasis_mini/media_player.py b/custom_components/oasis_mini/media_player.py index 9a50dad..92bc306 100644 --- a/custom_components/oasis_mini/media_player.py +++ b/custom_components/oasis_mini/media_player.py @@ -324,8 +324,8 @@ class OasisDeviceMediaPlayerEntity(OasisDeviceEntity, MediaPlayerEntity): track_ids = [track_id] else: - track = list(filter(None, map(get_track_id, media_id.split(",")))) - if not track: + track_ids = list(filter(None, map(get_track_id, media_id.split(",")))) + if not track_ids: raise ServiceValidationError( translation_domain=DOMAIN, translation_key="invalid_media", diff --git a/custom_components/oasis_mini/pyoasiscontrol/clients/mqtt_client.py b/custom_components/oasis_mini/pyoasiscontrol/clients/mqtt_client.py index 247b960..0f615fd 100644 --- a/custom_components/oasis_mini/pyoasiscontrol/clients/mqtt_client.py +++ b/custom_components/oasis_mini/pyoasiscontrol/clients/mqtt_client.py @@ -495,7 +495,7 @@ class OasisMqttClient(OasisClientProtocol): playlist (list[int]): Ordered list of track indices to apply as the device's playlist. """ track_str = ",".join(map(str, playlist)) - payload = f"WRIJOBLIST={track_str or '0'}" + payload = f"WRIJOBLIST={track_str}" await self._publish_command(device, payload) async def async_send_set_repeat_playlist_command( diff --git a/custom_components/oasis_mini/pyoasiscontrol/device.py b/custom_components/oasis_mini/pyoasiscontrol/device.py index 5580650..8b4d8e5 100644 --- a/custom_components/oasis_mini/pyoasiscontrol/device.py +++ b/custom_components/oasis_mini/pyoasiscontrol/device.py @@ -14,7 +14,13 @@ from .const import ( STATUS_SLEEPING, TRACKS, ) -from .utils import _bit_to_bool, _parse_int, create_svg, decrypt_svg_content +from .utils import ( + _bit_to_bool, + _parse_int, + create_svg, + decrypt_svg_content, + get_url_for_image, +) if TYPE_CHECKING: # avoid runtime circular imports from .clients import OasisCloudClient @@ -399,10 +405,10 @@ class OasisDevice: Get the full HTTPS URL for the current track's image if available. Returns: - str: Full URL to the track image (https://app.grounded.so/uploads/), or `None` if no image is available. + str: Full URL to the track image or `None` if no image is available. """ - if (track := self.track) and (image := track.get("image")): - return f"https://app.grounded.so/uploads/{image}" + if track := self.track: + return get_url_for_image(track.get("image")) return None @property diff --git a/custom_components/oasis_mini/pyoasiscontrol/utils.py b/custom_components/oasis_mini/pyoasiscontrol/utils.py index 7d755db..bbb13c6 100644 --- a/custom_components/oasis_mini/pyoasiscontrol/utils.py +++ b/custom_components/oasis_mini/pyoasiscontrol/utils.py @@ -202,7 +202,12 @@ def decrypt_svg_content(svg_content: dict[str, str]): def get_track_ids_from_playlist(playlist: dict[str, Any]) -> list[int]: """Get a list of track ids from a playlist.""" - return [track["id"] for track in (playlist.get("patterns") or [])] + return [track["id"] for track in (playlist.get("patterns") or []) if "id" in track] + + +def get_url_for_image(image: str | None) -> str | None: + """Get the full URL for an image.""" + return f"https://app.grounded.so/uploads/{image}" if image else None def now() -> datetime: