From 1db02768905c226688b9840cc5408abfa1f1e84f Mon Sep 17 00:00:00 2001 From: Daniel Hauser Date: Tue, 15 Apr 2025 17:59:07 +0200 Subject: [PATCH] Fix: handle empty playlist images from API response --- src/api/api_models.rs | 6 +++--- .../playlist_details/playlist_details.rs | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/api/api_models.rs b/src/api/api_models.rs index a7de9ea5..d348f72f 100644 --- a/src/api/api_models.rs +++ b/src/api/api_models.rs @@ -173,7 +173,7 @@ trait WithImages { .map(|image| (criterion(image), image)) .collect::>(); - ords.sort_by(|a, b| (a.0).partial_cmp(&b.0).unwrap()); + ords.sort_by(|a, b| (a.0).partial_cmp(&b.0).unwrap_or(std::cmp::Ordering::Equal)); Some(ords.first()?.1) } @@ -186,7 +186,7 @@ trait WithImages { pub struct Playlist { pub id: String, pub name: String, - pub images: Vec, + pub images: Option>, pub tracks: Page, pub owner: PlaylistOwner, } @@ -199,7 +199,7 @@ pub struct PlaylistOwner { impl WithImages for Playlist { fn images(&self) -> &[Image] { - &self.images + self.images.as_deref().unwrap_or_default() } } diff --git a/src/app/components/playlist_details/playlist_details.rs b/src/app/components/playlist_details/playlist_details.rs index 636e426f..ac68cc32 100644 --- a/src/app/components/playlist_details/playlist_details.rs +++ b/src/app/components/playlist_details/playlist_details.rs @@ -129,6 +129,10 @@ impl PlaylistDetailsWidget { self.imp().header_widget.set_playing(is_playing); } + fn set_fallback_artwork(&self) { + self.imp().header_widget.imp().playlist_art.set_icon_name(Some("audio-x-generic-symbolic")); + } + fn set_artwork(&self, art: &gdk_pixbuf::Pixbuf) { self.imp().header_widget.set_artwork(art); } @@ -270,7 +274,7 @@ impl PlaylistDetails { } } - fn update_details(&self) { + fn update_details(&mut self) { if let Some(info) = self.model.get_playlist_info() { let title = &info.title[..]; let owner = &info.owner.display_name[..]; @@ -279,17 +283,22 @@ impl PlaylistDetails { self.widget.set_info(title, owner); if let Some(art_url) = art_url.cloned() { - let widget = self.widget.downgrade(); + let widget_clone = self.widget.downgrade(); self.worker.send_local_task(async move { let pixbuf = ImageLoader::new() .load_remote(&art_url[..], "jpg", 320, 320) .await; - if let (Some(widget), Some(ref pixbuf)) = (widget.upgrade(), pixbuf) { - widget.set_artwork(pixbuf); + if let Some(widget) = widget_clone.upgrade() { + if let Some(ref pixbuf) = pixbuf { + widget.set_artwork(pixbuf); + } else { + widget.set_fallback_artwork(); + } widget.set_loaded(); } }); } else { + self.widget.set_fallback_artwork(); self.widget.set_loaded(); } }