From 082f4b22fde3671863951749c1ea0233ccfb506c Mon Sep 17 00:00:00 2001 From: rlpratyoosh Date: Sat, 9 May 2026 20:36:13 +0530 Subject: [PATCH 1/2] fix: prevent UI freeze when searching for recommendations Instead of taking app lock before API fetch, taking it after fixes the issue --- src/infra/network/recommend.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/infra/network/recommend.rs b/src/infra/network/recommend.rs index 1d56216d..c23d7291 100644 --- a/src/infra/network/recommend.rs +++ b/src/infra/network/recommend.rs @@ -48,7 +48,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. @@ -72,6 +71,7 @@ impl RecommendationNetwork for Network { } } + let mut app = self.app.lock().await; app.track_table.tracks = full_tracks; // Prepend the seed track if available so user knows context From c38ddbea598c78f5a1734a1f51259511bfed4094 Mon Sep 17 00:00:00 2001 From: rlpratyoosh Date: Sat, 9 May 2026 20:44:28 +0530 Subject: [PATCH 2/2] perf: reduce network latency in full track fetch Replaced sequential N+1 API calls with future::join_all to execute track requests concurrently, dropping latency from appprox 10s to approx 4s --- src/infra/network/recommend.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/infra/network/recommend.rs b/src/infra/network/recommend.rs index c23d7291..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}, @@ -62,14 +63,10 @@ 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;