Skip to content

Commit 0de8cb7

Browse files
authored
Add method to search (#490)
1 parent 0595146 commit 0de8cb7

File tree

6 files changed

+29186
-2
lines changed

6 files changed

+29186
-2
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ repos:
7373
exclude: ^poetry\.lock$
7474
entry: poetry run codespell
7575
args:
76-
- --ignore-words-list=doen,te,ons,Racoon,Crate,Ede,succes,alle
76+
- --ignore-words-list=doen,te,ons,Racoon,Crate,Ede,succes,alle,Theis,serie,wel,somme,affraid,programm,earnin,couldnt,beter,als,bord,wil,hart,thuis,voight
7777
- id: detect-private-key
7878
name: 🕵️ Detect Private Keys
7979
language: system

src/spotifyaio/models.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,3 +812,68 @@ def __pre_deserialize__(cls, d: dict[str, Any]) -> dict[str, Any]:
812812
"""Pre deserialize hook."""
813813
items = [item for item in d["audiobooks"] if item is not None]
814814
return {"audiobooks": items}
815+
816+
817+
class SearchType(StrEnum):
818+
"""Search types."""
819+
820+
ALBUM = "album"
821+
ARTIST = "artist"
822+
AUDIOBOOK = "audiobook"
823+
EPISODE = "episode"
824+
PLAYLIST = "playlist"
825+
SHOW = "show"
826+
TRACK = "track"
827+
828+
829+
@dataclass
830+
class SearchResult(DataClassORJSONMixin):
831+
"""Search result model."""
832+
833+
albums: list[SimplifiedAlbum] | None = field(default=None)
834+
artists: list[SimplifiedArtist] | None = field(default=None)
835+
audiobooks: list[SimplifiedAudiobook] | None = field(default=None)
836+
episodes: list[SimplifiedEpisode] | None = field(default=None)
837+
playlists: list[BasePlaylist] | None = field(default=None)
838+
shows: list[SimplifiedShow] | None = field(default=None)
839+
tracks: list[SimplifiedTrack] | None = field(default=None)
840+
841+
@classmethod
842+
def __pre_deserialize__(cls, d: dict[str, Any]) -> dict[str, Any]:
843+
"""Pre deserialize hook."""
844+
return {
845+
**d,
846+
"albums": [
847+
item
848+
for item in d.get("albums", {}).get("items", [])
849+
if item is not None
850+
],
851+
"artists": [
852+
item
853+
for item in d.get("artists", {}).get("items", [])
854+
if item is not None
855+
],
856+
"audiobooks": [
857+
item
858+
for item in d.get("audiobooks", {}).get("items", [])
859+
if item is not None
860+
],
861+
"episodes": [
862+
item
863+
for item in d.get("episodes", {}).get("items", [])
864+
if item is not None
865+
],
866+
"playlists": [
867+
item
868+
for item in d.get("playlists", {}).get("items", [])
869+
if item is not None
870+
],
871+
"shows": [
872+
item for item in d.get("shows", {}).get("items", []) if item is not None
873+
],
874+
"tracks": [
875+
item
876+
for item in d.get("tracks", {}).get("items", [])
877+
if item is not None
878+
],
879+
}

src/spotifyaio/spotify.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@
6060
SavedShowResponse,
6161
SavedTrack,
6262
SavedTrackResponse,
63+
SearchResult,
64+
SearchType,
6365
Show,
6466
ShowEpisodesResponse,
6567
SimplifiedAudiobook,
@@ -715,7 +717,13 @@ async def get_playlist_cover_image(self, playlist_id: str) -> list[Image]:
715717

716718
# Upload a custom playlist cover image
717719

718-
# Search for an item
720+
async def search(
721+
self, query: str, types: list[SearchType], *, limit: int = 48
722+
) -> SearchResult:
723+
"""Search."""
724+
params: dict[str, Any] = {"q": query, "limit": limit, "type": ",".join(types)}
725+
response = await self._get("v1/search", params=params)
726+
return SearchResult.from_json(response)
719727

720728
async def get_show(self, show_id: str) -> Show:
721729
"""Get show."""

0 commit comments

Comments
 (0)