diff --git a/src/app/context_clues.rs b/src/app/context_clues.rs index 32a6463..7f83a5c 100644 --- a/src/app/context_clues.rs +++ b/src/app/context_clues.rs @@ -14,15 +14,11 @@ pub fn build_context_clue_string(context_clues: &[(KeyBinding, &str)]) -> String .join(" | ") } -pub static SERVARR_CONTEXT_CLUES: [ContextClue; 3] = [ +pub static SERVARR_CONTEXT_CLUES: [ContextClue; 2] = [ ( DEFAULT_KEYBINDINGS.next_servarr, DEFAULT_KEYBINDINGS.next_servarr.desc, ), - ( - DEFAULT_KEYBINDINGS.previous_servarr, - DEFAULT_KEYBINDINGS.previous_servarr.desc, - ), (DEFAULT_KEYBINDINGS.quit, DEFAULT_KEYBINDINGS.quit.desc), ]; diff --git a/src/app/context_clues_tests.rs b/src/app/context_clues_tests.rs index 0e9fdaa..962f071 100644 --- a/src/app/context_clues_tests.rs +++ b/src/app/context_clues_tests.rs @@ -33,11 +33,6 @@ mod test { let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.previous_servarr); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.previous_servarr.desc); - - let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.quit); assert_str_eq!(*description, DEFAULT_KEYBINDINGS.quit.desc); assert_eq!(servarr_context_clues_iter.next(), None); diff --git a/src/handlers/sonarr_handlers/library/library_handler_tests.rs b/src/handlers/sonarr_handlers/library/library_handler_tests.rs index ddd9444..d09fd6a 100644 --- a/src/handlers/sonarr_handlers/library/library_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/library_handler_tests.rs @@ -15,7 +15,7 @@ mod tests { ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, EPISODE_DETAILS_BLOCKS, LIBRARY_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, }; - use crate::models::sonarr_models::{Series, SeriesStatus, SeriesType}; + use crate::models::sonarr_models::{Series, SeriesStatistics, SeriesStatus, SeriesType}; use crate::test_handler_delegation; mod test_handle_delete { @@ -826,13 +826,32 @@ mod tests { assert_str_eq!(sort_option.name, "Language"); } + #[test] + fn test_series_sorting_options_size() { + let expected_cmp_fn: fn(&Series, &Series) -> Ordering = |a, b| { + a.statistics + .as_ref() + .map_or(0, |stats| stats.size_on_disk) + .cmp(&b.statistics.as_ref().map_or(0, |stats| stats.size_on_disk)) + }; + let mut expected_series_vec = series_vec(); + expected_series_vec.sort_by(expected_cmp_fn); + + let sort_option = series_sorting_options()[8].clone(); + let mut sorted_series_vec = series_vec(); + sorted_series_vec.sort_by(sort_option.cmp_fn.unwrap()); + + assert_eq!(sorted_series_vec, expected_series_vec); + assert_str_eq!(sort_option.name, "Size"); + } + #[test] fn test_series_sorting_options_monitored() { let expected_cmp_fn: fn(&Series, &Series) -> Ordering = |a, b| a.monitored.cmp(&b.monitored); let mut expected_series_vec = series_vec(); expected_series_vec.sort_by(expected_cmp_fn); - let sort_option = series_sorting_options()[8].clone(); + let sort_option = series_sorting_options()[9].clone(); let mut sorted_series_vec = series_vec(); sorted_series_vec.sort_by(sort_option.cmp_fn.unwrap()); @@ -861,7 +880,7 @@ mod tests { let mut expected_series_vec = series_vec(); expected_series_vec.sort_by(expected_cmp_fn); - let sort_option = series_sorting_options()[9].clone(); + let sort_option = series_sorting_options()[10].clone(); let mut sorted_series_vec = series_vec(); sorted_series_vec.sort_by(sort_option.cmp_fn.unwrap()); @@ -973,6 +992,10 @@ mod tests { certification: Some("TV-MA".to_owned()), series_type: SeriesType::Daily, tags: vec![1.into(), 2.into()], + statistics: Some(SeriesStatistics { + size_on_disk: 789, + ..SeriesStatistics::default() + }), ..Series::default() }, Series { @@ -988,6 +1011,10 @@ mod tests { certification: Some("TV-PG".to_owned()), series_type: SeriesType::Anime, tags: vec![1.into(), 3.into()], + statistics: Some(SeriesStatistics { + size_on_disk: 456, + ..SeriesStatistics::default() + }), ..Series::default() }, Series { diff --git a/src/handlers/sonarr_handlers/library/mod.rs b/src/handlers/sonarr_handlers/library/mod.rs index 99529a0..5ab3a6f 100644 --- a/src/handlers/sonarr_handlers/library/mod.rs +++ b/src/handlers/sonarr_handlers/library/mod.rs @@ -302,6 +302,15 @@ fn series_sorting_options() -> Vec> { name: "Language", cmp_fn: Some(|a, b| a.language_profile_id.cmp(&b.language_profile_id)), }, + SortOption { + name: "Size", + cmp_fn: Some(|a, b| { + a.statistics + .as_ref() + .map_or(0, |stats| stats.size_on_disk) + .cmp(&b.statistics.as_ref().map_or(0, |stats| stats.size_on_disk)) + }), + }, SortOption { name: "Monitored", cmp_fn: Some(|a, b| a.monitored.cmp(&b.monitored)), diff --git a/src/ui/sonarr_ui/library/mod.rs b/src/ui/sonarr_ui/library/mod.rs index 3edd34f..d583c0b 100644 --- a/src/ui/sonarr_ui/library/mod.rs +++ b/src/ui/sonarr_ui/library/mod.rs @@ -12,6 +12,7 @@ use crate::ui::widgets::{ confirmation_prompt::ConfirmationPrompt, popup::{Popup, Size}, }; +use crate::utils::convert_to_gb; use crate::{ app::App, models::{ @@ -104,6 +105,10 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { let monitored = if series.monitored { "🏷" } else { "" }; let certification = series.certification.clone().unwrap_or_default(); let network = series.network.clone().unwrap_or_default(); + let size = series + .statistics + .as_ref() + .map_or(0f64, |stats| convert_to_gb(stats.size_on_disk)); let quality_profile = quality_profile_map .get_by_left(&series.quality_profile_id) .unwrap() @@ -140,6 +145,7 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { Cell::from(series.series_type.to_display_str()), Cell::from(quality_profile), Cell::from(language_profile), + Cell::from(format!("{size:.2} GB")), Cell::from(monitored.to_owned()), Cell::from(tags), ]), @@ -162,19 +168,21 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { "Rating", "Type", "Quality Profile", - "Language Profile", + "Language", + "Size", "Monitored", "Tags", ]) .constraints([ - Constraint::Percentage(23), + Constraint::Percentage(20), Constraint::Percentage(4), Constraint::Percentage(14), Constraint::Percentage(6), Constraint::Percentage(6), Constraint::Percentage(6), - Constraint::Percentage(13), - Constraint::Percentage(10), + Constraint::Percentage(11), + Constraint::Percentage(8), + Constraint::Percentage(7), Constraint::Percentage(6), Constraint::Percentage(12), ]);