| 
					
				 | 
			
			
				@@ -33,7 +33,8 @@ pub struct SpircManager<'s, D: SpircDelegate> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     last_command_ident: String, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     last_command_msgid: u32, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    track: Option<SpotifyId> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tracks: Vec<SpotifyId>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    index: u32 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 pub trait SpircDelegate { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -54,6 +55,7 @@ pub trait SpircState { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fn status(&self) -> PlayStatus; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fn position(&self) -> (u32, i64); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fn update_time(&self) -> i64; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn end_of_track(&self) -> bool; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 impl <'s, D: SpircDelegate> SpircManager<'s, D> { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -82,7 +84,8 @@ impl <'s, D: SpircDelegate> SpircManager<'s, D> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             last_command_ident: String::new(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             last_command_msgid: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            track: None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tracks: Vec::new(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            index: 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -108,8 +111,15 @@ impl <'s, D: SpircDelegate> SpircManager<'s, D> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 update_time = updates.recv() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    self.state_update_id = update_time.unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    self.notify(None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    let end_of_track = self.delegate.state().end_of_track(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if end_of_track { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        self.index = (self.index + 1) % self.tracks.len() as u32; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        let track = self.tracks[self.index as usize]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        self.delegate.load(track, true, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        self.state_update_id = update_time.unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        self.notify(None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -130,11 +140,16 @@ impl <'s, D: SpircDelegate> SpircManager<'s, D> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     self.became_active_at = util::now_ms(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                let index = frame.get_state().get_playing_track_index() as usize; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                let track = SpotifyId::from_raw(frame.get_state().get_track()[index].get_gid()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.index = frame.get_state().get_playing_track_index(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.tracks = frame.get_state().get_track().iter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .map(|track| SpotifyId::from_raw(track.get_gid())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .collect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 let play = frame.get_state().get_status() == PlayStatus::kPlayStatusPlay; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.track = Some(track); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.delegate.load(track, play, frame.get_state().get_position_ms()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let track = self.tracks[self.index as usize]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let position = frame.get_state().get_position_ms(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.delegate.load(track, play, position); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             protocol::spirc::MessageType::kMessageTypePlay => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 self.delegate.play(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -190,12 +205,12 @@ impl <'s, D: SpircDelegate> SpircManager<'s, D> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             position_ms: position_ms, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             position_measured_at: position_measured_at as u64, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            playing_track_index: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            track => [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                @{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    gid: self.track.unwrap().to_raw().to_vec() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            playing_track_index: self.index, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            track: self.tracks.iter().map(|track| { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                protobuf_init!(protocol::spirc::TrackRef::new(), { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    gid: track.to_raw().to_vec() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }).collect(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             shuffle: self.shuffle, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             repeat: self.repeat, 
			 |