diff --git a/src/app/radarr.rs b/src/app/radarr.rs index 25b3eb5..210ca9e 100644 --- a/src/app/radarr.rs +++ b/src/app/radarr.rs @@ -297,10 +297,13 @@ impl App { self.check_for_prompt_action().await; } ActiveRadarrBlock::ManualSearch => { - self.is_loading = true; - self - .dispatch_network_event(RadarrEvent::GetReleases.into()) - .await; + if self.data.radarr_data.movie_releases.items.is_empty() { + self.is_loading = true; + self + .dispatch_network_event(RadarrEvent::GetReleases.into()) + .await; + } + self.check_for_prompt_action().await; } _ => (), diff --git a/src/main.rs b/src/main.rs index 799d842..83d129d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -53,13 +53,7 @@ async fn main() -> Result<()> { #[tokio::main] async fn start_networking(mut network_rx: Receiver, app: &Arc>) { - let network = Network::new( - reqwest::Client::builder() - .timeout(Duration::from_secs(45)) - .build() - .unwrap(), - app, - ); + let network = Network::new(reqwest::Client::new(), app); while let Some(network_event) = network_rx.recv().await { network.handle_network_event(network_event).await; diff --git a/src/models/mod.rs b/src/models/mod.rs index 5038bd8..084017a 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -252,7 +252,15 @@ impl Display for HorizontallyScrollableText { if *self.offset.borrow() == 0 { write!(f, "{}", self.text) } else { - write!(f, "{}", &self.text[*self.offset.borrow()..]) + let text_vec = self.text.chars().collect::>(); + write!( + f, + "{}", + text_vec[*self.offset.borrow()..] + .iter() + .cloned() + .collect::() + ) } } } diff --git a/src/models/radarr_models.rs b/src/models/radarr_models.rs index d0207ba..c262db0 100644 --- a/src/models/radarr_models.rs +++ b/src/models/radarr_models.rs @@ -222,7 +222,7 @@ pub struct Release { #[derivative(Default(value = "Number::from(0)"))] pub age: Number, pub title: HorizontallyScrollableText, - pub indexer: HorizontallyScrollableText, + pub indexer: String, #[derivative(Default(value = "Number::from(0)"))] pub size: Number, pub rejected: bool, diff --git a/src/ui/radarr_ui/add_movie_ui.rs b/src/ui/radarr_ui/add_movie_ui.rs index a0de545..4782853 100644 --- a/src/ui/radarr_ui/add_movie_ui.rs +++ b/src/ui/radarr_ui/add_movie_ui.rs @@ -64,7 +64,7 @@ fn draw_add_movie_search(f: &mut Frame<'_, B>, app: &mut App, area: let search_paragraph = Paragraph::new(Text::from(block_content)) .style(style_default()) - .block(title_block_centered(" Add Movie ")); + .block(title_block_centered("Add Movie")); if let Route::Radarr(active_radarr_block) = app.get_current_route().clone() { match active_radarr_block { @@ -239,7 +239,7 @@ fn draw_select_quality_profile_popup( } fn draw_confirmation_prompt(f: &mut Frame<'_, B>, app: &mut App, prompt_area: Rect) { - let title = " Confirm Add Movie? "; + let title = "Confirm Add Movie?"; let prompt = format!( "{}:\n\n{}", app diff --git a/src/ui/radarr_ui/mod.rs b/src/ui/radarr_ui/mod.rs index f4935f4..affbf32 100644 --- a/src/ui/radarr_ui/mod.rs +++ b/src/ui/radarr_ui/mod.rs @@ -34,7 +34,7 @@ mod collection_details_ui; mod movie_details_ui; pub(super) fn draw_radarr_ui(f: &mut Frame<'_, B>, app: &mut App, area: Rect) { - let (content_rect, _) = draw_tabs(f, area, " Movies ", &app.data.radarr_data.main_tabs); + let (content_rect, _) = draw_tabs(f, area, "Movies", &app.data.radarr_data.main_tabs); if let Route::Radarr(active_radarr_block) = app.get_current_route().clone() { match active_radarr_block { @@ -173,7 +173,7 @@ fn draw_delete_movie_prompt(f: &mut Frame<'_, B>, app: &mut App, pro draw_prompt_box( f, prompt_area, - " Confirm Delete Movie? ", + "Confirm Delete Movie?", format!( "Do you really want to delete: {}?", app.data.radarr_data.movies.current_selection().title @@ -187,7 +187,7 @@ fn draw_delete_download_prompt(f: &mut Frame<'_, B>, app: &mut App, draw_prompt_box( f, prompt_area, - " Confirm Cancel Download? ", + "Confirm Cancel Download?", format!( "Do you really want to delete this download: {}?", app.data.radarr_data.downloads.current_selection().title diff --git a/src/ui/radarr_ui/movie_details_ui.rs b/src/ui/radarr_ui/movie_details_ui.rs index c9f12a4..f87c344 100644 --- a/src/ui/radarr_ui/movie_details_ui.rs +++ b/src/ui/radarr_ui/movie_details_ui.rs @@ -55,6 +55,7 @@ fn draw_movie_info(f: &mut Frame<'_, B>, app: &mut App, area: Rect) ActiveRadarrBlock::MovieHistory => draw_movie_history(f, app, area), ActiveRadarrBlock::Cast => draw_movie_cast(f, app, area), ActiveRadarrBlock::Crew => draw_movie_crew(f, app, area), + ActiveRadarrBlock::ManualSearch => draw_movie_releases(f, app, area), _ => (), } } @@ -64,7 +65,7 @@ fn draw_search_movie_prompt(f: &mut Frame<'_, B>, app: &mut App, pro draw_prompt_box( f, prompt_area, - " Confirm Search Movie? ", + "Confirm Search Movie?", format!( "Do you want to trigger an automatic search of your indexers for the movie: {}?", app.data.radarr_data.movies.current_selection().title @@ -82,7 +83,7 @@ fn draw_refresh_and_scan_prompt( draw_prompt_box( f, prompt_area, - " Confirm Refresh and Scan? ", + "Confirm Refresh and Scan?", format!( "Do you want to trigger a refresh and disk scan for the movie: {}?", app.data.radarr_data.movies.current_selection().title @@ -334,12 +335,12 @@ fn draw_movie_releases(f: &mut Frame<'_, B>, app: &mut App, content_ constraints: vec![ Constraint::Length(8), Constraint::Length(10), - Constraint::Length(1), - Constraint::Percentage(40), - Constraint::Percentage(10), - Constraint::Length(8), - Constraint::Length(8), - Constraint::Percentage(10), + Constraint::Length(4), + Constraint::Percentage(30), + Constraint::Percentage(18), + Constraint::Length(12), + Constraint::Length(12), + Constraint::Percentage(7), Constraint::Percentage(10), ], table_headers: vec![ @@ -360,14 +361,15 @@ fn draw_movie_releases(f: &mut Frame<'_, B>, app: &mut App, content_ quality, .. } = release; - let age = format!("{} days", age.as_u64().unwrap()); + let age = format!("{} days", age.as_u64().unwrap_or(0)); title.scroll_or_reset(get_width(content_area), current_selection == *release); - indexer.scroll_or_reset(get_width(content_area), current_selection == *release); let size = convert_to_gb(size.as_u64().unwrap()); let rejected_str = if *rejected { "⛔" } else { "" }; let seeders = seeders.as_u64().unwrap(); let leechers = leechers.as_u64().unwrap(); - let peers = format!("{} / {}", seeders, leechers); + let mut peers = Text::from(format!("{} / {}", seeders, leechers)); + peers.patch_style(determine_peer_style(seeders, leechers)); + let language = if languages.is_some() { languages.clone().unwrap()[0].name.clone() } else { @@ -378,11 +380,11 @@ fn draw_movie_releases(f: &mut Frame<'_, B>, app: &mut App, content_ Row::new(vec![ Cell::from(protocol.clone()), Cell::from(age), - Cell::from(rejected_str).style(determine_style_from_rejection(*rejected)), + Cell::from(rejected_str), Cell::from(title.to_string()), - Cell::from(indexer.to_string()), - Cell::from(format!("{} GB", size)), - Cell::from(peers).style(determine_peer_style(seeders, leechers)), + Cell::from(indexer.clone()), + Cell::from(format!("{:.1} GB", size)), + Cell::from(peers), Cell::from(language), Cell::from(quality), ]) @@ -401,14 +403,6 @@ fn determine_style_from_download_status(download_status: &str) -> Style { } } -fn determine_style_from_rejection(rejected: bool) -> Style { - if rejected { - style_failure() - } else { - style_primary() - } -} - fn determine_peer_style(seeders: u64, leechers: u64) -> Style { if seeders == 0 { style_failure() diff --git a/src/ui/utils.rs b/src/ui/utils.rs index b8c0ce3..823863b 100644 --- a/src/ui/utils.rs +++ b/src/ui/utils.rs @@ -165,7 +165,7 @@ pub fn style_button_highlight(is_selected: bool) -> Style { } pub fn title_style(title: &str) -> Span<'_> { - Span::styled(title, style_bold()) + Span::styled(format!(" {} ", title), style_bold()) } pub fn title_block(title: &str) -> Block<'_> {