From a28199f07341f3437cb8d6959c6c3f79f11b4a51 Mon Sep 17 00:00:00 2001 From: ashthespy Date: Wed, 27 May 2020 18:14:31 +0200 Subject: [PATCH] Tweak handling unavailables at start of playlists --- connect/src/spirc.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/connect/src/spirc.rs b/connect/src/spirc.rs index c0bcfcfa..c6feb728 100644 --- a/connect/src/spirc.rs +++ b/connect/src/spirc.rs @@ -914,13 +914,19 @@ impl SpircTask { // Mark unavailable tracks so we can skip them later fn handle_unavailable(&mut self, track_id: SpotifyId) { let playing_index = self.state.get_playing_track_index() as usize; - let search_from = if playing_index == self.state.get_track().len() - 1 { - trace!("Cycling back to 0 instead of {:?}", playing_index); - 0 - } else { - playing_index - }; - let unavailables = self.get_track_index_for_spotify_id(&track_id, search_from); + let mut unavailables = self.get_track_index_for_spotify_id(&track_id, playing_index); + if unavailables.is_empty() { + trace!( + "Couldn't find unavailables searching from {:?} -- {:?}, cycling through entire playlist", + playing_index, + self.state.get_track().len() + ); + // We could just do this everytime, but for most cases it's needless overhead. + // we are still repeating the serach for (playing_index..) in this case + unavailables = self.get_track_index_for_spotify_id(&track_id, 0); + } + // Sanity check + debug_assert!(!unavailables.is_empty()); for &index in unavailables.iter() { debug_assert_eq!(self.state.get_track()[index].get_gid(), track_id.to_raw()); let mut unplayable_track_ref = TrackRef::new(); @@ -1185,8 +1191,6 @@ impl SpircTask { .filter(|&(_, track_ref)| track_ref.get_gid() == track_id.to_raw()) .map(|(idx, _)| start_index + idx) .collect(); - // Sanity check - debug_assert!(!index.is_empty()); index }