added get methods and fixed iterator
This commit is contained in:
parent
0c6aeb5181
commit
3f45cf8b63
@ -6,12 +6,17 @@ from spotframework.util.console import Color
|
|||||||
from spotframework.model.uri import Uri
|
from spotframework.model.uri import Uri
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from spotframework.model.artist import Artist
|
from spotframework.model.artist import Artist
|
||||||
|
from spotframework.model.track import Track
|
||||||
|
|
||||||
|
|
||||||
class Album:
|
class Album:
|
||||||
def __init__(self, name: str, artists: List[Artist]):
|
def __init__(self, name: str, artists: List[Artist], tracks: List[Track] = None):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.artists = artists
|
self.artists = artists
|
||||||
|
if tracks is not None:
|
||||||
|
self.tracks = tracks
|
||||||
|
else:
|
||||||
|
self.tracks = []
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def artists_names(self) -> str:
|
def artists_names(self) -> str:
|
||||||
@ -30,6 +35,9 @@ class Album:
|
|||||||
return Color.DARKCYAN + Color.BOLD + 'Album' + Color.END + \
|
return Color.DARKCYAN + Color.BOLD + 'Album' + Color.END + \
|
||||||
f': {self.name}, [{self.artists}]'
|
f': {self.name}, [{self.artists}]'
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.tracks)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def wrap(name: str = None,
|
def wrap(name: str = None,
|
||||||
artists: Union[str, List[str]] = None):
|
artists: Union[str, List[str]] = None):
|
||||||
@ -45,7 +53,7 @@ class SpotifyAlbum(Album):
|
|||||||
uri: Union[str, Uri] = None,
|
uri: Union[str, Uri] = None,
|
||||||
|
|
||||||
genres: List[str] = None,
|
genres: List[str] = None,
|
||||||
tracks: List = None,
|
tracks: List[Track] = None,
|
||||||
|
|
||||||
release_date: str = None,
|
release_date: str = None,
|
||||||
release_date_precision: str = None,
|
release_date_precision: str = None,
|
||||||
@ -53,7 +61,7 @@ class SpotifyAlbum(Album):
|
|||||||
label: str = None,
|
label: str = None,
|
||||||
popularity: int = None
|
popularity: int = None
|
||||||
):
|
):
|
||||||
super().__init__(name, artists)
|
super().__init__(name, artists, tracks=tracks)
|
||||||
|
|
||||||
self.href = href
|
self.href = href
|
||||||
if isinstance(uri, str):
|
if isinstance(uri, str):
|
||||||
@ -65,7 +73,6 @@ class SpotifyAlbum(Album):
|
|||||||
raise TypeError('provided uri not for an album')
|
raise TypeError('provided uri not for an album')
|
||||||
|
|
||||||
self.genres = genres
|
self.genres = genres
|
||||||
self.tracks = tracks
|
|
||||||
|
|
||||||
self.release_date = release_date
|
self.release_date = release_date
|
||||||
self.release_date_precision = release_date_precision
|
self.release_date_precision = release_date_precision
|
||||||
|
@ -703,6 +703,72 @@ class Network:
|
|||||||
else:
|
else:
|
||||||
raise TypeError('must provide either single or list of spotify tracks')
|
raise TypeError('must provide either single or list of spotify tracks')
|
||||||
|
|
||||||
|
def get_tracks(self, uris: List[Uri]) -> List[SpotifyTrack]:
|
||||||
|
logger.info(f'getting {len(uris)} tracks')
|
||||||
|
|
||||||
|
if not all(i.object_type == Uri.ObjectType.track for i in uris):
|
||||||
|
raise TypeError('uris must be of type track')
|
||||||
|
|
||||||
|
tracks = []
|
||||||
|
chunked_uris = list(self.chunk(uris, 50))
|
||||||
|
for chunk in chunked_uris:
|
||||||
|
resp = self.get_request(method='getTracks', url='tracks', params={'ids': ','.join([i.object_id for i in chunk])})
|
||||||
|
if resp:
|
||||||
|
tracks += [self.parse_track(i) for i in resp.get('tracks', [])]
|
||||||
|
|
||||||
|
return tracks
|
||||||
|
|
||||||
|
def get_track(self, uri: Uri) -> Optional[SpotifyTrack]:
|
||||||
|
track = self.get_tracks([uri])
|
||||||
|
if len(track) == 1:
|
||||||
|
return track[0]
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_albums(self, uris: List[Uri]) -> List[SpotifyAlbum]:
|
||||||
|
logger.info(f'getting {len(uris)} albums')
|
||||||
|
|
||||||
|
if not all(i.object_type == Uri.ObjectType.album for i in uris):
|
||||||
|
raise TypeError('uris must be of type album')
|
||||||
|
|
||||||
|
albums = []
|
||||||
|
chunked_uris = list(self.chunk(uris, 50))
|
||||||
|
for chunk in chunked_uris:
|
||||||
|
resp = self.get_request(method='getAlbums', url='albums', params={'ids': ','.join([i.object_id for i in chunk])})
|
||||||
|
if resp:
|
||||||
|
albums += [self.parse_album(i) for i in resp.get('albums', [])]
|
||||||
|
|
||||||
|
return albums
|
||||||
|
|
||||||
|
def get_album(self, uri: Uri) -> Optional[SpotifyAlbum]:
|
||||||
|
album = self.get_albums([uri])
|
||||||
|
if len(album) == 1:
|
||||||
|
return album[0]
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_artists(self, uris: List[Uri]) -> List[SpotifyArtist]:
|
||||||
|
logger.info(f'getting {len(uris)} artists')
|
||||||
|
|
||||||
|
if not all(i.object_type == Uri.ObjectType.artist for i in uris):
|
||||||
|
raise TypeError('uris must be of type artist')
|
||||||
|
|
||||||
|
artists = []
|
||||||
|
chunked_uris = list(self.chunk(uris, 50))
|
||||||
|
for chunk in chunked_uris:
|
||||||
|
resp = self.get_request(method='getArtists', url='artists', params={'ids': ','.join([i.object_id for i in chunk])})
|
||||||
|
if resp:
|
||||||
|
artists += [self.parse_artist(i) for i in resp.get('artists', [])]
|
||||||
|
|
||||||
|
return artists
|
||||||
|
|
||||||
|
def get_artist(self, uri: Uri) -> Optional[SpotifyArtist]:
|
||||||
|
artist = self.get_artists([uri])
|
||||||
|
if len(artist) == 1:
|
||||||
|
return artist[0]
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def parse_artist(artist_dict) -> SpotifyArtist:
|
def parse_artist(artist_dict) -> SpotifyArtist:
|
||||||
|
|
||||||
@ -725,7 +791,6 @@ class Network:
|
|||||||
popularity=popularity)
|
popularity=popularity)
|
||||||
|
|
||||||
def parse_album(self, album_dict) -> Union[SpotifyAlbum, LibraryAlbum]:
|
def parse_album(self, album_dict) -> Union[SpotifyAlbum, LibraryAlbum]:
|
||||||
|
|
||||||
if 'album' in album_dict:
|
if 'album' in album_dict:
|
||||||
album = album_dict.get('album', None)
|
album = album_dict.get('album', None)
|
||||||
else:
|
else:
|
||||||
@ -1037,12 +1102,19 @@ class PageCollection:
|
|||||||
return items[:self.total_limit]
|
return items[:self.total_limit]
|
||||||
|
|
||||||
def continue_iteration(self):
|
def continue_iteration(self):
|
||||||
|
if self.total_limit:
|
||||||
if len(self) < self.total_limit:
|
if len(self) < self.total_limit:
|
||||||
if len(self.pages) > 0:
|
if len(self.pages) > 0:
|
||||||
if self.pages[-1].next_link:
|
if self.pages[-1].next_link:
|
||||||
self.iterate(self.pages[-1].next_link)
|
self.iterate(self.pages[-1].next_link)
|
||||||
else:
|
else:
|
||||||
raise IndexError('no pages')
|
raise IndexError('no pages')
|
||||||
|
else:
|
||||||
|
if len(self.pages) > 0:
|
||||||
|
if self.pages[-1].next_link:
|
||||||
|
self.iterate(self.pages[-1].next_link)
|
||||||
|
else:
|
||||||
|
raise IndexError('no pages')
|
||||||
|
|
||||||
def iterate(self, url=None):
|
def iterate(self, url=None):
|
||||||
logger.debug(f'iterating {self.name}')
|
logger.debug(f'iterating {self.name}')
|
||||||
|
Loading…
Reference in New Issue
Block a user