mirror of
https://github.com/home-assistant/core.git
synced 2025-07-24 21:57:51 +00:00
Bump spotifyaio to 0.7.1 (#128807)
This commit is contained in:
parent
28ff138370
commit
8ceecec5b8
@ -253,7 +253,6 @@ async def async_browse_media(
|
|||||||
result = await async_browse_media_internal(
|
result = await async_browse_media_internal(
|
||||||
hass,
|
hass,
|
||||||
info.coordinator.client,
|
info.coordinator.client,
|
||||||
info.coordinator.current_user,
|
|
||||||
media_content_type,
|
media_content_type,
|
||||||
media_content_id,
|
media_content_id,
|
||||||
can_play_artist=can_play_artist,
|
can_play_artist=can_play_artist,
|
||||||
@ -270,7 +269,6 @@ async def async_browse_media(
|
|||||||
async def async_browse_media_internal(
|
async def async_browse_media_internal(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
spotify: SpotifyClient,
|
spotify: SpotifyClient,
|
||||||
current_user: dict[str, Any],
|
|
||||||
media_content_type: str | None,
|
media_content_type: str | None,
|
||||||
media_content_id: str | None,
|
media_content_id: str | None,
|
||||||
*,
|
*,
|
||||||
@ -290,7 +288,6 @@ async def async_browse_media_internal(
|
|||||||
}
|
}
|
||||||
response = await build_item_response(
|
response = await build_item_response(
|
||||||
spotify,
|
spotify,
|
||||||
current_user,
|
|
||||||
payload,
|
payload,
|
||||||
can_play_artist=can_play_artist,
|
can_play_artist=can_play_artist,
|
||||||
)
|
)
|
||||||
@ -301,7 +298,6 @@ async def async_browse_media_internal(
|
|||||||
|
|
||||||
async def build_item_response( # noqa: C901
|
async def build_item_response( # noqa: C901
|
||||||
spotify: SpotifyClient,
|
spotify: SpotifyClient,
|
||||||
user: dict[str, Any],
|
|
||||||
payload: dict[str, str | None],
|
payload: dict[str, str | None],
|
||||||
*,
|
*,
|
||||||
can_play_artist: bool,
|
can_play_artist: bool,
|
||||||
@ -330,12 +326,13 @@ async def build_item_response( # noqa: C901
|
|||||||
for saved_album in saved_albums
|
for saved_album in saved_albums
|
||||||
]
|
]
|
||||||
elif media_content_type == BrowsableMedia.CURRENT_USER_SAVED_TRACKS:
|
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 = [
|
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:
|
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 = [
|
items = [
|
||||||
{
|
{
|
||||||
"id": saved_show.show.show_id,
|
"id": saved_show.show.show_id,
|
||||||
@ -344,22 +341,26 @@ async def build_item_response( # noqa: C901
|
|||||||
"uri": saved_show.show.uri,
|
"uri": saved_show.show.uri,
|
||||||
"thumbnail": fetch_image_url(saved_show.show.images),
|
"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:
|
elif media_content_type == BrowsableMedia.CURRENT_USER_RECENTLY_PLAYED:
|
||||||
if media := await spotify.get_recently_played_tracks():
|
if recently_played_tracks := await spotify.get_recently_played_tracks():
|
||||||
items = [_get_track_item_payload(item.track) for item in media]
|
items = [
|
||||||
|
_get_track_item_payload(item.track) for item in recently_played_tracks
|
||||||
|
]
|
||||||
elif media_content_type == BrowsableMedia.CURRENT_USER_TOP_ARTISTS:
|
elif media_content_type == BrowsableMedia.CURRENT_USER_TOP_ARTISTS:
|
||||||
if media := await spotify.get_top_artists():
|
if top_artists := await spotify.get_top_artists():
|
||||||
items = [_get_artist_item_payload(artist) for artist in media]
|
items = [_get_artist_item_payload(artist) for artist in top_artists]
|
||||||
elif media_content_type == BrowsableMedia.CURRENT_USER_TOP_TRACKS:
|
elif media_content_type == BrowsableMedia.CURRENT_USER_TOP_TRACKS:
|
||||||
if media := await spotify.get_top_tracks():
|
if top_tracks := await spotify.get_top_tracks():
|
||||||
items = [_get_track_item_payload(track) for track in media]
|
items = [_get_track_item_payload(track) for track in top_tracks]
|
||||||
elif media_content_type == BrowsableMedia.FEATURED_PLAYLISTS:
|
elif media_content_type == BrowsableMedia.FEATURED_PLAYLISTS:
|
||||||
if media := await spotify.get_featured_playlists():
|
if featured_playlists := await spotify.get_featured_playlists():
|
||||||
items = [_get_playlist_item_payload(playlist) for playlist in media]
|
items = [
|
||||||
|
_get_playlist_item_payload(playlist) for playlist in featured_playlists
|
||||||
|
]
|
||||||
elif media_content_type == BrowsableMedia.CATEGORIES:
|
elif media_content_type == BrowsableMedia.CATEGORIES:
|
||||||
if media := await spotify.get_categories():
|
if categories := await spotify.get_categories():
|
||||||
items = [
|
items = [
|
||||||
{
|
{
|
||||||
"id": category.category_id,
|
"id": category.category_id,
|
||||||
@ -368,43 +369,45 @@ async def build_item_response( # noqa: C901
|
|||||||
"uri": category.category_id,
|
"uri": category.category_id,
|
||||||
"thumbnail": category.icons[0].url if category.icons else None,
|
"thumbnail": category.icons[0].url if category.icons else None,
|
||||||
}
|
}
|
||||||
for category in media
|
for category in categories
|
||||||
]
|
]
|
||||||
elif media_content_type == "category_playlists":
|
elif media_content_type == "category_playlists":
|
||||||
if (
|
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)):
|
) and (category := await spotify.get_category(media_content_id)):
|
||||||
title = category.name
|
title = category.name
|
||||||
image = category.icons[0].url if category.icons else None
|
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:
|
elif media_content_type == BrowsableMedia.NEW_RELEASES:
|
||||||
if media := await spotify.get_new_releases():
|
if new_releases := await spotify.get_new_releases():
|
||||||
items = [_get_album_item_payload(album) for album in media]
|
items = [_get_album_item_payload(album) for album in new_releases]
|
||||||
elif media_content_type == MediaType.PLAYLIST:
|
elif media_content_type == MediaType.PLAYLIST:
|
||||||
if media := await spotify.get_playlist(media_content_id):
|
if playlist := await spotify.get_playlist(media_content_id):
|
||||||
title = media.name
|
title = playlist.name
|
||||||
image = media.images[0].url if media.images else None
|
image = playlist.images[0].url if playlist.images else None
|
||||||
items = [
|
items = [
|
||||||
_get_track_item_payload(playlist_track.track)
|
_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:
|
elif media_content_type == MediaType.ALBUM:
|
||||||
if media := await spotify.get_album(media_content_id):
|
if album := await spotify.get_album(media_content_id):
|
||||||
title = media.name
|
title = album.name
|
||||||
image = media.images[0].url if media.images else None
|
image = album.images[0].url if album.images else None
|
||||||
items = [
|
items = [
|
||||||
_get_track_item_payload(track, show_thumbnails=False)
|
_get_track_item_payload(track, show_thumbnails=False)
|
||||||
for track in media.tracks
|
for track in album.tracks
|
||||||
]
|
]
|
||||||
elif media_content_type == MediaType.ARTIST:
|
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)
|
artist := await spotify.get_artist(media_content_id)
|
||||||
):
|
):
|
||||||
title = artist.name
|
title = artist.name
|
||||||
image = artist.images[0].url if artist.images else None
|
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:
|
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)
|
show := await spotify.get_show(media_content_id)
|
||||||
):
|
):
|
||||||
title = show.name
|
title = show.name
|
||||||
@ -417,7 +420,7 @@ async def build_item_response( # noqa: C901
|
|||||||
"uri": episode.uri,
|
"uri": episode.uri,
|
||||||
"thumbnail": fetch_image_url(episode.images),
|
"thumbnail": fetch_image_url(episode.images),
|
||||||
}
|
}
|
||||||
for episode in media
|
for episode in show_episodes
|
||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -5,6 +5,7 @@ from datetime import datetime, timedelta
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from spotifyaio import (
|
from spotifyaio import (
|
||||||
|
ContextType,
|
||||||
PlaybackState,
|
PlaybackState,
|
||||||
Playlist,
|
Playlist,
|
||||||
SpotifyClient,
|
SpotifyClient,
|
||||||
@ -12,7 +13,6 @@ from spotifyaio import (
|
|||||||
UserProfile,
|
UserProfile,
|
||||||
)
|
)
|
||||||
|
|
||||||
from homeassistant.components.media_player import MediaType
|
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
@ -77,7 +77,7 @@ class SpotifyCoordinator(DataUpdateCoordinator[SpotifyCoordinatorData]):
|
|||||||
self._playlist = None
|
self._playlist = None
|
||||||
if context.uri == SPOTIFY_DJ_PLAYLIST_URI:
|
if context.uri == SPOTIFY_DJ_PLAYLIST_URI:
|
||||||
dj_playlist = True
|
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
|
# Make sure any playlist lookups don't break the current
|
||||||
# playback state update
|
# playback state update
|
||||||
try:
|
try:
|
||||||
|
@ -9,6 +9,6 @@
|
|||||||
"iot_class": "cloud_polling",
|
"iot_class": "cloud_polling",
|
||||||
"loggers": ["spotipy"],
|
"loggers": ["spotipy"],
|
||||||
"quality_scale": "silver",
|
"quality_scale": "silver",
|
||||||
"requirements": ["spotifyaio==0.7.0"],
|
"requirements": ["spotifyaio==0.7.1"],
|
||||||
"zeroconf": ["_spotify-connect._tcp.local."]
|
"zeroconf": ["_spotify-connect._tcp.local."]
|
||||||
}
|
}
|
||||||
|
@ -169,20 +169,20 @@ class SpotifyMediaPlayer(CoordinatorEntity[SpotifyCoordinator], MediaPlayerEntit
|
|||||||
@ensure_item
|
@ensure_item
|
||||||
def media_content_type(self, item: Item) -> str: # noqa: PLR0206
|
def media_content_type(self, item: Item) -> str: # noqa: PLR0206
|
||||||
"""Return the media type."""
|
"""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
|
@property
|
||||||
@ensure_item
|
@ensure_item
|
||||||
def media_duration(self, item: Item) -> int: # noqa: PLR0206
|
def media_duration(self, item: Item) -> int: # noqa: PLR0206
|
||||||
"""Duration of current playing media in seconds."""
|
"""Duration of current playing media in seconds."""
|
||||||
return item.duration_ms / 1000
|
return round(item.duration_ms / 1000)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def media_position(self) -> int | None:
|
def media_position(self) -> int | None:
|
||||||
"""Position of current playing media in seconds."""
|
"""Position of current playing media in seconds."""
|
||||||
if not self.currently_playing or self.currently_playing.progress_ms is None:
|
if not self.currently_playing or self.currently_playing.progress_ms is None:
|
||||||
return None
|
return None
|
||||||
return self.currently_playing.progress_ms / 1000
|
return round(self.currently_playing.progress_ms / 1000)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def media_position_updated_at(self) -> dt.datetime | None:
|
def media_position_updated_at(self) -> dt.datetime | None:
|
||||||
@ -380,7 +380,6 @@ class SpotifyMediaPlayer(CoordinatorEntity[SpotifyCoordinator], MediaPlayerEntit
|
|||||||
return await async_browse_media_internal(
|
return await async_browse_media_internal(
|
||||||
self.hass,
|
self.hass,
|
||||||
self.coordinator.client,
|
self.coordinator.client,
|
||||||
self.coordinator.current_user,
|
|
||||||
media_content_type,
|
media_content_type,
|
||||||
media_content_id,
|
media_content_id,
|
||||||
)
|
)
|
||||||
|
@ -2700,7 +2700,7 @@ speak2mary==1.4.0
|
|||||||
speedtest-cli==2.1.3
|
speedtest-cli==2.1.3
|
||||||
|
|
||||||
# homeassistant.components.spotify
|
# homeassistant.components.spotify
|
||||||
spotifyaio==0.7.0
|
spotifyaio==0.7.1
|
||||||
|
|
||||||
# homeassistant.components.sql
|
# homeassistant.components.sql
|
||||||
sqlparse==0.5.0
|
sqlparse==0.5.0
|
||||||
|
@ -2146,7 +2146,7 @@ speak2mary==1.4.0
|
|||||||
speedtest-cli==2.1.3
|
speedtest-cli==2.1.3
|
||||||
|
|
||||||
# homeassistant.components.spotify
|
# homeassistant.components.spotify
|
||||||
spotifyaio==0.7.0
|
spotifyaio==0.7.1
|
||||||
|
|
||||||
# homeassistant.components.sql
|
# homeassistant.components.sql
|
||||||
sqlparse==0.5.0
|
sqlparse==0.5.0
|
||||||
|
@ -45,9 +45,9 @@
|
|||||||
'media_artist': 'Rush',
|
'media_artist': 'Rush',
|
||||||
'media_content_id': 'spotify:track:4e9hUiLsN4mx61ARosFi7p',
|
'media_content_id': 'spotify:track:4e9hUiLsN4mx61ARosFi7p',
|
||||||
'media_content_type': <MediaType.MUSIC: 'music'>,
|
'media_content_type': <MediaType.MUSIC: 'music'>,
|
||||||
'media_duration': 296.466,
|
'media_duration': 296,
|
||||||
'media_playlist': 'Spotify Web API Testing playlist',
|
'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_position_updated_at': HAFakeDatetime(2023, 10, 21, 0, 0, tzinfo=datetime.timezone.utc),
|
||||||
'media_title': 'The Spirit Of Radio',
|
'media_title': 'The Spirit Of Radio',
|
||||||
'media_track': 1,
|
'media_track': 1,
|
||||||
@ -114,8 +114,8 @@
|
|||||||
'media_artist': 'Safety Third ',
|
'media_artist': 'Safety Third ',
|
||||||
'media_content_id': 'spotify:episode:3o0RYoo5iOMKSmEbunsbvW',
|
'media_content_id': 'spotify:episode:3o0RYoo5iOMKSmEbunsbvW',
|
||||||
'media_content_type': <MediaType.PODCAST: 'podcast'>,
|
'media_content_type': <MediaType.PODCAST: 'podcast'>,
|
||||||
'media_duration': 3690.161,
|
'media_duration': 3690,
|
||||||
'media_position': 5.41,
|
'media_position': 5,
|
||||||
'media_position_updated_at': HAFakeDatetime(2023, 10, 21, 0, 0, tzinfo=datetime.timezone.utc),
|
'media_position_updated_at': HAFakeDatetime(2023, 10, 21, 0, 0, tzinfo=datetime.timezone.utc),
|
||||||
'media_title': 'My Squirrel Has Brain Damage - Safety Third 119',
|
'media_title': 'My Squirrel Has Brain Damage - Safety Third 119',
|
||||||
'repeat': <RepeatMode.OFF: 'off'>,
|
'repeat': <RepeatMode.OFF: 'off'>,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user