From 0de6ad2dfeae3fd544d18c72cf6bba95739a2045 Mon Sep 17 00:00:00 2001 From: Henrik Friedrichsen Date: Wed, 17 Apr 2019 18:25:00 +0200 Subject: [PATCH] adapt to new rspotify structures these changes are necessary to handle playlists with local tracks properly --- src/album.rs | 46 ++++++++++++++++++++++++++++++---------------- src/artist.rs | 15 +++++++++++---- src/mpris.rs | 2 +- src/playlists.rs | 10 ++++++++-- src/spotify.rs | 16 ++++++++++++---- src/track.rs | 4 ++-- 6 files changed, 64 insertions(+), 29 deletions(-) diff --git a/src/album.rs b/src/album.rs index 1bd0e0b..ea40453 100644 --- a/src/album.rs +++ b/src/album.rs @@ -10,12 +10,12 @@ use traits::ListItem; #[derive(Clone, Deserialize, Serialize)] pub struct Album { - pub id: String, + pub id: Option, pub title: String, pub artists: Vec, pub year: String, pub cover_url: Option, - pub url: String, + pub url: Option, pub tracks: Option>, } @@ -25,14 +25,16 @@ impl Album { return; } - if let Some(fa) = spotify.full_album(&self.id) { - self.tracks = Some( - fa.tracks - .items - .iter() - .map(|st| Track::from_simplified_track(&st, &fa)) - .collect(), - ); + 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(), + ); + } } } } @@ -43,7 +45,14 @@ impl From<&SimplifiedAlbum> for Album { id: sa.id.clone(), title: sa.name.clone(), artists: sa.artists.iter().map(|sa| sa.name.clone()).collect(), - year: sa.release_date.split('-').next().unwrap().into(), + year: sa + .release_date + .clone() + .unwrap_or_default() + .split('-') + .next() + .unwrap() + .into(), cover_url: sa.images.get(0).map(|i| i.url.clone()), url: sa.uri.clone(), tracks: None, @@ -62,12 +71,12 @@ impl From<&FullAlbum> for Album { ); Self { - id: fa.id.clone(), + id: Some(fa.id.clone()), title: fa.name.clone(), artists: fa.artists.iter().map(|sa| sa.name.clone()).collect(), year: fa.release_date.split('-').next().unwrap().into(), cover_url: fa.images.get(0).map(|i| i.url.clone()), - url: fa.uri.clone(), + url: Some(fa.uri.clone()), tracks, } } @@ -83,7 +92,7 @@ impl fmt::Debug for Album { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "({} - {} ({}))", + "({} - {} ({:?}))", self.artists.join(", "), self.title, self.id @@ -99,9 +108,14 @@ impl ListItem for Album { .read() .unwrap() .iter() - .map(|t| t.id.clone()) + .filter(|t| t.id.is_some()) + .map(|t| t.id.clone().unwrap()) + .collect(); + let ids: Vec = tracks + .iter() + .filter(|t| t.id.is_some()) + .map(|t| t.id.clone().unwrap()) .collect(); - let ids: Vec = tracks.iter().map(|t| t.id.clone()).collect(); !ids.is_empty() && playing == ids } else { false diff --git a/src/artist.rs b/src/artist.rs index f39685b..d9e79df 100644 --- a/src/artist.rs +++ b/src/artist.rs @@ -31,8 +31,10 @@ impl Artist { continue; } - if let Some(fa) = spotify.full_album(&sa.id).as_ref() { - albums.push(fa.into()); + if let Some(album_id) = sa.id { + if let Some(fa) = spotify.full_album(&album_id).as_ref() { + albums.push(fa.into()); + } } } @@ -86,9 +88,14 @@ impl ListItem for Artist { .read() .unwrap() .iter() - .map(|t| t.id.clone()) + .filter(|t| t.id.is_some()) + .map(|t| t.id.clone().unwrap()) + .collect(); + let ids: Vec = tracks + .iter() + .filter(|t| t.id.is_some()) + .map(|t| t.id.clone().unwrap()) .collect(); - let ids: Vec = tracks.iter().map(|t| t.id.clone()).collect(); !ids.is_empty() && playing == ids } else { false diff --git a/src/mpris.rs b/src/mpris.rs index 323c7b4..b828d4f 100644 --- a/src/mpris.rs +++ b/src/mpris.rs @@ -29,7 +29,7 @@ fn get_metadata(queue: Arc) -> HashMap>> { "mpris:trackid".to_string(), Variant(Box::new( track - .map(|t| format!("spotify:track:{}", t.id)) + .map(|t| format!("spotify:track:{}", t.id.clone().unwrap_or("0".to_string()))) .unwrap_or_default(), )), ); diff --git a/src/playlists.rs b/src/playlists.rs index 05e9c49..86b56f7 100644 --- a/src/playlists.rs +++ b/src/playlists.rs @@ -37,9 +37,15 @@ impl ListItem for Playlist { .read() .unwrap() .iter() - .map(|t| t.id.clone()) + .filter(|t| t.id.is_some()) + .map(|t| t.id.clone().unwrap()) + .collect(); + let ids: Vec = self + .tracks + .iter() + .filter(|t| t.id.is_some()) + .map(|t| t.id.clone().unwrap()) .collect(); - let ids: Vec = self.tracks.iter().map(|t| t.id.clone()).collect(); !ids.is_empty() && playing == ids } diff --git a/src/spotify.rs b/src/spotify.rs index d08efe4..ae6982e 100644 --- a/src/spotify.rs +++ b/src/spotify.rs @@ -123,9 +123,13 @@ impl futures::Future for Worker { debug!("message received!"); match cmd { WorkerCommand::Load(track) => { - let id = SpotifyId::from_base62(&track.id).expect("could not parse id"); - self.play_task = Box::new(self.player.load(id, false, 0)); - info!("player loading track: {:?}", track); + if let Some(track_id) = &track.id { + let id = SpotifyId::from_base62(track_id).expect("could not parse id"); + self.play_task = Box::new(self.player.load(id, false, 0)); + info!("player loading track: {:?}", track); + } else { + self.events.send(Event::Player(PlayerEvent::FinishedTrack)); + } } WorkerCommand::Play => { self.player.play(); @@ -407,7 +411,11 @@ impl Spotify { pub fn overwrite_playlist(&self, id: &str, tracks: &[Track]) { // extract only track IDs - let mut tracks: Vec = tracks.iter().map(|track| track.id.clone()).collect(); + let mut tracks: Vec = tracks + .iter() + .filter(|track| track.id.is_some()) + .map(|track| track.id.clone().unwrap()) + .collect(); // we can only send 100 tracks per request let mut remainder = if tracks.len() > 100 { diff --git a/src/track.rs b/src/track.rs index 1a04ba1..88fedb3 100644 --- a/src/track.rs +++ b/src/track.rs @@ -9,7 +9,7 @@ use traits::ListItem; #[derive(Clone, Deserialize, Serialize)] pub struct Track { - pub id: String, + pub id: Option, pub title: String, pub track_number: u32, pub disc_number: i32, @@ -104,7 +104,7 @@ impl fmt::Debug for Track { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "({} - {} ({}))", + "({} - {} ({:?}))", self.artists.join(", "), self.title, self.id