diff --git a/homeassistant/components/spotify/browse_media.py b/homeassistant/components/spotify/browse_media.py index ea8282d6cd4..403ec608a7c 100644 --- a/homeassistant/components/spotify/browse_media.py +++ b/homeassistant/components/spotify/browse_media.py @@ -253,7 +253,6 @@ async def async_browse_media( result = await async_browse_media_internal( hass, info.coordinator.client, - info.coordinator.current_user, media_content_type, media_content_id, can_play_artist=can_play_artist, @@ -270,7 +269,6 @@ async def async_browse_media( async def async_browse_media_internal( hass: HomeAssistant, spotify: SpotifyClient, - current_user: dict[str, Any], media_content_type: str | None, media_content_id: str | None, *, @@ -290,7 +288,6 @@ async def async_browse_media_internal( } response = await build_item_response( spotify, - current_user, payload, can_play_artist=can_play_artist, ) @@ -301,7 +298,6 @@ async def async_browse_media_internal( async def build_item_response( # noqa: C901 spotify: SpotifyClient, - user: dict[str, Any], payload: dict[str, str | None], *, can_play_artist: bool, @@ -330,12 +326,13 @@ async def build_item_response( # noqa: C901 for saved_album in saved_albums ] elif media_content_type == BrowsableMedia.CURRENT_USER_SAVED_TRACKS: - if media := await spotify.get_saved_tracks(): + if saved_tracks := await spotify.get_saved_tracks(): items = [ - _get_track_item_payload(saved_track.track) for saved_track in media + _get_track_item_payload(saved_track.track) + for saved_track in saved_tracks ] elif media_content_type == BrowsableMedia.CURRENT_USER_SAVED_SHOWS: - if media := await spotify.get_saved_shows(): + if saved_shows := await spotify.get_saved_shows(): items = [ { "id": saved_show.show.show_id, @@ -344,22 +341,26 @@ async def build_item_response( # noqa: C901 "uri": saved_show.show.uri, "thumbnail": fetch_image_url(saved_show.show.images), } - for saved_show in media + for saved_show in saved_shows ] elif media_content_type == BrowsableMedia.CURRENT_USER_RECENTLY_PLAYED: - if media := await spotify.get_recently_played_tracks(): - items = [_get_track_item_payload(item.track) for item in media] + if recently_played_tracks := await spotify.get_recently_played_tracks(): + items = [ + _get_track_item_payload(item.track) for item in recently_played_tracks + ] elif media_content_type == BrowsableMedia.CURRENT_USER_TOP_ARTISTS: - if media := await spotify.get_top_artists(): - items = [_get_artist_item_payload(artist) for artist in media] + if top_artists := await spotify.get_top_artists(): + items = [_get_artist_item_payload(artist) for artist in top_artists] elif media_content_type == BrowsableMedia.CURRENT_USER_TOP_TRACKS: - if media := await spotify.get_top_tracks(): - items = [_get_track_item_payload(track) for track in media] + if top_tracks := await spotify.get_top_tracks(): + items = [_get_track_item_payload(track) for track in top_tracks] elif media_content_type == BrowsableMedia.FEATURED_PLAYLISTS: - if media := await spotify.get_featured_playlists(): - items = [_get_playlist_item_payload(playlist) for playlist in media] + if featured_playlists := await spotify.get_featured_playlists(): + items = [ + _get_playlist_item_payload(playlist) for playlist in featured_playlists + ] elif media_content_type == BrowsableMedia.CATEGORIES: - if media := await spotify.get_categories(): + if categories := await spotify.get_categories(): items = [ { "id": category.category_id, @@ -368,43 +369,45 @@ async def build_item_response( # noqa: C901 "uri": category.category_id, "thumbnail": category.icons[0].url if category.icons else None, } - for category in media + for category in categories ] elif media_content_type == "category_playlists": if ( - media := await spotify.get_category_playlists(category_id=media_content_id) + playlists := await spotify.get_category_playlists( + category_id=media_content_id + ) ) and (category := await spotify.get_category(media_content_id)): title = category.name image = category.icons[0].url if category.icons else None - items = [_get_playlist_item_payload(playlist) for playlist in media] + items = [_get_playlist_item_payload(playlist) for playlist in playlists] elif media_content_type == BrowsableMedia.NEW_RELEASES: - if media := await spotify.get_new_releases(): - items = [_get_album_item_payload(album) for album in media] + if new_releases := await spotify.get_new_releases(): + items = [_get_album_item_payload(album) for album in new_releases] elif media_content_type == MediaType.PLAYLIST: - if media := await spotify.get_playlist(media_content_id): - title = media.name - image = media.images[0].url if media.images else None + if playlist := await spotify.get_playlist(media_content_id): + title = playlist.name + image = playlist.images[0].url if playlist.images else None items = [ _get_track_item_payload(playlist_track.track) - for playlist_track in media.tracks.items + for playlist_track in playlist.tracks.items ] elif media_content_type == MediaType.ALBUM: - if media := await spotify.get_album(media_content_id): - title = media.name - image = media.images[0].url if media.images else None + if album := await spotify.get_album(media_content_id): + title = album.name + image = album.images[0].url if album.images else None items = [ _get_track_item_payload(track, show_thumbnails=False) - for track in media.tracks + for track in album.tracks ] elif media_content_type == MediaType.ARTIST: - if (media := await spotify.get_artist_albums(media_content_id)) and ( + if (artist_albums := await spotify.get_artist_albums(media_content_id)) and ( artist := await spotify.get_artist(media_content_id) ): title = artist.name image = artist.images[0].url if artist.images else None - items = [_get_album_item_payload(album) for album in media] + items = [_get_album_item_payload(album) for album in artist_albums] elif media_content_type == MEDIA_TYPE_SHOW: - if (media := await spotify.get_show_episodes(media_content_id)) and ( + if (show_episodes := await spotify.get_show_episodes(media_content_id)) and ( show := await spotify.get_show(media_content_id) ): title = show.name @@ -417,7 +420,7 @@ async def build_item_response( # noqa: C901 "uri": episode.uri, "thumbnail": fetch_image_url(episode.images), } - for episode in media + for episode in show_episodes ] try: diff --git a/homeassistant/components/spotify/coordinator.py b/homeassistant/components/spotify/coordinator.py index 275a33658ba..e8800220fdd 100644 --- a/homeassistant/components/spotify/coordinator.py +++ b/homeassistant/components/spotify/coordinator.py @@ -5,6 +5,7 @@ from datetime import datetime, timedelta import logging from spotifyaio import ( + ContextType, PlaybackState, Playlist, SpotifyClient, @@ -12,7 +13,6 @@ from spotifyaio import ( UserProfile, ) -from homeassistant.components.media_player import MediaType from homeassistant.core import HomeAssistant from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed import homeassistant.util.dt as dt_util @@ -77,7 +77,7 @@ class SpotifyCoordinator(DataUpdateCoordinator[SpotifyCoordinatorData]): self._playlist = None if context.uri == SPOTIFY_DJ_PLAYLIST_URI: dj_playlist = True - elif context.context_type == MediaType.PLAYLIST: + elif context.context_type == ContextType.PLAYLIST: # Make sure any playlist lookups don't break the current # playback state update try: diff --git a/homeassistant/components/spotify/manifest.json b/homeassistant/components/spotify/manifest.json index bff34a8a051..f799f9d8ea5 100644 --- a/homeassistant/components/spotify/manifest.json +++ b/homeassistant/components/spotify/manifest.json @@ -9,6 +9,6 @@ "iot_class": "cloud_polling", "loggers": ["spotipy"], "quality_scale": "silver", - "requirements": ["spotifyaio==0.7.0"], + "requirements": ["spotifyaio==0.7.1"], "zeroconf": ["_spotify-connect._tcp.local."] } diff --git a/homeassistant/components/spotify/media_player.py b/homeassistant/components/spotify/media_player.py index 20f07e11d67..72c6d76eb96 100644 --- a/homeassistant/components/spotify/media_player.py +++ b/homeassistant/components/spotify/media_player.py @@ -169,20 +169,20 @@ class SpotifyMediaPlayer(CoordinatorEntity[SpotifyCoordinator], MediaPlayerEntit @ensure_item def media_content_type(self, item: Item) -> str: # noqa: PLR0206 """Return the media type.""" - return MediaType.PODCAST if item.type == MediaType.EPISODE else MediaType.MUSIC + return MediaType.PODCAST if item.type == ItemType.EPISODE else MediaType.MUSIC @property @ensure_item def media_duration(self, item: Item) -> int: # noqa: PLR0206 """Duration of current playing media in seconds.""" - return item.duration_ms / 1000 + return round(item.duration_ms / 1000) @property def media_position(self) -> int | None: """Position of current playing media in seconds.""" if not self.currently_playing or self.currently_playing.progress_ms is None: return None - return self.currently_playing.progress_ms / 1000 + return round(self.currently_playing.progress_ms / 1000) @property def media_position_updated_at(self) -> dt.datetime | None: @@ -380,7 +380,6 @@ class SpotifyMediaPlayer(CoordinatorEntity[SpotifyCoordinator], MediaPlayerEntit return await async_browse_media_internal( self.hass, self.coordinator.client, - self.coordinator.current_user, media_content_type, media_content_id, ) diff --git a/requirements_all.txt b/requirements_all.txt index bda87ee974b..bda723bc20f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2700,7 +2700,7 @@ speak2mary==1.4.0 speedtest-cli==2.1.3 # homeassistant.components.spotify -spotifyaio==0.7.0 +spotifyaio==0.7.1 # homeassistant.components.sql sqlparse==0.5.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 7bf0e1c30b7..ebaa06569d5 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -2146,7 +2146,7 @@ speak2mary==1.4.0 speedtest-cli==2.1.3 # homeassistant.components.spotify -spotifyaio==0.7.0 +spotifyaio==0.7.1 # homeassistant.components.sql sqlparse==0.5.0 diff --git a/tests/components/spotify/snapshots/test_media_player.ambr b/tests/components/spotify/snapshots/test_media_player.ambr index 1688df66ed9..9692d59cfd1 100644 --- a/tests/components/spotify/snapshots/test_media_player.ambr +++ b/tests/components/spotify/snapshots/test_media_player.ambr @@ -45,9 +45,9 @@ 'media_artist': 'Rush', 'media_content_id': 'spotify:track:4e9hUiLsN4mx61ARosFi7p', 'media_content_type': , - 'media_duration': 296.466, + 'media_duration': 296, 'media_playlist': 'Spotify Web API Testing playlist', - 'media_position': 249.367, + 'media_position': 249, 'media_position_updated_at': HAFakeDatetime(2023, 10, 21, 0, 0, tzinfo=datetime.timezone.utc), 'media_title': 'The Spirit Of Radio', 'media_track': 1, @@ -114,8 +114,8 @@ 'media_artist': 'Safety Third ', 'media_content_id': 'spotify:episode:3o0RYoo5iOMKSmEbunsbvW', 'media_content_type': , - 'media_duration': 3690.161, - 'media_position': 5.41, + 'media_duration': 3690, + 'media_position': 5, 'media_position_updated_at': HAFakeDatetime(2023, 10, 21, 0, 0, tzinfo=datetime.timezone.utc), 'media_title': 'My Squirrel Has Brain Damage - Safety Third 119', 'repeat': ,