diff --git a/src/album.rs b/src/album.rs index 508a13d..a810bfd 100644 --- a/src/album.rs +++ b/src/album.rs @@ -33,15 +33,32 @@ impl Album { } if let Some(ref album_id) = self.id { - if let Some(fa) = spotify.full_album(&album_id) { - self.tracks = Some( - fa.tracks - .items - .iter() - .map(|st| Track::from_simplified_track(&st, &fa)) - .collect(), - ); + let mut collected_tracks = Vec::new(); + if let Some(full_album) = spotify.full_album(album_id) { + let mut tracks_result = Some(full_album.tracks.clone()); + while let Some(ref tracks) = tracks_result { + for t in &tracks.items { + collected_tracks.push(Track::from_simplified_track(t, &full_album)); + } + + debug!("got {} tracks", tracks.items.len()); + + // load next batch if necessary + tracks_result = match tracks.next { + Some(_) => { + debug!("requesting tracks again.."); + spotify.album_tracks( + album_id, + 50, + tracks.offset + tracks.items.len() as u32, + ) + } + None => None, + } + } } + + self.tracks = Some(collected_tracks) } } } diff --git a/src/spotify.rs b/src/spotify.rs index cefb8e4..d667523 100644 --- a/src/spotify.rs +++ b/src/spotify.rs @@ -19,7 +19,7 @@ use rspotify::model::artist::FullArtist; use rspotify::model::page::{CursorBasedPage, Page}; use rspotify::model::playlist::{FullPlaylist, PlaylistTrack, SimplifiedPlaylist}; use rspotify::model::search::SearchResult; -use rspotify::model::track::{FullTrack, SavedTrack}; +use rspotify::model::track::{FullTrack, SavedTrack, SimplifiedTrack}; use rspotify::model::user::PrivateUser; use rspotify::senum::SearchType; @@ -713,6 +713,15 @@ impl Spotify { self.api_with_retry(|api| api.album(album_id)) } + pub fn album_tracks( + &self, + album_id: &str, + limit: u32, + offset: u32, + ) -> Option> { + self.api_with_retry(|api| api.album_track(album_id, limit, offset)) + } + pub fn artist_albums( &self, artist_id: &str,