feat(blacklist): filter playlist suggestions by artist

Phase 2 (part 2) - Suggestions integration:
- Filter SuggestedTrack results by artist_id
- Log filtered count for debugging

cc
This commit is contained in:
vicrodh committed 2026-02-02 13:10:36 -06:00
1 parent bec6907dbe
commit bd4c9b7792
1 file changed
+25 -4
+25 -4
View File
@@ -6,6 +6,7 @@ use std::collections::HashSet;
use std::sync::Arc; use std::sync::Arc;
use tauri::State; use tauri::State;
use crate::artist_blacklist::BlacklistState;
use crate::artist_vectors::{ use crate::artist_vectors::{
ArtistVectorBuilder, ArtistVectorStoreState, RelationshipWeights, StoreStats, ArtistVectorBuilder, ArtistVectorStoreState, RelationshipWeights, StoreStats,
SuggestionConfig, SuggestionResult, SuggestionsEngine, SuggestionConfig, SuggestionResult, SuggestionsEngine,
@@ -44,6 +45,7 @@ pub async fn get_playlist_suggestions_v2(
store_state: State<'_, ArtistVectorStoreState>, store_state: State<'_, ArtistVectorStoreState>,
mb_state: State<'_, MusicBrainzSharedState>, mb_state: State<'_, MusicBrainzSharedState>,
app_state: State<'_, AppState>, app_state: State<'_, AppState>,
blacklist_state: State<'_, BlacklistState>,
) -> Result<SuggestionResult, String> { ) -> Result<SuggestionResult, String> {
use std::time::Instant; use std::time::Instant;
let total_start = Instant::now(); let total_start = Instant::now();
@@ -193,8 +195,8 @@ pub async fn get_playlist_suggestions_v2(
let engine_elapsed = engine_start.elapsed(); let engine_elapsed = engine_start.elapsed();
let total_elapsed = total_start.elapsed(); let total_elapsed = total_start.elapsed();
match &result { match result {
Ok(r) => { Ok(mut r) => {
log::info!( log::info!(
"[Suggestions] Engine took {:?}, total {:?}. Result: {} tracks from {} similar artists", "[Suggestions] Engine took {:?}, total {:?}. Result: {} tracks from {} similar artists",
engine_elapsed, engine_elapsed,
@@ -202,13 +204,32 @@ pub async fn get_playlist_suggestions_v2(
r.tracks.len(), r.tracks.len(),
r.similar_artists_count r.similar_artists_count
); );
// Filter out tracks from blacklisted artists
let original_count = r.tracks.len();
r.tracks.retain(|track| {
if let Some(artist_id) = track.artist_id {
!blacklist_state.is_blacklisted(artist_id)
} else {
true // Keep tracks without artist ID
}
});
let filtered_count = original_count - r.tracks.len();
if filtered_count > 0 {
log::info!(
"[Suggestions] Filtered {} tracks from blacklisted artists",
filtered_count
);
}
Ok(r)
} }
Err(e) => { Err(e) => {
log::error!("[Suggestions] Engine failed after {:?}: {}", engine_elapsed, e); log::error!("[Suggestions] Engine failed after {:?}: {}", engine_elapsed, e);
Err(e)
} }
} }
result
} }
/// Get store statistics for debugging /// Get store statistics for debugging