diff --git a/src/infra/network/recommend.rs b/src/infra/network/recommend.rs index 1d56216d..034e1424 100644 --- a/src/infra/network/recommend.rs +++ b/src/infra/network/recommend.rs @@ -1,6 +1,7 @@ use super::Network; use crate::core::app::{ActiveBlock, RouteId, TrackTableContext}; use anyhow::anyhow; +use futures::future; use rspotify::model::{ enums::Country, idtypes::{ArtistId, TrackId}, @@ -48,7 +49,6 @@ impl RecommendationNetwork for Network { .await { Ok(recommendations) => { - let mut app = self.app.lock().await; // Convert SimplifiedTrack to FullTrack (best effort) // SimplifiedTrack doesn't have album field which FullTrack needs. // This is tricky. Recommendations usually return SimplifiedTracks. @@ -63,15 +63,12 @@ impl RecommendationNetwork for Network { .filter_map(|t| t.id.clone()) .collect(); - let mut full_tracks = Vec::new(); - if !track_ids.is_empty() { - for id in &track_ids { - if let Ok(track) = self.spotify.track(id.clone(), None).await { - full_tracks.push(track); - } - } - } + let fetch_futures = track_ids.into_iter().map(|id| self.spotify.track(id, None)); + let results = future::join_all(fetch_futures).await; + let full_tracks: Vec<_> = results.into_iter().filter_map(|res| res.ok()).collect(); + + let mut app = self.app.lock().await; app.track_table.tracks = full_tracks; // Prepend the seed track if available so user knows context