diff --git a/crabidy-server/src/lib.rs b/crabidy-server/src/lib.rs index a2f1958..072e28e 100644 --- a/crabidy-server/src/lib.rs +++ b/crabidy-server/src/lib.rs @@ -159,14 +159,20 @@ impl QueueManager { } } - pub fn append_tracks(&mut self, tracks: &[Track]) { + pub fn append_tracks(&mut self, tracks: &[Track]) -> Option { let len = self.tracks.len(); + let is_empty = len == 0; let order_additions: Vec = (len..len + tracks.len()).collect(); self.play_order.extend(order_additions); self.tracks.extend(tracks.iter().cloned()); if self.shuffle { self.shuffle_behind(self.current_offset); } + if is_empty { + self.current_track() + } else { + None + } } pub fn remove_tracks(&mut self, positions: &[u32]) -> Option { @@ -204,11 +210,10 @@ impl QueueManager { } } - pub fn insert_tracks(&mut self, position: u32, tracks: &[Track]) { + pub fn insert_tracks(&mut self, position: u32, tracks: &[Track]) -> Option { let len = self.tracks.len(); if len == 0 { - self.replace_with_tracks(tracks); - return; + return self.replace_with_tracks(tracks); } let order_additions: Vec = (len..len + tracks.len()).collect(); self.play_order.extend(order_additions); @@ -248,11 +253,12 @@ impl QueueManager { if self.shuffle { self.shuffle_behind(self.current_offset); } + None } - pub fn queue_tracks(&mut self, tracks: &[Track]) { + pub fn queue_tracks(&mut self, tracks: &[Track]) -> Option { let pos = self.current_position(); - self.insert_tracks(pos as u32, tracks); + self.insert_tracks(pos as u32, tracks) } pub fn clear(&mut self, exclude_current: bool) -> bool { diff --git a/crabidy-server/src/playback.rs b/crabidy-server/src/playback.rs index 4cea8e7..b15bb50 100644 --- a/crabidy-server/src/playback.rs +++ b/crabidy-server/src/playback.rs @@ -143,20 +143,22 @@ impl Playback { } } trace!("got tracks {:?}", all_tracks); - { + let track = { let Ok(mut queue) = self.queue.lock() else { debug!("got queue lock"); continue; }; debug!("got queue lock"); - queue.queue_tracks(&all_tracks); + let track = queue.queue_tracks(&all_tracks); let queue_update_tx = self.update_tx.clone(); let update = StreamUpdate::Queue(queue.clone().into()); if let Err(err) = queue_update_tx.send(update) { trace!("{:?}", err) } - } + track + }; debug!("que lock released"); + self.play(track).in_current_span().await; } PlaybackMessage::Append { uuids, span } => { @@ -174,20 +176,22 @@ impl Playback { } } trace!("got tracks {:?}", all_tracks); - { + let track = { let Ok(mut queue) = self.queue.lock() else { debug!("got queue lock"); continue; }; debug!("got queue lock"); - queue.append_tracks(&all_tracks); + let track = queue.append_tracks(&all_tracks); let queue_update_tx = self.update_tx.clone(); let update = StreamUpdate::Queue(queue.clone().into()); if let Err(err) = queue_update_tx.send(update) { trace!("{:?}", err) } - } + track + }; debug!("queue lock released"); + self.play(track).in_current_span().await; } PlaybackMessage::Remove { positions, span } => { @@ -247,20 +251,22 @@ impl Playback { } } trace!("got tracks {:?}", all_tracks); - { + let track = { let Ok(mut queue) = self.queue.lock() else { debug!("got queue lock"); continue; }; debug!("got queue lock"); - queue.insert_tracks(position, &all_tracks); + let track = queue.insert_tracks(position, &all_tracks); let queue_update_tx = self.update_tx.clone(); let update = StreamUpdate::Queue(queue.clone().into()); if let Err(err) = queue_update_tx.send(update) { trace!("{:?}", err) }; - } + track + }; debug!("queue lock released"); + self.play(track).in_current_span().await; } PlaybackMessage::Clear {