aboutsummaryrefslogtreecommitdiffstats
path: root/src/daemon.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/daemon.rs32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/daemon.rs b/src/daemon.rs
index 3379c7b..9e02e3f 100644
--- a/src/daemon.rs
+++ b/src/daemon.rs
@@ -150,8 +150,12 @@ impl Queue {
150 } 150 }
151 151
152 fn insert_after_current(&mut self, path: PathBuf) { 152 fn insert_after_current(&mut self, path: PathBuf) {
153 let insert_idx = self.position + 1; 153 if self.tracks.is_empty() {
154 self.tracks.insert(insert_idx, Track::from_path(path)); 154 self.tracks.push(Track::from_path(path));
155 } else {
156 let insert_idx = self.position + 1;
157 self.tracks.insert(insert_idx, Track::from_path(path));
158 }
155 self.update_shuffle_indices(); 159 self.update_shuffle_indices();
156 } 160 }
157 161
@@ -165,11 +169,15 @@ impl Queue {
165 } 169 }
166 170
167 fn update_shuffle_indices(&mut self) { 171 fn update_shuffle_indices(&mut self) {
168 self.shuffled_indices = (0..self.tracks.len()).collect(); 172 let len = self.tracks.len();
173 self.shuffled_indices = (0..len).collect();
169 if let ShuffleMode::All = self.shuffle { 174 if let ShuffleMode::All = self.shuffle {
170 use rand::seq::SliceRandom; 175 use rand::seq::SliceRandom;
171 let mut rng = rand::rng(); 176 let mut rng = rand::rng();
172 self.shuffled_indices.shuffle(&mut rng); 177 let pos = self.position.min(len.saturating_sub(1));
178 if pos + 1 < len {
179 self.shuffled_indices[pos + 1..].shuffle(&mut rng);
180 }
173 } 181 }
174 } 182 }
175 183
@@ -583,10 +591,13 @@ fn process_command(
583 let path = std::path::PathBuf::from(path_str.clone()); 591 let path = std::path::PathBuf::from(path_str.clone());
584 if path.is_file() { 592 if path.is_file() {
585 if let Ok(mut q) = queue.lock() { 593 if let Ok(mut q) = queue.lock() {
594 let was_empty = q.tracks.is_empty();
586 match position { 595 match position {
587 "now" => { 596 "now" => {
588 q.insert_after_current(path.clone()); 597 q.insert_after_current(path.clone());
589 q.position += 1; 598 if !was_empty {
599 q.position += 1;
600 }
590 if let Some(track) = q.track_at(q.position) { 601 if let Some(track) = q.track_at(q.position) {
591 audio.play(track.path.clone()); 602 audio.play(track.path.clone());
592 } 603 }
@@ -609,12 +620,15 @@ fn process_command(
609 match find_audio_in_dir(&path) { 620 match find_audio_in_dir(&path) {
610 Some(files) if !files.is_empty() => { 621 Some(files) if !files.is_empty() => {
611 if let Ok(mut q) = queue.lock() { 622 if let Ok(mut q) = queue.lock() {
623 let was_empty = q.tracks.is_empty();
612 match position { 624 match position {
613 "now" => { 625 "now" => {
614 for file in &files { 626 for file in &files {
615 q.insert_after_current(file.clone()); 627 q.insert_after_current(file.clone());
616 } 628 }
617 q.position += 1; 629 if !was_empty {
630 q.position += 1;
631 }
618 if let Some(track) = q.track_at(q.position) { 632 if let Some(track) = q.track_at(q.position) {
619 audio.play(track.path.clone()); 633 audio.play(track.path.clone());
620 } 634 }
@@ -638,8 +652,10 @@ fn process_command(
638 for file in &files { 652 for file in &files {
639 q.add_track(file.clone()); 653 q.add_track(file.clone());
640 } 654 }
641 if let Some(track) = q.current() { 655 if !audio.is_playing() {
642 audio.play(track.path.clone()); 656 if let Some(track) = files.first() {
657 audio.play(track.clone());
658 }
643 } 659 }
644 format!("Queued {} tracks from: {}\n", files.len(), path_str) 660 format!("Queued {} tracks from: {}\n", files.len(), path_str)
645 } 661 }