1
0
Fork 0
mirror of https://github.com/librespot-org/librespot.git synced 2025-10-03 09:49:31 +02:00

chore: reduce complexity of shuffle

This commit is contained in:
Felix Prillwitz 2025-08-30 20:55:39 +02:00
parent e22307ee04
commit 9921f4cc11
No known key found for this signature in database
GPG key ID: DE334B43606D1455
5 changed files with 30 additions and 28 deletions

View file

@ -319,7 +319,7 @@ impl ContextResolver {
let res = if let Some(transfer_state) = transfer_state.take() { let res = if let Some(transfer_state) = transfer_state.take() {
state.finish_transfer(transfer_state) state.finish_transfer(transfer_state)
} else if state.shuffling_context() && next.update == ContextType::Default { } else if state.shuffling_context() && next.update == ContextType::Default {
state.shuffle(None) state.shuffle_new()
} else if matches!(active_ctx, Ok(ctx) if ctx.index.track == 0) { } else if matches!(active_ctx, Ok(ctx) if ctx.index.track == 0) {
// has context, and context is not touched // has context, and context is not touched
// when the index is not zero, the next index was already evaluated elsewhere // when the index is not zero, the next index was already evaluated elsewhere

View file

@ -1287,7 +1287,7 @@ impl SpircTask {
if self.context_resolver.has_next() { if self.context_resolver.has_next() {
self.connect_state.update_queue_revision() self.connect_state.update_queue_revision()
} else { } else {
self.connect_state.shuffle(None)?; self.connect_state.shuffle_new()?;
self.add_autoplay_resolving_when_required(); self.add_autoplay_resolving_when_required();
} }
} else { } else {

View file

@ -13,7 +13,7 @@ impl ConnectState {
self.set_shuffle(shuffle); self.set_shuffle(shuffle);
if shuffle { if shuffle {
return self.shuffle(None); return self.shuffle_new();
} }
self.reset_context(ResetContext::DefaultIndex); self.reset_context(ResetContext::DefaultIndex);

View file

@ -50,7 +50,7 @@ impl ConnectState {
self.set_repeat_context(false); self.set_repeat_context(false);
} }
pub fn shuffle(&mut self, shuffle_state: Option<ShuffleState>) -> Result<(), Error> { fn validate_shuffle_allowed(&self) -> Result<(), Error> {
if let Some(reason) = self if let Some(reason) = self
.player() .player()
.restrictions .restrictions
@ -61,39 +61,39 @@ impl ConnectState {
action: "shuffle", action: "shuffle",
reason: reason.clone(), reason: reason.clone(),
})? })?
} else {
Ok(())
} }
}
pub fn shuffle_restore(&mut self, shuffle_state: ShuffleState) -> Result<(), Error> {
self.validate_shuffle_allowed()?;
self.shuffle(shuffle_state.seed, &shuffle_state.initial_track)
}
pub fn shuffle_new(&mut self) -> Result<(), Error> {
self.validate_shuffle_allowed()?;
let new_seed = rand::rng().random_range(100_000_000_000..1_000_000_000_000);
let current_track = self.current_track(|t| t.uri.clone());
self.shuffle(new_seed, &current_track)
}
fn shuffle(&mut self, seed: u64, initial_track: &str) -> Result<(), Error> {
self.clear_prev_track(); self.clear_prev_track();
self.clear_next_tracks(); self.clear_next_tracks();
let (seed, initial_track) = match shuffle_state {
Some(state) => (state.seed, Some(state.initial_track)),
None => (
rand::rng().random_range(100_000_000_000..1_000_000_000_000),
None,
),
};
let current_track = self.current_track(|t| t.uri.clone());
let first_track = initial_track.as_ref().unwrap_or(&current_track);
self.reset_context(ResetContext::DefaultIndex); self.reset_context(ResetContext::DefaultIndex);
let ctx = self.get_context_mut(ContextType::Default)?; let ctx = self.get_context_mut(ContextType::Default)?;
ctx.tracks ctx.tracks
.shuffle_with_seed(seed, |f| f.uri == *first_track); .shuffle_with_seed(seed, |f| f.uri == initial_track);
ctx.set_initial_track(first_track);
ctx.set_initial_track(initial_track);
ctx.set_shuffle_seed(seed); ctx.set_shuffle_seed(seed);
let start_at =
initial_track.and_then(|initial| ctx.tracks.iter().position(|t| t.uri == initial));
let start_at = start_at.unwrap_or_default();
self.update_current_index(|i| i.track = start_at as u32);
self.update_context_index(ContextType::Default, start_at + 1)?;
self.set_active_context(ContextType::Default);
self.fill_up_context = ContextType::Default;
self.fill_up_next_tracks()?; self.fill_up_next_tracks()?;
Ok(()) Ok(())

View file

@ -173,8 +173,10 @@ impl ConnectState {
self.set_current_track(current_index.unwrap_or_default())?; self.set_current_track(current_index.unwrap_or_default())?;
self.set_shuffle(true); self.set_shuffle(true);
let shuffle = self.transfer_shuffle.take(); match self.transfer_shuffle.take() {
self.shuffle(shuffle)?; None => self.shuffle_new(),
Some(state) => self.shuffle_restore(state),
}?
} else { } else {
self.reset_playback_to_position(current_index)?; self.reset_playback_to_position(current_index)?;
} }