Added similarity search feature

This commit is contained in:
Aleksandr Bogomiakov
2026-08-10 00:37:50 +01:00
parent 03f74cc91e
commit e95d2e7fe1
5 changed files with 171 additions and 128 deletions
+26 -1
View File
@@ -382,7 +382,7 @@ pub fn update(state: &mut AppState, action: Action) -> Option<Effect> {
open_track_info(state, tracks, "no track selected")
}
Action::OpenCurrentTrackInfo => {
let tracks = state.player.current.clone().into_iter().collect();
let tracks = current_track_for_info(state).into_iter().collect();
open_track_info(state, tracks, "nothing playing")
}
Action::RemoveFromQueue => remove_selected_from_queue(state),
@@ -460,6 +460,31 @@ pub fn update(state: &mut AppState, action: Action) -> Option<Effect> {
}
}
/// Prefer the queue's current entry because it may have been enriched or
/// replaced with a durable local track after streaming started. The player
/// keeps its original lightweight entry while that stream is active.
fn current_track_for_info(state: &AppState) -> Option<TrackItem> {
let current = state.player.current.as_ref()?;
let current_key = super::state::track_key(current);
let queued_at_position = state.player.queue.get(state.player.queue_pos);
queued_at_position
.filter(|queued| {
super::state::track_key(queued) == current_key
|| queued.id == current.id
|| current.is_fed_pending()
})
.or_else(|| {
state
.player
.queue
.iter()
.find(|queued| super::state::track_key(queued) == current_key)
})
.cloned()
.or_else(|| Some(current.clone()))
}
fn track_info_needs_fed_metadata(track: &TrackItem) -> bool {
track.fed.is_some()
&& (track.featured_artists.is_empty()
+11 -2
View File
@@ -571,9 +571,15 @@ fn current_track_info_uses_now_playing_track() {
active_tab: Tab::Queue,
..AppState::default()
};
state.player.queue = vec![test_track(1), test_track(2)];
let mut complete = test_track(2);
complete.audio_format = Some("flac".into());
complete.audio_bitrate = Some(921);
state.player.queue = vec![test_track(1), complete];
state.player.queue_pos = 1;
state.queue_tab.cursor = 0;
state.player.current = Some(test_track(2));
let mut lightweight = test_track(2);
lightweight.file_path.clear();
state.player.current = Some(lightweight);
assert_eq!(update(&mut state, Action::OpenCurrentTrackInfo), None);
match &state.popup {
@@ -582,6 +588,9 @@ fn current_track_info_uses_now_playing_track() {
tracks.iter().map(|track| track.id).collect::<Vec<_>>(),
vec![2]
);
assert_eq!(tracks[0].file_path, "/s/2");
assert_eq!(tracks[0].audio_format.as_deref(), Some("flac"));
assert_eq!(tracks[0].audio_bitrate, Some(921));
}
other => panic!("expected track info popup, got {other:?}"),
}