feat(network): Support for fetching all Sonarr language profiles

This commit is contained in:
2024-11-24 11:34:09 -07:00
parent c8a2fea9cd
commit 5ed278ec9c
12 changed files with 311 additions and 60 deletions
@@ -959,6 +959,7 @@ mod tests {
id: 3,
source_title: "test 1".to_owned(),
languages: vec![Language {
id: 1,
name: "telgu".to_owned(),
}],
quality: QualityWrapper {
@@ -967,6 +968,7 @@ mod tests {
},
},
custom_formats: Some(vec![Language {
id: 2,
name: "nikki".to_owned(),
}]),
date: DateTime::from(DateTime::parse_from_rfc3339("2024-01-10T07:28:45Z").unwrap()),
@@ -979,6 +981,7 @@ mod tests {
id: 2,
source_title: "test 2".to_owned(),
languages: vec![Language {
id: 3,
name: "chinese".to_owned(),
}],
quality: QualityWrapper {
@@ -988,9 +991,11 @@ mod tests {
},
custom_formats: Some(vec![
Language {
id: 4,
name: "alex".to_owned(),
},
Language {
id: 5,
name: "English".to_owned(),
},
]),
@@ -1004,6 +1009,7 @@ mod tests {
id: 1,
source_title: "test 3".to_owned(),
languages: vec![Language {
id: 1,
name: "english".to_owned(),
}],
quality: QualityWrapper {
@@ -1012,6 +1018,7 @@ mod tests {
},
},
custom_formats: Some(vec![Language {
id: 2,
name: "English".to_owned(),
}]),
date: DateTime::from(DateTime::parse_from_rfc3339("2024-03-10T07:28:45Z").unwrap()),
@@ -1807,6 +1807,7 @@ mod tests {
id: 3,
title: "test 1".into(),
original_language: Language {
id: 1,
name: "English".to_owned(),
},
size_on_disk: 1024,
@@ -1823,6 +1824,7 @@ mod tests {
id: 2,
title: "test 2".into(),
original_language: Language {
id: 2,
name: "Chinese".to_owned(),
},
size_on_disk: 2048,
@@ -1839,6 +1841,7 @@ mod tests {
id: 1,
title: "test 3".into(),
original_language: Language {
id: 3,
name: "Japanese".to_owned(),
},
size_on_disk: 512,
@@ -561,6 +561,7 @@ fn releases_sorting_options() -> Vec<SortOption<RadarrRelease>> {
name: "Language",
cmp_fn: Some(|a, b| {
let default_language_vec = vec![Language {
id: 1,
name: "_".to_owned(),
}];
let language_a = &a.languages.as_ref().unwrap_or(&default_language_vec)[0];
@@ -1987,6 +1987,7 @@ mod tests {
fn test_releases_sorting_options_language() {
let expected_cmp_fn: fn(&RadarrRelease, &RadarrRelease) -> Ordering = |a, b| {
let default_language_vec = vec![Language {
id: 1,
name: "_".to_owned(),
}];
let language_a = &a.languages.as_ref().unwrap_or(&default_language_vec)[0];
@@ -2191,6 +2192,7 @@ mod tests {
rejected: true,
seeders: Some(Number::from(1)),
languages: Some(vec![Language {
id: 1,
name: "Language A".to_owned(),
}]),
quality: QualityWrapper {
@@ -2209,6 +2211,7 @@ mod tests {
rejected: false,
seeders: Some(Number::from(2)),
languages: Some(vec![Language {
id: 2,
name: "Language B".to_owned(),
}]),
quality: QualityWrapper {
@@ -31,6 +31,7 @@ pub struct SonarrData {
pub indexer_settings: Option<IndexerSettings>,
pub indexer_test_all_results: Option<StatefulTable<IndexerTestResultModalItem>>,
pub indexer_test_error: Option<String>,
pub language_profiles_map: BiMap<i64, String>,
pub logs: StatefulList<HorizontallyScrollableText>,
pub quality_profile_map: BiMap<i64, String>,
pub queued_events: StatefulTable<QueueEvent>,
@@ -67,6 +68,7 @@ impl Default for SonarrData {
indexer_settings: None,
indexer_test_error: None,
indexer_test_all_results: None,
language_profiles_map: BiMap::new(),
logs: StatefulList::default(),
quality_profile_map: BiMap::new(),
queued_events: StatefulTable::default(),
@@ -59,6 +59,7 @@ mod tests {
assert!(sonarr_data.indexer_settings.is_none());
assert!(sonarr_data.indexer_test_error.is_none());
assert!(sonarr_data.indexer_test_all_results.is_none());
assert!(sonarr_data.language_profiles_map.is_empty());
assert!(sonarr_data.logs.is_empty());
assert!(sonarr_data.quality_profile_map.is_empty());
assert!(sonarr_data.queued_events.is_empty());
+2
View File
@@ -136,6 +136,8 @@ pub struct IndexerField {
#[derive(Serialize, Deserialize, Default, Debug, Clone, PartialEq, Eq, Ord, PartialOrd)]
pub struct Language {
#[serde(deserialize_with = "super::from_i64")]
pub id: i64,
pub name: String,
}
+89
View File
@@ -22,6 +22,28 @@ use super::{
#[path = "sonarr_models_tests.rs"]
mod sonarr_models_tests;
#[derive(Default, Clone, Serialize, Debug, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct AddSeriesBody {
pub tvdb_id: i64,
pub title: String,
pub root_folder_path: String,
pub quality_profile_id: i64,
pub series_type: SeriesType,
pub season_folder: bool,
pub language_profile_id: i64,
pub tags: Vec<i64>,
pub add_options: AddSeriesOptions,
}
#[derive(Default, Clone, Serialize, Debug, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct AddSeriesOptions {
pub monitor: SeriesMonitor,
pub search_for_cutoff_unmet_episodes: bool,
pub search_for_missing_episodes: bool,
}
#[derive(Default, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct BlocklistItem {
@@ -231,6 +253,71 @@ pub struct Series {
pub seasons: Option<Vec<Season>>,
}
#[derive(
Serialize, Deserialize, Default, PartialEq, Eq, Clone, Copy, Debug, EnumIter, ValueEnum,
)]
#[serde(rename_all = "camelCase")]
pub enum SeriesMonitor {
Unknown,
#[default]
All,
Future,
Missing,
Existing,
FirstSeason,
LastSeason,
LatestSeason,
Pilot,
Recent,
MonitorSpecials,
UnmonitorSpecials,
None,
Skip,
}
impl Display for SeriesMonitor {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
let series_monitor = match self {
SeriesMonitor::Unknown => "unknown",
SeriesMonitor::All => "all",
SeriesMonitor::Future => "future",
SeriesMonitor::Missing => "missing",
SeriesMonitor::Existing => "existing",
SeriesMonitor::FirstSeason => "firstSeason",
SeriesMonitor::LastSeason => "lastSeason",
SeriesMonitor::LatestSeason => "latestSeason",
SeriesMonitor::Pilot => "pilot",
SeriesMonitor::Recent => "recent",
SeriesMonitor::MonitorSpecials => "monitorSpecials",
SeriesMonitor::UnmonitorSpecials => "unmonitorSpecials",
SeriesMonitor::None => "none",
SeriesMonitor::Skip => "skip",
};
write!(f, "{series_monitor}")
}
}
impl<'a> EnumDisplayStyle<'a> for SeriesMonitor {
fn to_display_str(self) -> &'a str {
match self {
SeriesMonitor::Unknown => "Unknown",
SeriesMonitor::All => "All Episodes",
SeriesMonitor::Future => "Future Episodes",
SeriesMonitor::Missing => "Missing Episodes",
SeriesMonitor::Existing => "Existing Episodes",
SeriesMonitor::FirstSeason => "Only First Season",
SeriesMonitor::LastSeason => "Only Last Season",
SeriesMonitor::LatestSeason => "Only Latest Season",
SeriesMonitor::Pilot => "Pilot Episode",
SeriesMonitor::Recent => "Recent Episodes",
SeriesMonitor::MonitorSpecials => "Only Specials",
SeriesMonitor::UnmonitorSpecials => "Not Specials",
SeriesMonitor::None => "None",
SeriesMonitor::Skip => "Skip",
}
}
}
#[derive(
Serialize, Deserialize, Default, PartialEq, Eq, Clone, Copy, Debug, EnumIter, ValueEnum,
)]
@@ -494,6 +581,7 @@ pub enum SonarrSerdeable {
IndexerSettings(IndexerSettings),
Indexers(Vec<Indexer>),
IndexerTestResults(Vec<IndexerTestResult>),
LanguageProfiles(Vec<Language>),
LogResponse(LogResponse),
QualityProfiles(Vec<QualityProfile>),
QueueEvents(Vec<QueueEvent>),
@@ -535,6 +623,7 @@ serde_enum_from!(
IndexerSettings(IndexerSettings),
Indexers(Vec<Indexer>),
IndexerTestResults(Vec<IndexerTestResult>),
LanguageProfiles(Vec<Language>),
LogResponse(LogResponse),
QualityProfiles(Vec<QualityProfile>),
QueueEvents(Vec<QueueEvent>),
+85 -4
View File
@@ -6,13 +6,13 @@ mod tests {
use crate::models::{
radarr_models::IndexerTestResult,
servarr_models::{
DiskSpace, HostConfig, Indexer, Log, LogResponse, QualityProfile, QueueEvent, RootFolder,
SecurityConfig, Tag, Update,
DiskSpace, HostConfig, Indexer, Language, Log, LogResponse, QualityProfile, QueueEvent,
RootFolder, SecurityConfig, Tag, Update,
},
sonarr_models::{
BlocklistItem, BlocklistResponse, DownloadRecord, DownloadsResponse, Episode,
IndexerSettings, Series, SeriesStatus, SeriesType, SonarrHistoryEventType, SonarrHistoryItem,
SonarrRelease, SonarrSerdeable, SonarrTask, SonarrTaskName, SystemStatus,
IndexerSettings, Series, SeriesMonitor, SeriesStatus, SeriesType, SonarrHistoryEventType,
SonarrHistoryItem, SonarrRelease, SonarrSerdeable, SonarrTask, SonarrTaskName, SystemStatus,
},
EnumDisplayStyle, Serdeable,
};
@@ -28,6 +28,66 @@ mod tests {
assert_str_eq!(episode.to_string(), "Test Title");
}
#[test]
fn test_series_monitor_display() {
assert_str_eq!(SeriesMonitor::Unknown.to_string(), "unknown");
assert_str_eq!(SeriesMonitor::All.to_string(), "all");
assert_str_eq!(SeriesMonitor::Future.to_string(), "future");
assert_str_eq!(SeriesMonitor::Missing.to_string(), "missing");
assert_str_eq!(SeriesMonitor::Existing.to_string(), "existing");
assert_str_eq!(SeriesMonitor::FirstSeason.to_string(), "firstSeason");
assert_str_eq!(SeriesMonitor::LastSeason.to_string(), "lastSeason");
assert_str_eq!(SeriesMonitor::LatestSeason.to_string(), "latestSeason");
assert_str_eq!(SeriesMonitor::Pilot.to_string(), "pilot");
assert_str_eq!(SeriesMonitor::Recent.to_string(), "recent");
assert_str_eq!(
SeriesMonitor::MonitorSpecials.to_string(),
"monitorSpecials"
);
assert_str_eq!(
SeriesMonitor::UnmonitorSpecials.to_string(),
"unmonitorSpecials"
);
assert_str_eq!(SeriesMonitor::None.to_string(), "none");
assert_str_eq!(SeriesMonitor::Skip.to_string(), "skip");
}
#[test]
fn test_series_monitor_to_display_str() {
assert_str_eq!(SeriesMonitor::Unknown.to_display_str(), "Unknown");
assert_str_eq!(SeriesMonitor::All.to_display_str(), "All Episodes");
assert_str_eq!(SeriesMonitor::Future.to_display_str(), "Future Episodes");
assert_str_eq!(SeriesMonitor::Missing.to_display_str(), "Missing Episodes");
assert_str_eq!(
SeriesMonitor::Existing.to_display_str(),
"Existing Episodes"
);
assert_str_eq!(
SeriesMonitor::FirstSeason.to_display_str(),
"Only First Season"
);
assert_str_eq!(
SeriesMonitor::LastSeason.to_display_str(),
"Only Last Season"
);
assert_str_eq!(
SeriesMonitor::LatestSeason.to_display_str(),
"Only Latest Season"
);
assert_str_eq!(SeriesMonitor::Pilot.to_display_str(), "Pilot Episode");
assert_str_eq!(SeriesMonitor::Recent.to_display_str(), "Recent Episodes");
assert_str_eq!(
SeriesMonitor::MonitorSpecials.to_display_str(),
"Only Specials"
);
assert_str_eq!(
SeriesMonitor::UnmonitorSpecials.to_display_str(),
"Not Specials"
);
assert_str_eq!(SeriesMonitor::None.to_display_str(), "None");
assert_str_eq!(SeriesMonitor::Skip.to_display_str(), "Skip");
}
#[test]
fn test_series_status_display() {
assert_str_eq!(SeriesStatus::Continuing.to_string(), "continuing");
@@ -312,6 +372,27 @@ mod tests {
assert_eq!(sonarr_serdeable, SonarrSerdeable::DiskSpaces(disk_spaces));
}
#[test]
fn test_sonarr_serdeable_from_language_profiles() {
let language_profiles = vec![
Language {
id: 1,
name: "English".to_owned(),
},
Language {
id: 2,
name: "Japanese".to_owned(),
},
];
let sonarr_serdeable: SonarrSerdeable = language_profiles.clone().into();
assert_eq!(
sonarr_serdeable,
SonarrSerdeable::LanguageProfiles(language_profiles)
);
}
#[test]
fn test_sonarr_serdeable_from_log_response() {
let log_response = LogResponse {
+22 -19
View File
@@ -34,6 +34,7 @@ mod test {
"title": "Test",
"tmdbId": 1234,
"originalLanguage": {
"id": 1,
"name": "English"
},
"sizeOnDisk": 3543348019,
@@ -499,7 +500,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "HD - 1080p" }}
}]);
let (async_server, app_arc, _server) = mock_servarr_api(
@@ -559,7 +560,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "HD - 1080p" }}
}]);
let (async_server, app_arc, _server) = mock_servarr_api(
@@ -607,7 +608,7 @@ mod test {
let add_movie_search_result_json = json!([{
"tmdbId": 1234,
"title": "Test",
"originalLanguage": { "name": "English" },
"originalLanguage": { "id": 1, "name": "English" },
"status": "released",
"overview": "New movie blah blah blah",
"genres": ["cool", "family", "fun"],
@@ -672,7 +673,7 @@ mod test {
let add_movie_search_result_json = json!([{
"tmdbId": 1234,
"title": "Test",
"originalLanguage": { "name": "English" },
"originalLanguage": { "id": 1, "name": "English" },
"status": "released",
"overview": "New movie blah blah blah",
"genres": ["cool", "family", "fun"],
@@ -1474,6 +1475,7 @@ mod test {
"id": 1,
"title": "Test",
"originalLanguage": {
"id": 1,
"name": "English"
},
"sizeOnDisk": 0,
@@ -1559,7 +1561,7 @@ mod test {
let movie_history_item_json = json!([{
"sourceTitle": "Test",
"quality": { "quality": { "name": "HD - 1080p" }},
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"date": "2022-12-30T07:37:56Z",
"eventType": "grabbed"
}]);
@@ -1613,7 +1615,7 @@ mod test {
let movie_history_item_json = json!([{
"sourceTitle": "Test",
"quality": { "quality": { "name": "HD - 1080p" }},
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"date": "2022-12-30T07:37:56Z",
"eventType": "grabbed"
}]);
@@ -1646,7 +1648,7 @@ mod test {
let movie_history_item_json = json!([{
"sourceTitle": "Test",
"quality": { "quality": { "name": "HD - 1080p" }},
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"date": "2022-12-30T07:37:56Z",
"eventType": "grabbed"
}]);
@@ -1697,9 +1699,9 @@ mod test {
"id": 123,
"movieId": 1007,
"sourceTitle": "z movie",
"languages": [{"name": "English"}],
"languages": [{"id": 1, "name": "English"}],
"quality": {"quality": {"name": "HD - 1080p"}},
"customFormats": [{"name": "English"}],
"customFormats": [{"id": 1, "name": "English"}],
"date": "2024-02-10T07:28:45Z",
"protocol": "usenet",
"indexer": "DrunkenSlug (Prowlarr)",
@@ -1708,7 +1710,7 @@ mod test {
"id": 1007,
"title": "z movie",
"tmdbId": 1234,
"originalLanguage": {"name": "English"},
"originalLanguage": {"id": 1, "name": "English"},
"sizeOnDisk": 3543348019i64,
"status": "Downloaded",
"overview": "Blah blah blah",
@@ -1733,9 +1735,9 @@ mod test {
"id": 456,
"movieId": 2001,
"sourceTitle": "A Movie",
"languages": [{"name": "English"}],
"languages": [{"id": 1, "name": "English"}],
"quality": {"quality": {"name": "HD - 1080p"}},
"customFormats": [{"name": "English"}],
"customFormats": [{"id": 1, "name": "English"}],
"date": "2024-02-10T07:28:45Z",
"protocol": "usenet",
"indexer": "DrunkenSlug (Prowlarr)",
@@ -1744,7 +1746,7 @@ mod test {
"id": 2001,
"title": "A Movie",
"tmdbId": 1234,
"originalLanguage": {"name": "English"},
"originalLanguage": {"id": 1, "name": "English"},
"sizeOnDisk": 3543348019i64,
"status": "Downloaded",
"overview": "Blah blah blah",
@@ -1841,9 +1843,9 @@ mod test {
"id": 123,
"movieId": 1007,
"sourceTitle": "z movie",
"languages": [{"name": "English"}],
"languages": [{"id": 1, "name": "English"}],
"quality": {"quality": {"name": "HD - 1080p"}},
"customFormats": [{"name": "English"}],
"customFormats": [{"id": 1, "name": "English"}],
"date": "2024-02-10T07:28:45Z",
"protocol": "usenet",
"indexer": "DrunkenSlug (Prowlarr)",
@@ -1852,7 +1854,7 @@ mod test {
"id": 1007,
"title": "z movie",
"tmdbId": 1234,
"originalLanguage": {"name": "English"},
"originalLanguage": {"id": 1, "name": "English"},
"sizeOnDisk": 3543348019i64,
"status": "Downloaded",
"overview": "Blah blah blah",
@@ -1877,9 +1879,9 @@ mod test {
"id": 456,
"movieId": 2001,
"sourceTitle": "A Movie",
"languages": [{"name": "English"}],
"languages": [{"id": 1, "name": "English"}],
"quality": {"quality": {"name": "HD - 1080p"}},
"customFormats": [{"name": "English"}],
"customFormats": [{"id": 1, "name": "English"}],
"date": "2024-02-10T07:28:45Z",
"protocol": "usenet",
"indexer": "DrunkenSlug (Prowlarr)",
@@ -1888,7 +1890,7 @@ mod test {
"id": 2001,
"title": "A Movie",
"tmdbId": 1234,
"originalLanguage": {"name": "English"},
"originalLanguage": {"id": 1, "name": "English"},
"sizeOnDisk": 3543348019i64,
"status": "Downloaded",
"overview": "Blah blah blah",
@@ -5076,6 +5078,7 @@ mod test {
fn language() -> Language {
Language {
id: 1,
name: "English".to_owned(),
}
}
+26 -2
View File
@@ -14,8 +14,8 @@ use crate::{
},
},
servarr_models::{
AddRootFolderBody, CommandBody, DiskSpace, HostConfig, Indexer, LogResponse, QualityProfile,
QueueEvent, RootFolder, SecurityConfig, Tag, Update,
AddRootFolderBody, CommandBody, DiskSpace, HostConfig, Indexer, Language, LogResponse,
QualityProfile, QueueEvent, RootFolder, SecurityConfig, Tag, Update,
},
sonarr_models::{
BlocklistResponse, DeleteSeriesParams, DownloadRecord, DownloadsResponse, Episode,
@@ -56,6 +56,7 @@ pub enum SonarrEvent {
GetEpisodeDetails(Option<i64>),
GetEpisodes(Option<i64>),
GetEpisodeHistory(Option<i64>),
GetLanguageProfiles,
GetLogs(Option<u64>),
GetDiskSpace,
GetQualityProfiles,
@@ -98,6 +99,7 @@ impl NetworkResource for SonarrEvent {
SonarrEvent::GetHistory(_) | SonarrEvent::GetEpisodeHistory(_) => "/history",
SonarrEvent::GetHostConfig | SonarrEvent::GetSecurityConfig => "/config/host",
SonarrEvent::GetIndexers | SonarrEvent::DeleteIndexer(_) => "/indexer",
SonarrEvent::GetLanguageProfiles => "/languageprofile",
SonarrEvent::GetLogs(_) => "/log",
SonarrEvent::GetDiskSpace => "/diskspace",
SonarrEvent::GetQualityProfiles => "/qualityprofile",
@@ -203,6 +205,10 @@ impl<'a, 'b> Network<'a, 'b> {
.await
.map(SonarrSerdeable::from),
SonarrEvent::GetIndexers => self.get_sonarr_indexers().await.map(SonarrSerdeable::from),
SonarrEvent::GetLanguageProfiles => self
.get_sonarr_language_profiles()
.await
.map(SonarrSerdeable::from),
SonarrEvent::GetLogs(events) => self
.get_sonarr_logs(events)
.await
@@ -951,6 +957,24 @@ impl<'a, 'b> Network<'a, 'b> {
.await
}
async fn get_sonarr_language_profiles(&mut self) -> Result<Vec<Language>> {
info!("Fetching Sonarr language profiles");
let event = SonarrEvent::GetLanguageProfiles;
let request_props = self
.request_props_from(event, RequestMethod::Get, None::<()>, None, None)
.await;
self
.handle_request::<(), Vec<Language>>(request_props, |language_profiles_vec, mut app| {
app.data.sonarr_data.language_profiles_map = language_profiles_vec
.into_iter()
.map(|language| (language.id, language.name))
.collect();
})
.await
}
async fn get_sonarr_logs(&mut self, events: Option<u64>) -> Result<LogResponse> {
info!("Fetching Sonarr logs");
let event = SonarrEvent::GetLogs(events);
+70 -35
View File
@@ -104,7 +104,7 @@ mod test {
"path": "/nfs/tv/series/season 1/episode 1.mkv",
"size": 3543348019,
"dateAdded": "2024-02-10T07:28:45Z",
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"quality": { "quality": { "name": "Bluray-1080p" } },
"mediaInfo": {
"audioBitrate": 0,
@@ -235,6 +235,7 @@ mod test {
#[case(SonarrEvent::GetBlocklist, "/blocklist?page=1&pageSize=10000")]
#[case(SonarrEvent::GetDiskSpace, "/diskspace")]
#[case(SonarrEvent::GetSeriesHistory(None), "/history/series")]
#[case(SonarrEvent::GetLanguageProfiles, "/languageprofile")]
#[case(SonarrEvent::GetLogs(Some(500)), "/log")]
#[case(SonarrEvent::GetQualityProfiles, "/qualityprofile")]
#[case(SonarrEvent::GetStatus, "/system/status")]
@@ -1274,7 +1275,7 @@ mod test {
"sourceTitle": "z episode",
"episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -1287,7 +1288,7 @@ mod test {
"sourceTitle": "A Episode",
"episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -1366,7 +1367,7 @@ mod test {
"sourceTitle": "z episode",
"episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -1379,7 +1380,7 @@ mod test {
"sourceTitle": "A Episode",
"episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -1437,7 +1438,7 @@ mod test {
"sourceTitle": "z episode",
"episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -1450,7 +1451,7 @@ mod test {
"sourceTitle": "A Episode",
"episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -1763,7 +1764,7 @@ mod test {
"sourceTitle": "z episode",
"episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -1776,7 +1777,7 @@ mod test {
"sourceTitle": "A Episode",
"episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -1893,7 +1894,7 @@ mod test {
"sourceTitle": "z episode",
"episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -1906,7 +1907,7 @@ mod test {
"sourceTitle": "A Episode",
"episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -2023,7 +2024,7 @@ mod test {
"sourceTitle": "z episode",
"episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -2036,7 +2037,7 @@ mod test {
"sourceTitle": "A Episode",
"episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -2131,7 +2132,7 @@ mod test {
"sourceTitle": "z episode",
"episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -2144,7 +2145,7 @@ mod test {
"sourceTitle": "A Episode",
"episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -2290,6 +2291,39 @@ mod test {
.unwrap();
}
#[tokio::test]
async fn test_handle_get_sonarr_language_profiles_event() {
let language_profiles_json = json!([{
"id": 2222,
"name": "English"
}]);
let response: Vec<Language> = serde_json::from_value(language_profiles_json.clone()).unwrap();
let (async_server, app_arc, _server) = mock_servarr_api(
RequestMethod::Get,
None,
Some(language_profiles_json),
None,
SonarrEvent::GetLanguageProfiles,
None,
None,
)
.await;
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
if let SonarrSerdeable::LanguageProfiles(language_profiles) = network
.handle_sonarr_event(SonarrEvent::GetLanguageProfiles)
.await
.unwrap()
{
async_server.assert_async().await;
assert_eq!(
app_arc.lock().await.data.sonarr_data.language_profiles_map,
BiMap::from_iter([(2222i64, "English".to_owned())])
);
assert_eq!(language_profiles, response);
}
}
#[tokio::test]
async fn test_handle_get_sonarr_logs_event() {
let expected_logs = vec![
@@ -2560,7 +2594,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }}
}]);
let (async_server, app_arc, _server) = mock_servarr_api(
@@ -2627,7 +2661,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }}
}]);
let (async_server, app_arc, _server) = mock_servarr_api(
@@ -2686,7 +2720,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }}
}]);
let (_async_server, app_arc, _server) = mock_servarr_api(
@@ -2721,7 +2755,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }}
}]);
let (async_server, app_arc, _server) = mock_servarr_api(
@@ -2789,7 +2823,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }},
"fullSeason": true
},
@@ -2805,7 +2839,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }},
}
]);
@@ -2889,7 +2923,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }},
"fullSeason": true
},
@@ -2905,7 +2939,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }},
}
]);
@@ -2975,7 +3009,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }},
"fullSeason": true
},
@@ -2991,7 +3025,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }},
}
]);
@@ -3075,7 +3109,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }},
"fullSeason": true
},
@@ -3091,7 +3125,7 @@ mod test {
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }},
}
]);
@@ -3318,7 +3352,7 @@ mod test {
"sourceTitle": "z episode",
"episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -3331,7 +3365,7 @@ mod test {
"sourceTitle": "A Episode",
"episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -3440,7 +3474,7 @@ mod test {
"sourceTitle": "z episode",
"episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -3453,7 +3487,7 @@ mod test {
"sourceTitle": "A Episode",
"episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -3546,7 +3580,7 @@ mod test {
"sourceTitle": "z episode",
"episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -3559,7 +3593,7 @@ mod test {
"sourceTitle": "A Episode",
"episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -3648,7 +3682,7 @@ mod test {
"sourceTitle": "z episode",
"episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -3661,7 +3695,7 @@ mod test {
"sourceTitle": "A Episode",
"episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } },
"language": { "name": "English" },
"language": { "id": 1, "name": "English" },
"date": "2024-02-10T07:28:45Z",
"eventType": "grabbed",
"data": {
@@ -5175,6 +5209,7 @@ mod test {
fn language() -> Language {
Language {
id: 1,
name: "English".to_owned(),
}
}