refactor: Added accessor methods to servarr_data structs, replaced for loops with functional iterator chains, eliminated mutable state tracking, and updated network module to use get_or_insert_default() for modal options
This commit is contained in:
+16
-15
@@ -57,42 +57,43 @@ impl App<'_> {
|
|||||||
let mut server_tabs = Vec::new();
|
let mut server_tabs = Vec::new();
|
||||||
|
|
||||||
if let Some(radarr_configs) = config.radarr {
|
if let Some(radarr_configs) = config.radarr {
|
||||||
let mut idx = 0;
|
let mut unnamed_idx = 0;
|
||||||
for radarr_config in radarr_configs {
|
let radarr_tabs = radarr_configs.into_iter().map(|radarr_config| {
|
||||||
let name = if let Some(name) = radarr_config.name.clone() {
|
let name = if let Some(name) = radarr_config.name.clone() {
|
||||||
name
|
name
|
||||||
} else {
|
} else {
|
||||||
idx += 1;
|
unnamed_idx += 1;
|
||||||
format!("Radarr {idx}")
|
format!("Radarr {unnamed_idx}")
|
||||||
};
|
};
|
||||||
|
|
||||||
server_tabs.push(TabRoute {
|
TabRoute {
|
||||||
title: name,
|
title: name,
|
||||||
route: ActiveRadarrBlock::Movies.into(),
|
route: ActiveRadarrBlock::Movies.into(),
|
||||||
contextual_help: None,
|
contextual_help: None,
|
||||||
config: Some(radarr_config),
|
config: Some(radarr_config),
|
||||||
});
|
}
|
||||||
}
|
});
|
||||||
|
server_tabs.extend(radarr_tabs);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(sonarr_configs) = config.sonarr {
|
if let Some(sonarr_configs) = config.sonarr {
|
||||||
let mut idx = 0;
|
let mut unnamed_idx = 0;
|
||||||
|
let sonarr_tabs = sonarr_configs.into_iter().map(|sonarr_config| {
|
||||||
for sonarr_config in sonarr_configs {
|
|
||||||
let name = if let Some(name) = sonarr_config.name.clone() {
|
let name = if let Some(name) = sonarr_config.name.clone() {
|
||||||
name
|
name
|
||||||
} else {
|
} else {
|
||||||
idx += 1;
|
unnamed_idx += 1;
|
||||||
format!("Sonarr {idx}")
|
format!("Sonarr {unnamed_idx}")
|
||||||
};
|
};
|
||||||
|
|
||||||
server_tabs.push(TabRoute {
|
TabRoute {
|
||||||
title: name,
|
title: name,
|
||||||
route: ActiveSonarrBlock::Series.into(),
|
route: ActiveSonarrBlock::Series.into(),
|
||||||
contextual_help: None,
|
contextual_help: None,
|
||||||
config: Some(sonarr_config),
|
config: Some(sonarr_config),
|
||||||
});
|
}
|
||||||
}
|
});
|
||||||
|
server_tabs.extend(sonarr_tabs);
|
||||||
}
|
}
|
||||||
|
|
||||||
let weight_sorted_tabs = server_tabs
|
let weight_sorted_tabs = server_tabs
|
||||||
|
|||||||
+1
-2
@@ -65,8 +65,7 @@ pub struct ScrollableText {
|
|||||||
|
|
||||||
impl ScrollableText {
|
impl ScrollableText {
|
||||||
pub fn with_string(item: String) -> ScrollableText {
|
pub fn with_string(item: String) -> ScrollableText {
|
||||||
let items: Vec<&str> = item.split('\n').collect();
|
let items: Vec<String> = item.split('\n').map(str::to_owned).collect();
|
||||||
let items: Vec<String> = items.iter().map(|it| it.to_string()).collect();
|
|
||||||
ScrollableText { items, offset: 0 }
|
ScrollableText { items, offset: 0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -90,18 +90,7 @@ impl From<&RadarrData<'_>> for EditIndexerModal {
|
|||||||
.into();
|
.into();
|
||||||
}
|
}
|
||||||
|
|
||||||
edit_indexer_modal.tags = tags
|
edit_indexer_modal.tags = radarr_data.tag_ids_to_display(tags).into();
|
||||||
.iter()
|
|
||||||
.map(|tag_id| {
|
|
||||||
radarr_data
|
|
||||||
.tags_map
|
|
||||||
.get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64"))
|
|
||||||
.expect("Tag ID must exist in tags map")
|
|
||||||
.clone()
|
|
||||||
})
|
|
||||||
.collect::<Vec<String>>()
|
|
||||||
.join(", ")
|
|
||||||
.into();
|
|
||||||
|
|
||||||
edit_indexer_modal
|
edit_indexer_modal
|
||||||
}
|
}
|
||||||
@@ -132,18 +121,7 @@ impl From<&RadarrData<'_>> for EditMovieModal {
|
|||||||
.minimum_availability_list
|
.minimum_availability_list
|
||||||
.set_items(Vec::from_iter(MinimumAvailability::iter()));
|
.set_items(Vec::from_iter(MinimumAvailability::iter()));
|
||||||
edit_movie_modal.path = path.clone().into();
|
edit_movie_modal.path = path.clone().into();
|
||||||
edit_movie_modal.tags = tags
|
edit_movie_modal.tags = radarr_data.tag_ids_to_display(tags).into();
|
||||||
.iter()
|
|
||||||
.map(|tag_id| {
|
|
||||||
radarr_data
|
|
||||||
.tags_map
|
|
||||||
.get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64"))
|
|
||||||
.expect("Tag ID must exist in tags map")
|
|
||||||
.clone()
|
|
||||||
})
|
|
||||||
.collect::<Vec<String>>()
|
|
||||||
.join(", ")
|
|
||||||
.into();
|
|
||||||
|
|
||||||
edit_movie_modal.monitored = Some(*monitored);
|
edit_movie_modal.monitored = Some(*monitored);
|
||||||
|
|
||||||
@@ -157,15 +135,9 @@ impl From<&RadarrData<'_>> for EditMovieModal {
|
|||||||
.state
|
.state
|
||||||
.select(minimum_availability_index);
|
.select(minimum_availability_index);
|
||||||
|
|
||||||
let mut quality_profile_names: Vec<String> = radarr_data
|
|
||||||
.quality_profile_map
|
|
||||||
.right_values()
|
|
||||||
.cloned()
|
|
||||||
.collect();
|
|
||||||
quality_profile_names.sort();
|
|
||||||
edit_movie_modal
|
edit_movie_modal
|
||||||
.quality_profile_list
|
.quality_profile_list
|
||||||
.set_items(quality_profile_names);
|
.set_items(radarr_data.sorted_quality_profile_names());
|
||||||
let quality_profile_name = radarr_data
|
let quality_profile_name = radarr_data
|
||||||
.quality_profile_map
|
.quality_profile_map
|
||||||
.get_by_left(quality_profile_id)
|
.get_by_left(quality_profile_id)
|
||||||
@@ -202,15 +174,9 @@ impl From<&RadarrData<'_>> for AddMovieModal {
|
|||||||
add_movie_modal
|
add_movie_modal
|
||||||
.minimum_availability_list
|
.minimum_availability_list
|
||||||
.set_items(Vec::from_iter(MinimumAvailability::iter()));
|
.set_items(Vec::from_iter(MinimumAvailability::iter()));
|
||||||
let mut quality_profile_names: Vec<String> = radarr_data
|
|
||||||
.quality_profile_map
|
|
||||||
.right_values()
|
|
||||||
.cloned()
|
|
||||||
.collect();
|
|
||||||
quality_profile_names.sort();
|
|
||||||
add_movie_modal
|
add_movie_modal
|
||||||
.quality_profile_list
|
.quality_profile_list
|
||||||
.set_items(quality_profile_names);
|
.set_items(radarr_data.sorted_quality_profile_names());
|
||||||
add_movie_modal
|
add_movie_modal
|
||||||
.root_folder_list
|
.root_folder_list
|
||||||
.set_items(radarr_data.root_folders.items.to_vec());
|
.set_items(radarr_data.root_folders.items.to_vec());
|
||||||
@@ -246,15 +212,9 @@ impl From<&RadarrData<'_>> for EditCollectionModal {
|
|||||||
edit_collection_modal
|
edit_collection_modal
|
||||||
.minimum_availability_list
|
.minimum_availability_list
|
||||||
.set_items(Vec::from_iter(MinimumAvailability::iter()));
|
.set_items(Vec::from_iter(MinimumAvailability::iter()));
|
||||||
let mut quality_profile_names: Vec<String> = radarr_data
|
|
||||||
.quality_profile_map
|
|
||||||
.right_values()
|
|
||||||
.cloned()
|
|
||||||
.collect();
|
|
||||||
quality_profile_names.sort();
|
|
||||||
edit_collection_modal
|
edit_collection_modal
|
||||||
.quality_profile_list
|
.quality_profile_list
|
||||||
.set_items(quality_profile_names);
|
.set_items(radarr_data.sorted_quality_profile_names());
|
||||||
|
|
||||||
let minimum_availability_index = edit_collection_modal
|
let minimum_availability_index = edit_collection_modal
|
||||||
.minimum_availability_list
|
.minimum_availability_list
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ use crate::models::{
|
|||||||
use crate::network::radarr_network::RadarrEvent;
|
use crate::network::radarr_network::RadarrEvent;
|
||||||
use bimap::BiMap;
|
use bimap::BiMap;
|
||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
|
use serde_json::Number;
|
||||||
use strum::EnumIter;
|
use strum::EnumIter;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@@ -81,6 +82,23 @@ impl RadarrData<'_> {
|
|||||||
self.movie_details_modal = None;
|
self.movie_details_modal = None;
|
||||||
self.movie_info_tabs.index = 0;
|
self.movie_info_tabs.index = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn tag_ids_to_display(&self, tag_ids: &[Number]) -> String {
|
||||||
|
tag_ids
|
||||||
|
.iter()
|
||||||
|
.filter_map(|tag_id| {
|
||||||
|
let id = tag_id.as_i64()?;
|
||||||
|
self.tags_map.get_by_left(&id).cloned()
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(", ")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn sorted_quality_profile_names(&self) -> Vec<String> {
|
||||||
|
let mut names: Vec<String> = self.quality_profile_map.right_values().cloned().collect();
|
||||||
|
names.sort();
|
||||||
|
names
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Default for RadarrData<'a> {
|
impl<'a> Default for RadarrData<'a> {
|
||||||
|
|||||||
@@ -45,24 +45,12 @@ impl From<&SonarrData<'_>> for AddSeriesModal {
|
|||||||
add_series_modal
|
add_series_modal
|
||||||
.series_type_list
|
.series_type_list
|
||||||
.set_items(Vec::from_iter(SeriesType::iter()));
|
.set_items(Vec::from_iter(SeriesType::iter()));
|
||||||
let mut quality_profile_names: Vec<String> = sonarr_data
|
|
||||||
.quality_profile_map
|
|
||||||
.right_values()
|
|
||||||
.cloned()
|
|
||||||
.collect();
|
|
||||||
quality_profile_names.sort();
|
|
||||||
add_series_modal
|
add_series_modal
|
||||||
.quality_profile_list
|
.quality_profile_list
|
||||||
.set_items(quality_profile_names);
|
.set_items(sonarr_data.sorted_quality_profile_names());
|
||||||
let mut language_profile_names: Vec<String> = sonarr_data
|
|
||||||
.language_profiles_map
|
|
||||||
.right_values()
|
|
||||||
.cloned()
|
|
||||||
.collect();
|
|
||||||
language_profile_names.sort();
|
|
||||||
add_series_modal
|
add_series_modal
|
||||||
.language_profile_list
|
.language_profile_list
|
||||||
.set_items(language_profile_names);
|
.set_items(sonarr_data.sorted_language_profile_names());
|
||||||
add_series_modal
|
add_series_modal
|
||||||
.root_folder_list
|
.root_folder_list
|
||||||
.set_items(sonarr_data.root_folders.items.to_vec());
|
.set_items(sonarr_data.root_folders.items.to_vec());
|
||||||
@@ -135,18 +123,7 @@ impl From<&SonarrData<'_>> for EditIndexerModal {
|
|||||||
.into();
|
.into();
|
||||||
}
|
}
|
||||||
|
|
||||||
edit_indexer_modal.tags = tags
|
edit_indexer_modal.tags = sonarr_data.tag_ids_to_display(tags).into();
|
||||||
.iter()
|
|
||||||
.map(|tag_id| {
|
|
||||||
sonarr_data
|
|
||||||
.tags_map
|
|
||||||
.get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64"))
|
|
||||||
.expect("Tag ID must exist in tags map")
|
|
||||||
.clone()
|
|
||||||
})
|
|
||||||
.collect::<Vec<String>>()
|
|
||||||
.join(", ")
|
|
||||||
.into();
|
|
||||||
|
|
||||||
edit_indexer_modal
|
edit_indexer_modal
|
||||||
}
|
}
|
||||||
@@ -181,18 +158,7 @@ impl From<&SonarrData<'_>> for EditSeriesModal {
|
|||||||
.series_type_list
|
.series_type_list
|
||||||
.set_items(Vec::from_iter(SeriesType::iter()));
|
.set_items(Vec::from_iter(SeriesType::iter()));
|
||||||
edit_series_modal.path = path.clone().into();
|
edit_series_modal.path = path.clone().into();
|
||||||
edit_series_modal.tags = tags
|
edit_series_modal.tags = sonarr_data.tag_ids_to_display(tags).into();
|
||||||
.iter()
|
|
||||||
.map(|tag_id| {
|
|
||||||
sonarr_data
|
|
||||||
.tags_map
|
|
||||||
.get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64"))
|
|
||||||
.expect("Tag ID must exist in tags map")
|
|
||||||
.clone()
|
|
||||||
})
|
|
||||||
.collect::<Vec<String>>()
|
|
||||||
.join(", ")
|
|
||||||
.into();
|
|
||||||
|
|
||||||
edit_series_modal.monitored = Some(*monitored);
|
edit_series_modal.monitored = Some(*monitored);
|
||||||
edit_series_modal.use_season_folders = Some(*season_folder);
|
edit_series_modal.use_season_folders = Some(*season_folder);
|
||||||
@@ -207,15 +173,9 @@ impl From<&SonarrData<'_>> for EditSeriesModal {
|
|||||||
.state
|
.state
|
||||||
.select(series_type_index);
|
.select(series_type_index);
|
||||||
|
|
||||||
let mut quality_profile_names: Vec<String> = sonarr_data
|
|
||||||
.quality_profile_map
|
|
||||||
.right_values()
|
|
||||||
.cloned()
|
|
||||||
.collect();
|
|
||||||
quality_profile_names.sort();
|
|
||||||
edit_series_modal
|
edit_series_modal
|
||||||
.quality_profile_list
|
.quality_profile_list
|
||||||
.set_items(quality_profile_names);
|
.set_items(sonarr_data.sorted_quality_profile_names());
|
||||||
let quality_profile_name = sonarr_data
|
let quality_profile_name = sonarr_data
|
||||||
.quality_profile_map
|
.quality_profile_map
|
||||||
.get_by_left(quality_profile_id)
|
.get_by_left(quality_profile_id)
|
||||||
@@ -229,15 +189,9 @@ impl From<&SonarrData<'_>> for EditSeriesModal {
|
|||||||
.quality_profile_list
|
.quality_profile_list
|
||||||
.state
|
.state
|
||||||
.select(quality_profile_index);
|
.select(quality_profile_index);
|
||||||
let mut language_profile_names: Vec<String> = sonarr_data
|
|
||||||
.language_profiles_map
|
|
||||||
.right_values()
|
|
||||||
.cloned()
|
|
||||||
.collect();
|
|
||||||
language_profile_names.sort();
|
|
||||||
edit_series_modal
|
edit_series_modal
|
||||||
.language_profile_list
|
.language_profile_list
|
||||||
.set_items(language_profile_names);
|
.set_items(sonarr_data.sorted_language_profile_names());
|
||||||
let language_profile_name = sonarr_data
|
let language_profile_name = sonarr_data
|
||||||
.language_profiles_map
|
.language_profiles_map
|
||||||
.get_by_left(language_profile_id)
|
.get_by_left(language_profile_id)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
use bimap::BiMap;
|
use bimap::BiMap;
|
||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
|
use serde_json::Number;
|
||||||
use strum::EnumIter;
|
use strum::EnumIter;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
@@ -87,6 +88,29 @@ impl SonarrData<'_> {
|
|||||||
self.seasons = StatefulTable::default();
|
self.seasons = StatefulTable::default();
|
||||||
self.series_info_tabs.index = 0;
|
self.series_info_tabs.index = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn tag_ids_to_display(&self, tag_ids: &[Number]) -> String {
|
||||||
|
tag_ids
|
||||||
|
.iter()
|
||||||
|
.filter_map(|tag_id| {
|
||||||
|
let id = tag_id.as_i64()?;
|
||||||
|
self.tags_map.get_by_left(&id).cloned()
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(", ")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn sorted_quality_profile_names(&self) -> Vec<String> {
|
||||||
|
let mut names: Vec<String> = self.quality_profile_map.right_values().cloned().collect();
|
||||||
|
names.sort();
|
||||||
|
names
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn sorted_language_profile_names(&self) -> Vec<String> {
|
||||||
|
let mut names: Vec<String> = self.language_profiles_map.right_values().cloned().collect();
|
||||||
|
names.sort();
|
||||||
|
names
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Default for SonarrData<'a> {
|
impl<'a> Default for SonarrData<'a> {
|
||||||
|
|||||||
@@ -225,26 +225,14 @@ impl Network<'_, '_> {
|
|||||||
.cloned()
|
.cloned()
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
if app.data.radarr_data.movie_details_modal.is_none() {
|
let modal = app
|
||||||
app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default());
|
.data
|
||||||
}
|
.radarr_data
|
||||||
|
.movie_details_modal
|
||||||
|
.get_or_insert_default();
|
||||||
|
|
||||||
app
|
modal.movie_cast.set_items(cast_vec);
|
||||||
.data
|
modal.movie_crew.set_items(crew_vec);
|
||||||
.radarr_data
|
|
||||||
.movie_details_modal
|
|
||||||
.as_mut()
|
|
||||||
.unwrap()
|
|
||||||
.movie_cast
|
|
||||||
.set_items(cast_vec);
|
|
||||||
app
|
|
||||||
.data
|
|
||||||
.radarr_data
|
|
||||||
.movie_details_modal
|
|
||||||
.as_mut()
|
|
||||||
.unwrap()
|
|
||||||
.movie_crew
|
|
||||||
.set_items(crew_vec);
|
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
@@ -452,16 +440,11 @@ impl Network<'_, '_> {
|
|||||||
let mut reversed_movie_history_vec = movie_history_vec.to_vec();
|
let mut reversed_movie_history_vec = movie_history_vec.to_vec();
|
||||||
reversed_movie_history_vec.reverse();
|
reversed_movie_history_vec.reverse();
|
||||||
|
|
||||||
if app.data.radarr_data.movie_details_modal.is_none() {
|
|
||||||
app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default())
|
|
||||||
}
|
|
||||||
|
|
||||||
app
|
app
|
||||||
.data
|
.data
|
||||||
.radarr_data
|
.radarr_data
|
||||||
.movie_details_modal
|
.movie_details_modal
|
||||||
.as_mut()
|
.get_or_insert_default()
|
||||||
.unwrap()
|
|
||||||
.movie_history
|
.movie_history
|
||||||
.set_items(reversed_movie_history_vec)
|
.set_items(reversed_movie_history_vec)
|
||||||
})
|
})
|
||||||
@@ -487,16 +470,11 @@ impl Network<'_, '_> {
|
|||||||
|
|
||||||
self
|
self
|
||||||
.handle_request::<(), Vec<RadarrRelease>>(request_props, |release_vec, mut app| {
|
.handle_request::<(), Vec<RadarrRelease>>(request_props, |release_vec, mut app| {
|
||||||
if app.data.radarr_data.movie_details_modal.is_none() {
|
|
||||||
app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default());
|
|
||||||
}
|
|
||||||
|
|
||||||
app
|
app
|
||||||
.data
|
.data
|
||||||
.radarr_data
|
.radarr_data
|
||||||
.movie_details_modal
|
.movie_details_modal
|
||||||
.as_mut()
|
.get_or_insert_default()
|
||||||
.unwrap()
|
|
||||||
.movie_releases
|
.movie_releases
|
||||||
.set_items(release_vec);
|
.set_items(release_vec);
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -307,29 +307,21 @@ impl Network<'_, '_> {
|
|||||||
|
|
||||||
self
|
self
|
||||||
.handle_request::<(), Vec<SonarrHistoryItem>>(request_props, |mut history_vec, mut app| {
|
.handle_request::<(), Vec<SonarrHistoryItem>>(request_props, |mut history_vec, mut app| {
|
||||||
if app.data.sonarr_data.series_history.is_none() {
|
let is_sorting = matches!(
|
||||||
app.data.sonarr_data.series_history = Some(StatefulTable::default());
|
|
||||||
}
|
|
||||||
|
|
||||||
if !matches!(
|
|
||||||
app.get_current_route(),
|
app.get_current_route(),
|
||||||
Route::Sonarr(ActiveSonarrBlock::SeriesHistorySortPrompt, _)
|
Route::Sonarr(ActiveSonarrBlock::SeriesHistorySortPrompt, _)
|
||||||
) {
|
);
|
||||||
|
|
||||||
|
let series_history = app
|
||||||
|
.data
|
||||||
|
.sonarr_data
|
||||||
|
.series_history
|
||||||
|
.get_or_insert_default();
|
||||||
|
|
||||||
|
if !is_sorting {
|
||||||
history_vec.sort_by(|a, b| a.id.cmp(&b.id));
|
history_vec.sort_by(|a, b| a.id.cmp(&b.id));
|
||||||
app
|
series_history.set_items(history_vec);
|
||||||
.data
|
series_history.apply_sorting_toggle(false);
|
||||||
.sonarr_data
|
|
||||||
.series_history
|
|
||||||
.as_mut()
|
|
||||||
.unwrap()
|
|
||||||
.set_items(history_vec);
|
|
||||||
app
|
|
||||||
.data
|
|
||||||
.sonarr_data
|
|
||||||
.series_history
|
|
||||||
.as_mut()
|
|
||||||
.unwrap()
|
|
||||||
.apply_sorting_toggle(false);
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
|
|||||||
@@ -101,22 +101,15 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
|||||||
.get_by_left(&movie.quality_profile_id)
|
.get_by_left(&movie.quality_profile_id)
|
||||||
.expect("Quality profile ID must exist in quality_profile_map")
|
.expect("Quality profile ID must exist in quality_profile_map")
|
||||||
.to_owned();
|
.to_owned();
|
||||||
let empty_tag = String::new();
|
let tags = movie
|
||||||
let tags = if !movie.tags.is_empty() {
|
.tags
|
||||||
movie
|
.iter()
|
||||||
.tags
|
.filter_map(|tag_id| {
|
||||||
.iter()
|
let id = tag_id.as_i64()?;
|
||||||
.map(|tag_id| {
|
tags_map.get_by_left(&id).cloned()
|
||||||
tags_map
|
})
|
||||||
.get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64"))
|
.collect::<Vec<_>>()
|
||||||
.unwrap_or(&empty_tag)
|
.join(", ");
|
||||||
.clone()
|
|
||||||
})
|
|
||||||
.collect::<Vec<String>>()
|
|
||||||
.join(", ")
|
|
||||||
} else {
|
|
||||||
String::new()
|
|
||||||
};
|
|
||||||
|
|
||||||
decorate_with_row_style(
|
decorate_with_row_style(
|
||||||
downloads_vec,
|
downloads_vec,
|
||||||
|
|||||||
@@ -112,22 +112,15 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
|||||||
.get_by_left(&series.language_profile_id)
|
.get_by_left(&series.language_profile_id)
|
||||||
.expect("Language profile ID must exist in language_profile_map")
|
.expect("Language profile ID must exist in language_profile_map")
|
||||||
.to_owned();
|
.to_owned();
|
||||||
let empty_tag = String::new();
|
let tags = series
|
||||||
let tags = if !series.tags.is_empty() {
|
.tags
|
||||||
series
|
.iter()
|
||||||
.tags
|
.filter_map(|tag_id| {
|
||||||
.iter()
|
let id = tag_id.as_i64()?;
|
||||||
.map(|tag_id| {
|
tags_map.get_by_left(&id).cloned()
|
||||||
tags_map
|
})
|
||||||
.get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64"))
|
.collect::<Vec<_>>()
|
||||||
.unwrap_or(&empty_tag)
|
.join(", ");
|
||||||
.clone()
|
|
||||||
})
|
|
||||||
.collect::<Vec<String>>()
|
|
||||||
.join(", ")
|
|
||||||
} else {
|
|
||||||
String::new()
|
|
||||||
};
|
|
||||||
|
|
||||||
decorate_series_row_with_style(
|
decorate_series_row_with_style(
|
||||||
series,
|
series,
|
||||||
|
|||||||
Reference in New Issue
Block a user