From 76631126de5f554d78aa85cf1090ffb28f32c053 Mon Sep 17 00:00:00 2001 From: Ethan Girouard Date: Tue, 23 Jul 2024 23:32:26 -0400 Subject: [PATCH] Add Song/SongData conversions --- src/songdata.rs | 67 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/songdata.rs b/src/songdata.rs index 52ed37a..6bd6f22 100644 --- a/src/songdata.rs +++ b/src/songdata.rs @@ -28,3 +28,70 @@ pub struct SongData { /// For example, `"/assets/images/Song.jpg"` pub image_path: String, } + +#[cfg(feature = "ssr")] +impl TryInto for Song { + type Error = Box; + + /// Convert a Song object into a SongData object + /// + /// This conversion is expensive, as it requires database queries to get the artist and album objects. + /// The SongData/Song conversions are also not truly reversible, + /// due to the way the image_path, album, and artist data is handled. + fn try_into(self) -> Result { + let mut db_con = database::get_db_conn(); + + let album = self.get_album(&mut db_con)?; + + // Use the song's image path if it exists, otherwise use the album's image path, or fallback to the placeholder + let image_path = self.image_path.clone().unwrap_or_else(|| { + album + .as_ref() + .and_then(|album| album.image_path.clone()) + .unwrap_or_else(|| "/assets/images/placeholder.jpg".to_string()) + }); + + Ok(SongData { + id: self.id.ok_or("Song id must be present (Some) to convert to SongData")?, + title: self.title.clone(), + artists: self.get_artists(&mut db_con)?, + album: album, + track: self.track, + duration: self.duration, + release_date: self.release_date, + // TODO https://gitlab.mregirouard.com/libretunes/libretunes/-/issues/35 + song_path: self.storage_path, + image_path: image_path, + }) + } +} + +impl TryInto for SongData { + type Error = Box; + + /// Convert a SongData object into a Song object + /// + /// The SongData/Song conversions are also not truly reversible, + /// due to the way the image_path, album, and and artist data is handled. + fn try_into(self) -> Result { + Ok(Song { + id: Some(self.id), + title: self.title, + album_id: self.album.map(|album| + album.id.ok_or("Album id must be present (Some) to convert to Song")).transpose()?, + track: self.track, + duration: self.duration, + release_date: self.release_date, + // TODO https://gitlab.mregirouard.com/libretunes/libretunes/-/issues/35 + storage_path: self.song_path, + + // Note that if the source of the image_path was the album, the image_path + // will be set to the album's image_path instead of None + image_path: if self.image_path == "/assets/images/placeholder.jpg" { + None + } else { + Some(self.image_path) + }, + }) + } +}