diff options
| author | salmonik <raisersoft@proton.me> | 2026-05-10 01:09:31 +0200 |
|---|---|---|
| committer | salmonik <raisersoft@proton.me> | 2026-05-10 01:09:31 +0200 |
| commit | 5320c6d08c13c5eb40b0431502b0c8b8d04da561 (patch) | |
| tree | 1c5cb18cccae8f81812ab317bb81d008e7d06285 /src/queue.rs | |
| parent | Add shuffle restore tests, remove debug prints, update TODO (diff) | |
| download | rsplayer-5320c6d08c13c5eb40b0431502b0c8b8d04da561.tar.gz rsplayer-5320c6d08c13c5eb40b0431502b0c8b8d04da561.zip | |
Fix album shuffle - shuffle tracks when adding in album mode
Diffstat (limited to 'src/queue.rs')
| -rw-r--r-- | src/queue.rs | 45 |
1 files changed, 14 insertions, 31 deletions
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 { | |||
| 184 | 184 | ||
| 185 | fn restore_from_original(&mut self) { | 185 | fn restore_from_original(&mut self) { |
| 186 | if self.original_tracks.is_empty() { | 186 | if self.original_tracks.is_empty() { |
| 187 | eprintln!("DEBUG: original_tracks empty"); | ||
| 188 | self.shuffled_indices.clear(); | 187 | self.shuffled_indices.clear(); |
| 189 | return; | 188 | return; |
| 190 | } | 189 | } |
| 191 | 190 | ||
| 192 | let current_pos = self.position; | 191 | let current_pos = self.position; |
| 193 | let indices_len = self.shuffled_indices.len().min(10); | ||
| 194 | eprintln!( | ||
| 195 | "DEBUG restore: current_pos={}, tracks.len={}, shuffled_indices={:?}", | ||
| 196 | current_pos, | ||
| 197 | self.tracks.len(), | ||
| 198 | &self.shuffled_indices[..indices_len] | ||
| 199 | ); | ||
| 200 | 192 | ||
| 201 | // Find which tracks have been played (positions 0..=current_pos in shuffled order) | 193 | // Find which tracks have been played (positions 0..=current_pos in shuffled order) |
| 202 | let mut played_track_paths: Vec<std::path::PathBuf> = Vec::new(); | 194 | let mut played_track_paths: Vec<std::path::PathBuf> = Vec::new(); |
| @@ -204,12 +196,6 @@ impl Queue { | |||
| 204 | if let Some(&idx) = self.shuffled_indices.get(i) | 196 | if let Some(&idx) = self.shuffled_indices.get(i) |
| 205 | && let Some(track) = self.tracks.get(idx) | 197 | && let Some(track) = self.tracks.get(idx) |
| 206 | { | 198 | { |
| 207 | eprintln!( | ||
| 208 | "DEBUG: played track at shuffled pos {} -> track idx {} = {:?}", | ||
| 209 | i, | ||
| 210 | idx, | ||
| 211 | track.path.file_name() | ||
| 212 | ); | ||
| 213 | played_track_paths.push(track.path.clone()); | 199 | played_track_paths.push(track.path.clone()); |
| 214 | } | 200 | } |
| 215 | } | 201 | } |
| @@ -222,22 +208,13 @@ impl Queue { | |||
| 222 | } | 208 | } |
| 223 | } | 209 | } |
| 224 | 210 | ||
| 225 | eprintln!("DEBUG: kept {} played tracks", new_tracks.len()); | ||
| 226 | |||
| 227 | // Add remaining tracks from original in original order | 211 | // Add remaining tracks from original in original order |
| 228 | for (i, orig_track) in self.original_tracks.iter().enumerate() { | 212 | for orig_track in &self.original_tracks { |
| 229 | let is_played = played_track_paths.iter().any(|p| p == &orig_track.path); | 213 | let is_played = played_track_paths.iter().any(|p| p == &orig_track.path); |
| 230 | if !is_played { | 214 | if !is_played { |
| 231 | eprintln!( | ||
| 232 | "DEBUG: adding unplayed from original idx {}: {:?}", | ||
| 233 | i, | ||
| 234 | orig_track.path.file_name() | ||
| 235 | ); | ||
| 236 | new_tracks.push(orig_track.clone()); | 215 | new_tracks.push(orig_track.clone()); |
| 237 | } | 216 | } |
| 238 | } | 217 | } |
| 239 | |||
| 240 | eprintln!("DEBUG: final tracks.len={}", new_tracks.len()); | ||
| 241 | self.tracks = new_tracks; | 218 | self.tracks = new_tracks; |
| 242 | self.position = current_pos; | 219 | self.position = current_pos; |
| 243 | self.shuffled_indices.clear(); | 220 | self.shuffled_indices.clear(); |
| @@ -246,14 +223,20 @@ impl Queue { | |||
| 246 | fn update_shuffle_indices(&mut self) { | 223 | fn update_shuffle_indices(&mut self) { |
| 247 | let len = self.tracks.len(); | 224 | let len = self.tracks.len(); |
| 248 | self.shuffled_indices = (0..len).collect(); | 225 | self.shuffled_indices = (0..len).collect(); |
| 249 | if let ShuffleMode::All = self.shuffle { | 226 | match self.shuffle { |
| 250 | let mut rng = rand::rng(); | 227 | ShuffleMode::All => { |
| 251 | let pos = self.position.min(len.saturating_sub(1)); | 228 | let mut rng = rand::rng(); |
| 252 | if pos == 0 && len > 1 { | 229 | let pos = self.position.min(len.saturating_sub(1)); |
| 253 | self.shuffled_indices.shuffle(&mut rng); | 230 | if pos == 0 && len > 1 { |
| 254 | } else if pos + 1 < len { | 231 | self.shuffled_indices.shuffle(&mut rng); |
| 255 | self.shuffled_indices[pos + 1..].shuffle(&mut rng); | 232 | } else if pos + 1 < len { |
| 233 | self.shuffled_indices[pos + 1..].shuffle(&mut rng); | ||
| 234 | } | ||
| 235 | } | ||
| 236 | ShuffleMode::Album => { | ||
| 237 | self.update_shuffle_indices_album(); | ||
| 256 | } | 238 | } |
| 239 | ShuffleMode::None => {} | ||
| 257 | } | 240 | } |
| 258 | } | 241 | } |
| 259 | 242 | ||
