43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
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)
|