From b6109fa17ca23714761c1d139c8876cd59955cf8 Mon Sep 17 00:00:00 2001 From: Bradlee Speice Date: Mon, 13 Sep 2021 22:29:57 -0400 Subject: [PATCH] Add followed artist support --- spotify_model/__init__.py | 6 ++++-- spotify_model/artist.py | 42 +++++++++++++++++++++++++++++++++++++++ spotify_model/extra.py | 12 +++++++++++ spotify_model/paging.py | 21 ++++++++++++++++++++ spotify_model/playlist.py | 14 +++++++++++++ spotify_model/user.py | 4 ++-- 6 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 spotify_model/artist.py diff --git a/spotify_model/__init__.py b/spotify_model/__init__.py index 12e9131..f9ef499 100644 --- a/spotify_model/__init__.py +++ b/spotify_model/__init__.py @@ -3,14 +3,16 @@ Client-agnostic model for marshalling Spotify data types. """ from .album import SearchAlbum, SimplifiedAlbum +from .artist import Artist, SimplifiedArtist from .extra import ReleaseDatePrecision -from .paging import Paging -from .playlist import SimplifiedPlaylist +from .paging import Cursor, CursorPaging, Paging +from .playlist import PlaylistTrack, SimplifiedPlaylist from .track import SimplifiedTrack from .user import PrivateUser, PublicUser __all__ = [ "Paging", + "PlaylistTrack", "PrivateUser", "PublicUser", "ReleaseDatePrecision", diff --git a/spotify_model/artist.py b/spotify_model/artist.py new file mode 100644 index 0000000..dc61511 --- /dev/null +++ b/spotify_model/artist.py @@ -0,0 +1,42 @@ +""" +Objects used for retrieving artist information from Spotify +""" + +from typing import Dict, List, Optional + +from pydantic import BaseModel, Field + +from .extra import Image + + +class SimplifiedArtist(BaseModel): + """ + https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedartistobject + """ + + external_urls: Dict[str, str] + href: str + spotify_id: str = Field(alias="id") + name: str + spotify_type: str = Field(alias="type") + uri: str + + +class Followers(BaseModel): + """ + https://developer.spotify.com/documentation/web-api/reference/#object-followersobject + """ + + href: Optional[str] + total: int + + +class Artist(SimplifiedArtist): + """ + https://developer.spotify.com/documentation/web-api/reference/#object-artistobject + """ + + followers: Followers + genres: List[str] + images: List[Image] + popularity: int diff --git a/spotify_model/extra.py b/spotify_model/extra.py index 3d64f80..62a139f 100644 --- a/spotify_model/extra.py +++ b/spotify_model/extra.py @@ -4,6 +4,8 @@ Extra type definitions that don't necessarily belong in other categories. from enum import Enum +from pydantic import BaseModel + class ReleaseDatePrecision(Enum): "Release date precision" @@ -11,3 +13,13 @@ class ReleaseDatePrecision(Enum): YEAR = "year" MONTH = "month" DAY = "day" + + +class Image(BaseModel): + """ + https://developer.spotify.com/documentation/web-api/reference/#object-imageobject + """ + + height: int + url: str + width: int diff --git a/spotify_model/paging.py b/spotify_model/paging.py index f41633b..bd5a4e6 100644 --- a/spotify_model/paging.py +++ b/spotify_model/paging.py @@ -7,6 +7,27 @@ from typing import Any, Dict, List, Optional from pydantic import BaseModel, Field +class Cursor(BaseModel): + """ + https://developer.spotify.com/documentation/web-api/reference/#object-cursorobject + """ + + after: Optional[str] + + +class CursorPaging(BaseModel): + """ + https://developer.spotify.com/documentation/web-api/reference/#object-cursorpagingobject + """ + + cursors: Cursor + href: str + items: List[Dict[str, Any]] + limit: int + next_href: Optional[str] = Field(alias="next") + total: int + + class Paging(BaseModel): "https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject" diff --git a/spotify_model/playlist.py b/spotify_model/playlist.py index f65f439..e1254d1 100644 --- a/spotify_model/playlist.py +++ b/spotify_model/playlist.py @@ -5,9 +5,23 @@ from typing import Any, Dict, List from pydantic import BaseModel, Field +from .track import SimplifiedTrack from .user import PublicUser +class PlaylistTrack(BaseModel): + """ + Track entry as returned by the Playlist API + + https://developer.spotify.com/documentation/web-api/reference/#object-playlisttrackobject + """ + + added_at: str + added_by: PublicUser + is_local: bool + track: SimplifiedTrack + + class SimplifiedPlaylist(BaseModel): """ Playlist as returned by the Playlist API diff --git a/spotify_model/user.py b/spotify_model/user.py index d71f233..8ae25e7 100644 --- a/spotify_model/user.py +++ b/spotify_model/user.py @@ -1,7 +1,7 @@ """ Classes for managing users """ -from typing import Any, Dict, List +from typing import Any, Dict, List, Optional from pydantic import BaseModel, Field @@ -13,7 +13,7 @@ class PublicUser(BaseModel): https://developer.spotify.com/documentation/web-api/reference/#object-publicuserobject """ - display_name: str + display_name: Optional[str] external_urls: Dict[str, str] href: str spotify_id: str = Field(alias="id")