Quellcode durchsuchen

Play an alternative track if selected one is not available.

Paul Lietar vor 9 Jahren
Ursprung
Commit
17d4534260
1 geänderte Dateien mit 12 neuen und 3 gelöschten Zeilen
  1. 12 3
      src/player.rs

+ 12 - 3
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>(track_id).await().unwrap();
+                    let mut track = self.session.metadata::<Track>(track_id).await().unwrap();
+
+                    if !track.available {
+                        let alternatives = track.alternatives.iter()
+                            .map(|alt_id| self.session.metadata::<Track>(*alt_id))
+                            .collect::<Vec<TrackRef>>();
+
+                        track = eventual::sequence(alternatives.into_iter()).iter().find(|alt| alt.available).unwrap();
+                    }
 
                     let file_id = track.files[0];