from attrs import define import spotipy from ..common.song import BaseSongItem @define class SongItem(BaseSongItem): @classmethod def from_spotify(cls, song_item: dict): return cls( name=song_item['name'], id=song_item['id'], artists=[artist['name'] for artist in song_item['artists']], preview_url=song_item['preview_url'].split('?')[0] if song_item['preview_url'] is not None else None, thumbnail=song_item['album']['images'][1]['url'] ) @define class Songs(object): spotify: spotipy.Spotify def search(self, query: str, limit: int = 10) -> list[SongItem] | None: r = self.spotify.search(query, limit=limit) if r is None: return None return [SongItem.from_spotify(item) for item in r['tracks']['items']] def from_id(self, song_id: str) -> SongItem | None: r = self.spotify.track(song_id) if r is None: return None return SongItem.from_spotify(r)