From 0a2a09eb3c65fae81e862148aaf28f504bb22bef Mon Sep 17 00:00:00 2001 From: Victoria Fischer Date: Tue, 16 Jun 2026 11:29:48 +0200 Subject: [PATCH] scene: stagedirection: switch to a generic playlist name based interface to mixxx, instead of PWM episode numbers --- src/prediction.rs | 16 +++++----------- src/scene/mod.rs | 4 ++-- src/ui.rs | 8 ++++++-- src/widgets.rs | 2 +- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/prediction.rs b/src/prediction.rs index 2d7f2e2..46f8d2b 100644 --- a/src/prediction.rs +++ b/src/prediction.rs @@ -16,7 +16,7 @@ const SYSTEM_PROMPT: &str = include_str!("system-prompt.txt"); #[derive(Debug, Clone)] pub enum PredictionAction { ConversationAppend(ConversationEntry), - SetEpisodeNumber(u32), + SetPlaylist(String), GeneratePredictions, SetNarrative(String), SetShowEndTime(DateTime) @@ -417,19 +417,13 @@ pub async fn start_prediction(saved_session: SaveData, mut messages: tokio::sync do_regen }, - PredictionAction::SetEpisodeNumber(num) => { - session.direction.episode_number = num; - match MixxxDB::load(num) { + PredictionAction::SetPlaylist(playlist_name) => { + match MixxxDB::load(&playlist_name) { Err(err) => log::info!("Failed to load mixxx playlist: {:?}.", err), Ok(playlist) => { - for track in &playlist { - if let Some(merge_target) = session.scenery.artifacts.iter_mut().find(|a| { *a == track }) { - merge_target.merge(track.clone()); - } else { - session.scenery.artifacts.push(track.clone()); - } - } + session.scenery.artifacts.merge(playlist.clone()); session.scenery.current_playlist = playlist; + session.direction.playlist = playlist_name; log::info!("Mixxx playlist reloaded."); } } diff --git a/src/scene/mod.rs b/src/scene/mod.rs index 40f8218..f4f6263 100644 --- a/src/scene/mod.rs +++ b/src/scene/mod.rs @@ -7,7 +7,7 @@ pub mod conversation; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct StageDirection { - pub episode_number: u32, + pub playlist: String, #[serde(skip)] #[serde(default="StageDirection::default_end_time")] pub end_time: DateTime, @@ -27,7 +27,7 @@ impl StageDirection { impl Default for StageDirection { fn default() -> Self { Self { - episode_number: 0, + playlist: Default::default(), end_time: Self::default_end_time(), narrative: Default::default(), } diff --git a/src/ui.rs b/src/ui.rs index 3375c9c..ef1b3cb 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -145,13 +145,17 @@ impl Ui { match command { // FIXME: Need some new kind of /bandcamp command to force loading of specific urls "/episode" => { - if let Ok(episode_number) = arg.trim().parse() { - self.predictions.insert(PredictionAction::SetEpisodeNumber(episode_number)).await; + if let Ok(episode_number) = arg.trim().parse::() { + let playlist_name = format!("BFF.fm - Episode {}", episode_number); + self.predictions.insert(PredictionAction::SetPlaylist(playlist_name)).await; } else { log::error!("Invalid episode number format. Use /episode [number]"); return; } }, + "/playlist" => { + self.predictions.insert(PredictionAction::SetPlaylist(arg.trim().to_string())).await; + } "/timer" => { if let Ok(minutes) = arg.trim().parse::() { let end_time = Utc::now() + Duration::minutes(minutes); diff --git a/src/widgets.rs b/src/widgets.rs index 82d1828..9c1ad24 100644 --- a/src/widgets.rs +++ b/src/widgets.rs @@ -173,7 +173,7 @@ impl Widget for StatusBar<'_> { }; let status_line = Line::from_iter([ - Span::from(format!("Episode {}", self.0.direction().episode_number)).style(ratatui::style::Color::LightBlue), + Span::from(format!("Playlist: {}", self.0.direction().playlist)).style(ratatui::style::Color::LightBlue), Span::from(" | ").style(ratatui::style::Color::DarkGray), Span::from(format!("{} tracks", self.0.scenery().current_playlist.len())).style(ratatui::style::Color::LightBlue), Span::from(" | ").style(ratatui::style::Color::DarkGray),