From 7ac5fdbaea7f7f89628971b5a600c721e4e838bb Mon Sep 17 00:00:00 2001 From: Victoria Fischer Date: Sun, 7 Jun 2026 08:24:37 +0200 Subject: [PATCH] scene: move mixxx playlist importing into the session --- src/main.rs | 25 ++++--------------------- src/scene.rs | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/main.rs b/src/main.rs index b09d2c5..380b924 100644 --- a/src/main.rs +++ b/src/main.rs @@ -467,28 +467,11 @@ impl App { fn reload_mixxx_playlist(&mut self) { // TODO: Should have some status message which states how many tracks are in the playlist - self.direction.current_playlist.clear(); - let connection = sqlite::Connection::open_thread_safe_with_flags("mixxxdb.sqlite", OpenFlags::new().with_read_only()).unwrap(); - let query = "SELECT id FROM Playlists WHERE name = ? ORDER BY id DESC LIMIT 1"; - let mut statement = connection.prepare(query).unwrap(); - statement.bind((1, format!("BFF.fm - Episode {}", self.direction.episode_number).as_str())).unwrap(); - statement.next().unwrap(); - let latest_id = statement.read::("id").unwrap(); - - let query = "SELECT title, artist, album, comment, url, bpm FROM library LEFT JOIN PlaylistTracks ON PlaylistTracks.track_id = library.id WHERE PlaylistTracks.playlist_id = ? ORDER BY position"; - for track in connection.prepare(query).unwrap().into_iter().bind((1, latest_id)).unwrap().map(|row| row.unwrap()) { - let title = track.try_read::<&str, _>("title").unwrap_or("Untitled Track"); - let artist = track.try_read::<&str, _>("artist").unwrap_or("Unknown Artist"); - let album = track.try_read::<&str, _>("album").unwrap_or("Unknown Album"); - let bpm = track.try_read::("bpm").unwrap_or(0.); - self.direction.current_playlist.push(PlaylistEntry { - artist: artist.into(), - album: album.into(), - title: title.into(), - bpm - }); + if let Err(err) = self.direction.reload_mixxx_playlist() { + self.next_actions.push(ConversationEntry::SystemMessage(format!("Error while loading mixxx playlist: {:?}", err))); + } else { + self.next_actions.push(ConversationEntry::SystemMessage(format!("Mixxx playlist reloaded. {} tracks found.", self.direction.current_playlist.len()).into())); } - self.next_actions.push(ConversationEntry::SystemMessage("Mixxx playlist reloaded.".into())); } } diff --git a/src/scene.rs b/src/scene.rs index 4999a68..f6b5997 100644 --- a/src/scene.rs +++ b/src/scene.rs @@ -56,6 +56,45 @@ pub struct StageDirection { pub current_playlist: Vec } +#[derive(Debug)] +pub enum MixxxError { + Sql(sqlite::Error) +} + +impl From for MixxxError { + fn from(value: sqlite::Error) -> Self { + Self::Sql(value) + } +} + +impl StageDirection { + pub fn reload_mixxx_playlist(&mut self) -> Result<(), MixxxError> { + self.current_playlist.clear(); + let connection = sqlite::Connection::open_thread_safe_with_flags("mixxxdb.sqlite", OpenFlags::new().with_read_only())?; + let query = "SELECT id FROM Playlists WHERE name = ? ORDER BY id DESC LIMIT 1"; + let mut statement = connection.prepare(query)?; + statement.bind((1, format!("BFF.fm - Episode {}", self.episode_number).as_str()))?; + statement.next()?; + let latest_id = statement.read::("id").unwrap(); + + let query = "SELECT title, artist, album, comment, url, bpm FROM library LEFT JOIN PlaylistTracks ON PlaylistTracks.track_id = library.id WHERE PlaylistTracks.playlist_id = ? ORDER BY position"; + for track in connection.prepare(query).unwrap().into_iter().bind((1, latest_id)).unwrap().map(|row| row.unwrap()) { + let title = track.try_read::<&str, _>("title").unwrap_or("Untitled Track"); + let artist = track.try_read::<&str, _>("artist").unwrap_or("Unknown Artist"); + let album = track.try_read::<&str, _>("album").unwrap_or("Unknown Album"); + let bpm = track.try_read::("bpm").unwrap_or(0.); + self.current_playlist.push(PlaylistEntry { + artist: artist.into(), + album: album.into(), + title: title.into(), + bpm + }); + } + + Ok(()) + } +} + #[derive(Debug, Default, Clone)] pub struct StageActions { pub direction: StageDirection,