summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs82
1 files changed, 81 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs
index 3ad8c05..d6ff5cf 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,7 +6,7 @@ use crossterm::{
};
use ratatui::{
backend::{Backend, CrosstermBackend},
- layout::{Constraint, Direction, Layout},
+ layout::{Constraint, Direction, Layout, Rect},
style::{Color, Modifier, Style},
text::{Line, Span},
widgets::{Block, Borders, List, ListItem, ListState, Paragraph},
@@ -119,6 +119,7 @@ fn run_app<B: Backend>(terminal: &mut Terminal<B>, app: &mut App) -> Result<()>
KeyCode::Char('j') | KeyCode::Down => app.next_episode(),
KeyCode::Char('k') | KeyCode::Up => app.previous_episode(),
KeyCode::Enter | KeyCode::Char(' ') => app.play_episode()?,
+ KeyCode::Char('m') => app.go_to_music_discovery(),
_ => {}
},
CurrentScreen::NowPlaying => match key.code {
@@ -134,6 +135,14 @@ fn run_app<B: Backend>(terminal: &mut Terminal<B>, app: &mut App) -> Result<()>
// 1-minute seeking
KeyCode::Char('L') => app.skip_forward_long()?,
KeyCode::Char('J') => app.skip_backward_long()?,
+ KeyCode::Char('m') => app.go_to_music_discovery(),
+ _ => {}
+ },
+ CurrentScreen::MusicDiscovery => match key.code {
+ KeyCode::Char('q') => return Ok(()),
+ KeyCode::Char('h') | KeyCode::Left | KeyCode::Esc => app.back_to_episodes(),
+ KeyCode::Char('j') | KeyCode::Down => app.next_genre(),
+ KeyCode::Char('k') | KeyCode::Up => app.previous_genre(),
_ => {}
},
}
@@ -142,6 +151,74 @@ fn run_app<B: Backend>(terminal: &mut Terminal<B>, app: &mut App) -> Result<()>
}
}
+fn render_music_discovery(f: &mut Frame, app: &App, area: Rect) {
+ let chunks = Layout::default()
+ .direction(Direction::Vertical)
+ .constraints([
+ Constraint::Length(3), // Title
+ Constraint::Length(4), // Genre selector
+ Constraint::Min(8), // Shows list
+ Constraint::Length(3), // Help
+ ])
+ .split(area);
+
+ // Title
+ let title = Paragraph::new("🎵 CJSW Music Discovery")
+ .style(Style::default().fg(Color::Green).add_modifier(Modifier::BOLD))
+ .block(Block::default().borders(Borders::ALL))
+ .alignment(ratatui::layout::Alignment::Center);
+ f.render_widget(title, chunks[0]);
+
+ // Genre selector
+ let genres = app.get_unique_genres();
+ let selected_genre = if genres.is_empty() {
+ "No genres available".to_string()
+ } else {
+ genres.get(app.selected_genre).unwrap_or(&"Unknown".to_string()).clone()
+ };
+
+ let genre_info = format!("Genre: {} ({}/{})", selected_genre, app.selected_genre + 1, genres.len());
+ let genre_widget = Paragraph::new(genre_info)
+ .style(Style::default().fg(Color::Yellow))
+ .block(Block::default().title("Browse Genres").borders(Borders::ALL));
+ f.render_widget(genre_widget, chunks[1]);
+
+ // Shows list
+ if !genres.is_empty() {
+ let shows = app.get_shows_by_genre(&selected_genre);
+ let show_items: Vec<ListItem> = shows
+ .iter()
+ .map(|show| {
+ ListItem::new(Line::from(vec![
+ Span::styled(&show.name, Style::default().fg(Color::White).add_modifier(Modifier::BOLD)),
+ Span::raw(" - "),
+ Span::styled(&show.time_slot, Style::default().fg(Color::Cyan)),
+ Span::raw(" - "),
+ Span::styled(&show.day, Style::default().fg(Color::Green)),
+ ]))
+ })
+ .collect();
+
+ let shows_list = List::new(show_items)
+ .block(Block::default().title(format!("{} Shows", selected_genre)).borders(Borders::ALL))
+ .style(Style::default().fg(Color::White));
+ f.render_widget(shows_list, chunks[2]);
+ } else {
+ let no_shows = Paragraph::new("No shows available")
+ .style(Style::default().fg(Color::DarkGray))
+ .block(Block::default().title("Shows").borders(Borders::ALL))
+ .alignment(ratatui::layout::Alignment::Center);
+ f.render_widget(no_shows, chunks[2]);
+ }
+
+ // Help
+ let help_text = "Navigation: j/k or ↑/↓ - browse genres | ESC/h - back | q - quit";
+ let help = Paragraph::new(help_text)
+ .style(Style::default().fg(Color::DarkGray))
+ .block(Block::default().title("Help").borders(Borders::ALL));
+ f.render_widget(help, chunks[3]);
+}
+
fn ui(f: &mut Frame, app: &App) {
let chunks = Layout::default()
.direction(Direction::Horizontal)
@@ -274,5 +351,8 @@ Navigation:
CurrentScreen::NowPlaying => {
podcast_ui::render_now_playing_enhanced(f, app, chunks[1]);
}
+ CurrentScreen::MusicDiscovery => {
+ render_music_discovery(f, app, chunks[1]);
+ }
}
}