From 5320c6d08c13c5eb40b0431502b0c8b8d04da561 Mon Sep 17 00:00:00 2001 From: salmonik Date: Sun, 10 May 2026 01:09:31 +0200 Subject: Fix album shuffle - shuffle tracks when adding in album mode --- TODO.md | 3 ++- src/queue.rs | 45 ++++++++++++++------------------------------- 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/TODO.md b/TODO.md index e06d624..bdca569 100644 --- a/TODO.md +++ b/TODO.md @@ -66,6 +66,7 @@ - [x] **Play command rewrite** - No args queues to end (play if queue empty + not playing), -i inserts and plays, -n inserts without playing, removed -l flag - [x] **Queue display rewrite** - Returns full output (client can pipe to pager), removed daemon-side pager (fails without TTY) + - [x] **Shuffle rewrite** - Always remembers original queue, shuffle none keeps played tracks in place, album shuffle groups by album ### Optional Features @@ -76,4 +77,4 @@ - [ ] **Customize status display** - Variables like $ARTIST, $ALBUM, $TRACK available in config so `queue`, `status` and notifs can be customized -- [ ] **Dynamic autocompletion of artists, albums and tracks** - Let shell communicate with the daemon so it returns autocompletions for shell \ No newline at end of file +- [ ] **Dynamic autocompletion of artists, albums and tracks** - Let shell communicate with the daemon so it returns autocompletions for shell diff --git a/src/queue.rs b/src/queue.rs index edd973f..503560b 100644 --- a/src/queue.rs +++ b/src/queue.rs @@ -184,19 +184,11 @@ impl Queue { fn restore_from_original(&mut self) { if self.original_tracks.is_empty() { - eprintln!("DEBUG: original_tracks empty"); self.shuffled_indices.clear(); return; } let current_pos = self.position; - let indices_len = self.shuffled_indices.len().min(10); - eprintln!( - "DEBUG restore: current_pos={}, tracks.len={}, shuffled_indices={:?}", - current_pos, - self.tracks.len(), - &self.shuffled_indices[..indices_len] - ); // Find which tracks have been played (positions 0..=current_pos in shuffled order) let mut played_track_paths: Vec = Vec::new(); @@ -204,12 +196,6 @@ impl Queue { if let Some(&idx) = self.shuffled_indices.get(i) && let Some(track) = self.tracks.get(idx) { - eprintln!( - "DEBUG: played track at shuffled pos {} -> track idx {} = {:?}", - i, - idx, - track.path.file_name() - ); played_track_paths.push(track.path.clone()); } } @@ -222,22 +208,13 @@ impl Queue { } } - eprintln!("DEBUG: kept {} played tracks", new_tracks.len()); - // Add remaining tracks from original in original order - for (i, orig_track) in self.original_tracks.iter().enumerate() { + for orig_track in &self.original_tracks { let is_played = played_track_paths.iter().any(|p| p == &orig_track.path); if !is_played { - eprintln!( - "DEBUG: adding unplayed from original idx {}: {:?}", - i, - orig_track.path.file_name() - ); new_tracks.push(orig_track.clone()); } } - - eprintln!("DEBUG: final tracks.len={}", new_tracks.len()); self.tracks = new_tracks; self.position = current_pos; self.shuffled_indices.clear(); @@ -246,14 +223,20 @@ impl Queue { fn update_shuffle_indices(&mut self) { let len = self.tracks.len(); self.shuffled_indices = (0..len).collect(); - if let ShuffleMode::All = self.shuffle { - let mut rng = rand::rng(); - let pos = self.position.min(len.saturating_sub(1)); - if pos == 0 && len > 1 { - self.shuffled_indices.shuffle(&mut rng); - } else if pos + 1 < len { - self.shuffled_indices[pos + 1..].shuffle(&mut rng); + match self.shuffle { + ShuffleMode::All => { + let mut rng = rand::rng(); + let pos = self.position.min(len.saturating_sub(1)); + if pos == 0 && len > 1 { + self.shuffled_indices.shuffle(&mut rng); + } else if pos + 1 < len { + self.shuffled_indices[pos + 1..].shuffle(&mut rng); + } + } + ShuffleMode::Album => { + self.update_shuffle_indices_album(); } + ShuffleMode::None => {} } } -- cgit v1.2.3