From 17d4534260c3340498e1033b0c287da0bb03af14 Mon Sep 17 00:00:00 2001 From: Paul Lietar Date: Mon, 28 Dec 2015 17:47:53 +0100 Subject: [PATCH] Play an alternative track if selected one is not available. --- src/player.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/player.rs b/src/player.rs index b611867b..1af6d014 100644 --- a/src/player.rs +++ b/src/player.rs @@ -1,10 +1,10 @@ -use eventual::Async; +use eventual::{self, Async}; use portaudio; use std::sync::{mpsc, Mutex, Arc, Condvar, MutexGuard}; use std::thread; use vorbis; -use metadata::Track; +use metadata::{Track, TrackRef}; use session::Session; use audio_decrypt::AudioDecrypt; use util::{self, SpotifyId, Subfile}; @@ -97,8 +97,17 @@ impl PlayerInternal { state.position_measured_at = util::now_ms(); return true; }); + drop(decoder); - let track = self.session.metadata::(track_id).await().unwrap(); + let mut track = self.session.metadata::(track_id).await().unwrap(); + + if !track.available { + let alternatives = track.alternatives.iter() + .map(|alt_id| self.session.metadata::(*alt_id)) + .collect::>(); + + track = eventual::sequence(alternatives.into_iter()).iter().find(|alt| alt.available).unwrap(); + } let file_id = track.files[0];