diff --git a/src/app/sonarr/mod.rs b/src/app/sonarr/mod.rs index d8ae5fb..30f042a 100644 --- a/src/app/sonarr/mod.rs +++ b/src/app/sonarr/mod.rs @@ -65,12 +65,6 @@ impl<'a> App<'a> { } } ActiveSonarrBlock::EpisodeDetails | ActiveSonarrBlock::EpisodeFile => { - self - .dispatch_network_event(SonarrEvent::GetEpisodes(None).into()) - .await; - self - .dispatch_network_event(SonarrEvent::GetDownloads.into()) - .await; self .dispatch_network_event(SonarrEvent::GetEpisodeDetails(None).into()) .await; diff --git a/src/app/sonarr/sonarr_tests.rs b/src/app/sonarr/sonarr_tests.rs index 35245ef..df7b438 100644 --- a/src/app/sonarr/sonarr_tests.rs +++ b/src/app/sonarr/sonarr_tests.rs @@ -176,14 +176,6 @@ mod tests { .await; assert!(app.is_loading); - assert_eq!( - sync_network_rx.recv().await.unwrap(), - SonarrEvent::GetEpisodes(None).into() - ); - assert_eq!( - sync_network_rx.recv().await.unwrap(), - SonarrEvent::GetDownloads.into() - ); assert_eq!( sync_network_rx.recv().await.unwrap(), SonarrEvent::GetEpisodeDetails(None).into() @@ -201,14 +193,6 @@ mod tests { .await; assert!(app.is_loading); - assert_eq!( - sync_network_rx.recv().await.unwrap(), - SonarrEvent::GetEpisodes(None).into() - ); - assert_eq!( - sync_network_rx.recv().await.unwrap(), - SonarrEvent::GetDownloads.into() - ); assert_eq!( sync_network_rx.recv().await.unwrap(), SonarrEvent::GetEpisodeDetails(None).into() diff --git a/src/ui/sonarr_ui/library/episode_details_ui.rs b/src/ui/sonarr_ui/library/episode_details_ui.rs index ea3d7eb..d9d526b 100644 --- a/src/ui/sonarr_ui/library/episode_details_ui.rs +++ b/src/ui/sonarr_ui/library/episode_details_ui.rs @@ -226,7 +226,7 @@ fn draw_file_info(f: &mut Frame<'_>, app: &App<'_>, area: Rect) { f.render_widget(video_details_title_paragraph, video_details_title_area); f.render_widget(video_details_paragraph, video_details_area); } - _ => (), + _ => f.render_widget(layout_block_top_border(), area), }, _ => f.render_widget( LoadingBlock::new(app.is_loading, layout_block_top_border()), diff --git a/src/ui/sonarr_ui/library/library_ui_tests.rs b/src/ui/sonarr_ui/library/library_ui_tests.rs index a3d9847..a3c082b 100644 --- a/src/ui/sonarr_ui/library/library_ui_tests.rs +++ b/src/ui/sonarr_ui/library/library_ui_tests.rs @@ -1,6 +1,9 @@ #[cfg(test)] mod tests { - use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS}; + use crate::models::servarr_data::sonarr::sonarr_data::{ + ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, + EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, + }; use crate::models::{ servarr_data::sonarr::sonarr_data::LIBRARY_BLOCKS, sonarr_models::SeriesStatus, }; @@ -36,14 +39,24 @@ mod tests { }); } + #[test] + fn test_decorate_row_with_style_unmonitored() { + let series = Series::default(); + let row = Row::new(vec![Cell::from("test".to_owned())]); + + let style = decorate_series_row_with_style(&series, row.clone()); + + assert_eq!(style, row.unmonitored()); + } + #[test] fn test_decorate_row_with_style_downloaded_when_ended_and_all_monitored_episodes_are_present() { let seasons = vec![ Season { monitored: false, statistics: SeasonStatistics { - episode_count: 1, - total_episode_count: 3, + episode_file_count: 1, + episode_count: 3, ..SeasonStatistics::default() }, ..Season::default() @@ -51,14 +64,15 @@ mod tests { Season { monitored: true, statistics: SeasonStatistics { + episode_file_count: 3, episode_count: 3, - total_episode_count: 3, ..SeasonStatistics::default() }, ..Season::default() }, ]; let series = Series { + monitored: true, status: SeriesStatus::Ended, seasons: Some(seasons), ..Series::default() @@ -76,8 +90,8 @@ mod tests { Season { monitored: true, statistics: SeasonStatistics { - episode_count: 1, - total_episode_count: 3, + episode_file_count: 1, + episode_count: 3, ..SeasonStatistics::default() }, ..Season::default() @@ -85,14 +99,15 @@ mod tests { Season { monitored: true, statistics: SeasonStatistics { + episode_file_count: 3, episode_count: 3, - total_episode_count: 3, ..SeasonStatistics::default() }, ..Season::default() }, ]; let series = Series { + monitored: true, status: SeriesStatus::Ended, seasons: Some(seasons), ..Series::default() @@ -107,6 +122,7 @@ mod tests { #[test] fn test_decorate_row_with_style_indeterminate_when_ended_and_seasons_is_empty() { let series = Series { + monitored: true, status: SeriesStatus::Ended, ..Series::default() }; @@ -124,8 +140,8 @@ mod tests { Season { monitored: false, statistics: SeasonStatistics { - episode_count: 1, - total_episode_count: 3, + episode_file_count: 1, + episode_count: 3, ..SeasonStatistics::default() }, ..Season::default() @@ -133,14 +149,15 @@ mod tests { Season { monitored: true, statistics: SeasonStatistics { + episode_file_count: 3, episode_count: 3, - total_episode_count: 3, ..SeasonStatistics::default() }, ..Season::default() }, ]; let series = Series { + monitored: true, status: SeriesStatus::Continuing, seasons: Some(seasons), ..Series::default() @@ -158,8 +175,8 @@ mod tests { Season { monitored: true, statistics: SeasonStatistics { - episode_count: 1, - total_episode_count: 3, + episode_file_count: 1, + episode_count: 3, ..SeasonStatistics::default() }, ..Season::default() @@ -167,14 +184,15 @@ mod tests { Season { monitored: true, statistics: SeasonStatistics { + episode_file_count: 3, episode_count: 3, - total_episode_count: 3, ..SeasonStatistics::default() }, ..Season::default() }, ]; let series = Series { + monitored: true, status: SeriesStatus::Continuing, seasons: Some(seasons), ..Series::default() @@ -189,6 +207,7 @@ mod tests { #[test] fn test_decorate_row_with_style_indeterminate_when_continuing_and_seasons_is_empty() { let series = Series { + monitored: true, status: SeriesStatus::Continuing, ..Series::default() }; @@ -202,6 +221,7 @@ mod tests { #[test] fn test_decorate_row_with_style_unreleased_when_upcoming() { let series = Series { + monitored: true, status: SeriesStatus::Upcoming, ..Series::default() }; @@ -215,6 +235,7 @@ mod tests { #[test] fn test_decorate_row_with_style_defaults_to_indeterminate() { let series = Series { + monitored: true, status: SeriesStatus::Deleted, ..Series::default() }; diff --git a/src/ui/sonarr_ui/library/mod.rs b/src/ui/sonarr_ui/library/mod.rs index b805488..a29ec77 100644 --- a/src/ui/sonarr_ui/library/mod.rs +++ b/src/ui/sonarr_ui/library/mod.rs @@ -32,11 +32,11 @@ mod delete_series_ui; mod edit_series_ui; mod series_details_ui; +mod episode_details_ui; #[cfg(test)] #[path = "library_ui_tests.rs"] mod library_ui_tests; mod season_details_ui; -mod episode_details_ui; pub(super) struct LibraryUi; @@ -192,20 +192,24 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { } fn decorate_series_row_with_style<'a>(series: &Series, row: Row<'a>) -> Row<'a> { + if !series.monitored { + return row.unmonitored(); + } + match series.status { SeriesStatus::Ended => { if let Some(ref seasons) = series.seasons { return if seasons .iter() .filter(|season| season.monitored) - .all(|season| season.statistics.episode_count == season.statistics.total_episode_count) + .all(|season| season.statistics.episode_file_count == season.statistics.episode_count) { row.downloaded() } else { row.missing() - } - } - + }; + } + row.indeterminate() } SeriesStatus::Continuing => { @@ -213,7 +217,7 @@ fn decorate_series_row_with_style<'a>(series: &Series, row: Row<'a>) -> Row<'a> return if seasons .iter() .filter(|season| season.monitored) - .all(|season| season.statistics.episode_count == season.statistics.total_episode_count) + .all(|season| season.statistics.episode_file_count == season.statistics.episode_count) { row.unreleased() } else { diff --git a/src/ui/sonarr_ui/library/series_details_ui.rs b/src/ui/sonarr_ui/library/series_details_ui.rs index 159440b..911aa44 100644 --- a/src/ui/sonarr_ui/library/series_details_ui.rs +++ b/src/ui/sonarr_ui/library/series_details_ui.rs @@ -1,3 +1,4 @@ +use chrono::Utc; use deunicode::deunicode; use ratatui::layout::{Alignment, Constraint, Layout, Rect}; use ratatui::style::{Style, Stylize}; @@ -12,6 +13,7 @@ use crate::models::sonarr_models::{ Season, SeasonStatistics, SonarrHistoryEventType, SonarrHistoryItem, }; use crate::models::{EnumDisplayStyle, Route}; +use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi; use crate::ui::sonarr_ui::library::season_details_ui::SeasonDetailsUi; use crate::ui::sonarr_ui::sonarr_ui_utils::{ create_download_failed_history_event_details, @@ -30,7 +32,6 @@ use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::message::Message; use crate::ui::widgets::popup::{Popup, Size}; use crate::ui::{draw_popup, draw_tabs, DrawUi}; -use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi; use crate::utils::convert_to_gb; #[cfg(test)] @@ -42,7 +43,9 @@ pub(super) struct SeriesDetailsUi; impl DrawUi for SeriesDetailsUi { fn accepts(route: Route) -> bool { if let Route::Sonarr(active_sonarr_block, _) = route { - return SeasonDetailsUi::accepts(route) || EpisodeDetailsUi::accepts(route) || SERIES_DETAILS_BLOCKS.contains(&active_sonarr_block); + return SeasonDetailsUi::accepts(route) + || EpisodeDetailsUi::accepts(route) + || SERIES_DETAILS_BLOCKS.contains(&active_sonarr_block); } false @@ -239,9 +242,10 @@ fn draw_seasons_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .. } = season; let SeasonStatistics { + episode_file_count, episode_count, - total_episode_count, size_on_disk, + next_airing, .. } = statistics; let season_monitored = if season.monitored { "🏷" } else { "" }; @@ -250,13 +254,19 @@ fn draw_seasons_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { let row = Row::new(vec![ Cell::from(season_monitored.to_owned()), Cell::from(title.clone().unwrap()), - Cell::from(format!("{}/{}", episode_count, total_episode_count)), + Cell::from(format!("{}/{}", episode_file_count, episode_count)), Cell::from(format!("{size:.2} GB")), ]); - if episode_count == total_episode_count { + if episode_file_count == episode_count { row.downloaded() } else if !monitored { row.unmonitored() + } else if let Some(next_airing_utc) = next_airing.as_ref() { + if next_airing_utc > &Utc::now() { + return row.unreleased(); + } else { + return row.missing(); + } } else { row.missing() }