Lidarr support #1

Merged
Dark-Alex-17 merged 61 commits from lidarr into main 2026-01-21 21:30:47 +00:00
19 changed files with 74 additions and 74 deletions
Showing only changes of commit f17f542e8e - Show all commits
+4 -6
View File
@@ -58,21 +58,19 @@ impl App<'_> {
}
ActiveSonarrBlock::SeasonHistory => {
if !self.data.sonarr_data.seasons.is_empty() {
let (series_id, season_number) = self.extract_series_id_season_number_tuple().await;
self
.dispatch_network_event(
SonarrEvent::GetSeasonHistory(self.extract_series_id_season_number_tuple().await)
.into(),
)
.dispatch_network_event(SonarrEvent::GetSeasonHistory(series_id, season_number).into())
.await;
}
}
ActiveSonarrBlock::ManualSeasonSearch => {
match self.data.sonarr_data.season_details_modal.as_ref() {
Some(season_details_modal) if season_details_modal.season_releases.is_empty() => {
let (series_id, season_number) = self.extract_series_id_season_number_tuple().await;
self
.dispatch_network_event(
SonarrEvent::GetSeasonReleases(self.extract_series_id_season_number_tuple().await)
.into(),
SonarrEvent::GetSeasonReleases(series_id, season_number).into(),
)
.await;
}
+2 -2
View File
@@ -132,7 +132,7 @@ mod tests {
assert!(app.is_loading);
assert_eq!(
sync_network_rx.recv().await.unwrap(),
SonarrEvent::GetSeasonHistory((1, 1)).into()
SonarrEvent::GetSeasonHistory(1, 1).into()
);
assert!(!app.data.sonarr_data.prompt_confirm);
assert_eq!(app.tick_count, 0);
@@ -175,7 +175,7 @@ mod tests {
assert!(app.is_loading);
assert_eq!(
sync_network_rx.recv().await.unwrap(),
SonarrEvent::GetSeasonReleases((1, 1)).into()
SonarrEvent::GetSeasonReleases(1, 1).into()
);
assert!(!app.data.sonarr_data.prompt_confirm);
assert_eq!(app.tick_count, 0);
+1 -1
View File
@@ -249,7 +249,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrListCommand> for SonarrListCommandH
} => {
let resp = self
.network
.handle_network_event(SonarrEvent::GetSeasonHistory((series_id, season_number)).into())
.handle_network_event(SonarrEvent::GetSeasonHistory(series_id, season_number).into())
.await?;
serde_json::to_string_pretty(&resp)?
}
+1 -1
View File
@@ -543,7 +543,7 @@ mod tests {
mock_network
.expect_handle_network_event()
.with(eq::<NetworkEvent>(
SonarrEvent::GetSeasonHistory((expected_series_id, expected_season_number)).into(),
SonarrEvent::GetSeasonHistory(expected_series_id, expected_season_number).into(),
))
.times(1)
.returning(|_| {
@@ -98,7 +98,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrManualSearchCommand>
println!("Searching for season releases. This may take a minute...");
match self
.network
.handle_network_event(SonarrEvent::GetSeasonReleases((series_id, season_number)).into())
.handle_network_event(SonarrEvent::GetSeasonReleases(series_id, season_number).into())
.await
{
Ok(Serdeable::Sonarr(SonarrSerdeable::Releases(releases_vec))) => {
@@ -176,7 +176,7 @@ mod tests {
mock_network
.expect_handle_network_event()
.with(eq::<NetworkEvent>(
SonarrEvent::GetSeasonReleases((expected_series_id, expected_season_number)).into(),
SonarrEvent::GetSeasonReleases(expected_series_id, expected_season_number).into(),
))
.times(1)
.returning(|_| {
+1 -1
View File
@@ -297,7 +297,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrCommand> for SonarrCliHandler<'a, '
let resp = self
.network
.handle_network_event(
SonarrEvent::ToggleSeasonMonitoring((series_id, season_number)).into(),
SonarrEvent::ToggleSeasonMonitoring(series_id, season_number).into(),
)
.await?;
serde_json::to_string_pretty(&resp)?
+1 -1
View File
@@ -755,7 +755,7 @@ mod tests {
mock_network
.expect_handle_network_event()
.with(eq::<NetworkEvent>(
SonarrEvent::ToggleSeasonMonitoring((expected_series_id, expected_season_number)).into(),
SonarrEvent::ToggleSeasonMonitoring(expected_series_id, expected_season_number).into(),
))
.times(1)
.returning(|_| {
@@ -94,7 +94,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrTriggerAutomaticSearchCommand>
let resp = self
.network
.handle_network_event(
SonarrEvent::TriggerAutomaticSeasonSearch((series_id, season_number)).into(),
SonarrEvent::TriggerAutomaticSeasonSearch(series_id, season_number).into(),
)
.await?;
serde_json::to_string_pretty(&resp)?
@@ -197,7 +197,7 @@ mod tests {
mock_network
.expect_handle_network_event()
.with(eq::<NetworkEvent>(
SonarrEvent::TriggerAutomaticSeasonSearch((expected_series_id, expected_season_number))
SonarrEvent::TriggerAutomaticSeasonSearch(expected_series_id, expected_season_number)
.into(),
))
.times(1)
@@ -279,8 +279,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeasonDetailsHandler
}
ActiveSonarrBlock::AutomaticallySearchSeasonPrompt => {
if self.app.data.sonarr_data.prompt_confirm {
let (series_id, season_number) = self.extract_series_id_season_number_tuple();
self.app.data.sonarr_data.prompt_confirm_action = Some(
SonarrEvent::TriggerAutomaticSeasonSearch(self.extract_series_id_season_number_tuple()),
SonarrEvent::TriggerAutomaticSeasonSearch(series_id, season_number),
);
}
@@ -404,8 +405,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeasonDetailsHandler
},
ActiveSonarrBlock::AutomaticallySearchSeasonPrompt if matches_key!(confirm, key) => {
self.app.data.sonarr_data.prompt_confirm = true;
let (series_id, season_number) = self.extract_series_id_season_number_tuple();
self.app.data.sonarr_data.prompt_confirm_action = Some(
SonarrEvent::TriggerAutomaticSeasonSearch(self.extract_series_id_season_number_tuple()),
SonarrEvent::TriggerAutomaticSeasonSearch(series_id, season_number),
);
self.app.pop_navigation_stack();
@@ -268,7 +268,7 @@ mod tests {
#[rstest]
#[case(
ActiveSonarrBlock::AutomaticallySearchSeasonPrompt,
SonarrEvent::TriggerAutomaticSeasonSearch((0, 0))
SonarrEvent::TriggerAutomaticSeasonSearch(0, 0)
)]
#[case(
ActiveSonarrBlock::DeleteEpisodeFilePrompt,
@@ -694,7 +694,7 @@ mod tests {
#[rstest]
#[case(
ActiveSonarrBlock::AutomaticallySearchSeasonPrompt,
SonarrEvent::TriggerAutomaticSeasonSearch((0, 0))
SonarrEvent::TriggerAutomaticSeasonSearch(0, 0)
)]
#[case(
ActiveSonarrBlock::DeleteEpisodeFilePrompt,
@@ -278,8 +278,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeriesDetailsHandler
}
_ if matches_key!(toggle_monitoring, key) => {
self.app.data.sonarr_data.prompt_confirm = true;
let (series_id, season_number) = self.extract_series_id_season_number_tuple();
self.app.data.sonarr_data.prompt_confirm_action = Some(
SonarrEvent::ToggleSeasonMonitoring(self.extract_series_id_season_number_tuple()),
SonarrEvent::ToggleSeasonMonitoring(series_id, season_number),
);
self
@@ -378,7 +378,7 @@ mod tests {
assert!(app.is_routing);
assert_some_eq_x!(
&app.data.sonarr_data.prompt_confirm_action,
&SonarrEvent::ToggleSeasonMonitoring((0, 0))
&SonarrEvent::ToggleSeasonMonitoring(0, 0)
);
}
@@ -302,8 +302,10 @@ impl LidarrData<'_> {
.metadata_profile_list
.set_items(vec![metadata_profile().name]);
let mut track_details_modal = TrackDetailsModal::default();
track_details_modal.track_details = ScrollableText::with_string("Some details".to_owned());
let mut track_details_modal = TrackDetailsModal {
track_details: ScrollableText::with_string("Some details".to_owned()),
..TrackDetailsModal::default()
};
track_details_modal
.track_history
.set_items(vec![lidarr_history_item()]);
@@ -14,10 +14,10 @@ mod sonarr_seasons_network_tests;
impl Network<'_, '_> {
pub(in crate::network::sonarr_network) async fn toggle_sonarr_season_monitoring(
&mut self,
series_id_season_number_tuple: (i64, i64),
series_id: i64,
season_number: i64,
) -> Result<()> {
let event = SonarrEvent::ToggleSeasonMonitoring(series_id_season_number_tuple);
let (series_id, season_number) = series_id_season_number_tuple;
let event = SonarrEvent::ToggleSeasonMonitoring(series_id, season_number);
let detail_event = SonarrEvent::GetSeriesDetails(series_id);
info!("Toggling season monitoring for season {season_number} in series with ID: {series_id}");
@@ -94,10 +94,10 @@ impl Network<'_, '_> {
pub(in crate::network::sonarr_network) async fn get_season_releases(
&mut self,
series_season_id_tuple: (i64, i64),
series_id: i64,
season_number: i64,
) -> Result<Vec<SonarrRelease>> {
let event = SonarrEvent::GetSeasonReleases(series_season_id_tuple);
let (series_id, season_number) = series_season_id_tuple;
let event = SonarrEvent::GetSeasonReleases(series_id, season_number);
info!("Fetching releases for series with ID: {series_id} and season number: {season_number}");
let request_props = self
@@ -132,10 +132,10 @@ impl Network<'_, '_> {
pub(in crate::network::sonarr_network) async fn get_sonarr_season_history(
&mut self,
series_season_id_tuple: (i64, i64),
series_id: i64,
season_number: i64,
) -> Result<Vec<SonarrHistoryItem>> {
let event = SonarrEvent::GetSeasonHistory(series_season_id_tuple);
let (series_id, season_number) = series_season_id_tuple;
let event = SonarrEvent::GetSeasonHistory(series_id, season_number);
info!("Fetching history for series with ID: {series_id} and season number: {season_number}");
let params = format!("seriesId={series_id}&seasonNumber={season_number}",);
@@ -170,10 +170,10 @@ impl Network<'_, '_> {
pub(in crate::network::sonarr_network) async fn trigger_automatic_season_search(
&mut self,
series_season_id_tuple: (i64, i64),
series_id: i64,
season_number: i64,
) -> Result<Value> {
let event = SonarrEvent::TriggerAutomaticSeasonSearch(series_season_id_tuple);
let (series_id, season_number) = series_season_id_tuple;
let event = SonarrEvent::TriggerAutomaticSeasonSearch(series_id, season_number);
info!("Searching indexers for series with ID: {series_id} and season number: {season_number}");
let body = SonarrCommandBody {
@@ -37,7 +37,7 @@ mod tests {
"PUT",
format!(
"/api/v3{}/1",
SonarrEvent::ToggleSeasonMonitoring((1, 1)).resource()
SonarrEvent::ToggleSeasonMonitoring(1, 1).resource()
)
.as_str(),
)
@@ -56,7 +56,7 @@ mod tests {
assert!(
network
.handle_sonarr_event(SonarrEvent::ToggleSeasonMonitoring((1, 1)))
.handle_sonarr_event(SonarrEvent::ToggleSeasonMonitoring(1, 1))
.await
.is_ok()
);
@@ -117,7 +117,7 @@ mod tests {
let (mock, app, _server) = MockServarrApi::get()
.returns(release_json)
.query("seriesId=1&seasonNumber=1")
.build_for(SonarrEvent::GetSeasonReleases((1, 1)))
.build_for(SonarrEvent::GetSeasonReleases(1, 1))
.await;
app
.lock()
@@ -138,7 +138,7 @@ mod tests {
let mut network = test_network(&app);
let SonarrSerdeable::Releases(releases_vec) = network
.handle_sonarr_event(SonarrEvent::GetSeasonReleases((1, 1)))
.handle_sonarr_event(SonarrEvent::GetSeasonReleases(1, 1))
.await
.unwrap()
else {
@@ -203,7 +203,7 @@ mod tests {
let (mock, app, _server) = MockServarrApi::get()
.returns(release_json)
.query("seriesId=1&seasonNumber=1")
.build_for(SonarrEvent::GetSeasonReleases((1, 1)))
.build_for(SonarrEvent::GetSeasonReleases(1, 1))
.await;
app
.lock()
@@ -224,7 +224,7 @@ mod tests {
assert!(
network
.handle_sonarr_event(SonarrEvent::GetSeasonReleases((1, 1)))
.handle_sonarr_event(SonarrEvent::GetSeasonReleases(1, 1))
.await
.is_ok()
);
@@ -291,7 +291,7 @@ mod tests {
let (mock, app, _server) = MockServarrApi::get()
.returns(history_json)
.query("seriesId=1&seasonNumber=1")
.build_for(SonarrEvent::GetSeasonHistory((1, 1)))
.build_for(SonarrEvent::GetSeasonHistory(1, 1))
.await;
app.lock().await.data.sonarr_data.season_details_modal = Some(SeasonDetailsModal::default());
app
@@ -322,7 +322,7 @@ mod tests {
let mut network = test_network(&app);
let SonarrSerdeable::SonarrHistoryItems(history) = network
.handle_sonarr_event(SonarrEvent::GetSeasonHistory((1, 1)))
.handle_sonarr_event(SonarrEvent::GetSeasonHistory(1, 1))
.await
.unwrap()
else {
@@ -403,7 +403,7 @@ mod tests {
let (mock, app, _server) = MockServarrApi::get()
.returns(history_json)
.query("seriesId=1&seasonNumber=1")
.build_for(SonarrEvent::GetSeasonHistory((1, 1)))
.build_for(SonarrEvent::GetSeasonHistory(1, 1))
.await;
app
.lock()
@@ -423,7 +423,7 @@ mod tests {
let mut network = test_network(&app);
let SonarrSerdeable::SonarrHistoryItems(history) = network
.handle_sonarr_event(SonarrEvent::GetSeasonHistory((1, 1)))
.handle_sonarr_event(SonarrEvent::GetSeasonHistory(1, 1))
.await
.unwrap()
else {
@@ -499,7 +499,7 @@ mod tests {
let (mock, app, _server) = MockServarrApi::get()
.returns(history_json)
.query("seriesId=1&seasonNumber=1")
.build_for(SonarrEvent::GetSeasonHistory((1, 1)))
.build_for(SonarrEvent::GetSeasonHistory(1, 1))
.await;
app.lock().await.data.sonarr_data.season_details_modal = Some(SeasonDetailsModal::default());
app
@@ -520,7 +520,7 @@ mod tests {
let mut network = test_network(&app);
let SonarrSerdeable::SonarrHistoryItems(history) = network
.handle_sonarr_event(SonarrEvent::GetSeasonHistory((1, 1)))
.handle_sonarr_event(SonarrEvent::GetSeasonHistory(1, 1))
.await
.unwrap()
else {
@@ -563,14 +563,14 @@ mod tests {
"seasonNumber": 1
}))
.returns(json!({}))
.build_for(SonarrEvent::TriggerAutomaticSeasonSearch((1, 1)))
.build_for(SonarrEvent::TriggerAutomaticSeasonSearch(1, 1))
.await;
app.lock().await.server_tabs.next();
let mut network = test_network(&app);
assert!(
network
.handle_sonarr_event(SonarrEvent::TriggerAutomaticSeasonSearch((1, 1)))
.handle_sonarr_event(SonarrEvent::TriggerAutomaticSeasonSearch(1, 1))
.await
.is_ok()
);
+16 -16
View File
@@ -65,8 +65,8 @@ pub enum SonarrEvent {
GetQueuedEvents,
GetRootFolders,
GetEpisodeReleases(i64),
GetSeasonHistory((i64, i64)),
GetSeasonReleases((i64, i64)),
GetSeasonHistory(i64, i64),
GetSeasonReleases(i64, i64),
GetSecurityConfig,
GetSeriesDetails(i64),
GetSeriesHistory(i64),
@@ -81,11 +81,11 @@ pub enum SonarrEvent {
StartTask(SonarrTaskName),
TestIndexer(i64),
TestAllIndexers,
ToggleSeasonMonitoring((i64, i64)),
ToggleSeasonMonitoring(i64, i64),
ToggleSeriesMonitoring(i64),
ToggleEpisodeMonitoring(i64),
TriggerAutomaticEpisodeSearch(i64),
TriggerAutomaticSeasonSearch((i64, i64)),
TriggerAutomaticSeasonSearch(i64, i64),
TriggerAutomaticSeriesSearch(i64),
UpdateAllSeries,
UpdateAndScanSeries(i64),
@@ -118,7 +118,7 @@ impl NetworkResource for SonarrEvent {
SonarrEvent::GetQueuedEvents
| SonarrEvent::StartTask(_)
| SonarrEvent::TriggerAutomaticSeriesSearch(_)
| SonarrEvent::TriggerAutomaticSeasonSearch(_)
| SonarrEvent::TriggerAutomaticSeasonSearch(_, _)
| SonarrEvent::TriggerAutomaticEpisodeSearch(_)
| SonarrEvent::UpdateAllSeries
| SonarrEvent::UpdateAndScanSeries(_)
@@ -126,8 +126,8 @@ impl NetworkResource for SonarrEvent {
SonarrEvent::GetRootFolders
| SonarrEvent::DeleteRootFolder(_)
| SonarrEvent::AddRootFolder(_) => "/rootfolder",
SonarrEvent::GetSeasonReleases(_) | SonarrEvent::GetEpisodeReleases(_) => "/release",
SonarrEvent::GetSeriesHistory(_) | SonarrEvent::GetSeasonHistory(_) => "/history/series",
SonarrEvent::GetSeasonReleases(_, _) | SonarrEvent::GetEpisodeReleases(_) => "/release",
SonarrEvent::GetSeriesHistory(_) | SonarrEvent::GetSeasonHistory(_, _) => "/history/series",
SonarrEvent::GetStatus => "/system/status",
SonarrEvent::GetTasks => "/system/task",
SonarrEvent::GetUpdates => "/update",
@@ -137,7 +137,7 @@ impl NetworkResource for SonarrEvent {
| SonarrEvent::GetSeriesDetails(_)
| SonarrEvent::DeleteSeries(_)
| SonarrEvent::EditSeries(_)
| SonarrEvent::ToggleSeasonMonitoring(_)
| SonarrEvent::ToggleSeasonMonitoring(_, _)
| SonarrEvent::ToggleSeriesMonitoring(_) => "/series",
SonarrEvent::SearchNewSeries(_) => "/series/lookup",
SonarrEvent::MarkHistoryItemAsFailed(_) => "/history/failed",
@@ -275,12 +275,12 @@ impl Network<'_, '_> {
.get_episode_releases(params)
.await
.map(SonarrSerdeable::from),
SonarrEvent::GetSeasonHistory(params) => self
.get_sonarr_season_history(params)
SonarrEvent::GetSeasonHistory(series_id, season_number) => self
.get_sonarr_season_history(series_id, season_number)
.await
.map(SonarrSerdeable::from),
SonarrEvent::GetSeasonReleases(params) => self
.get_season_releases(params)
SonarrEvent::GetSeasonReleases(series_id, season_number) => self
.get_season_releases(series_id, season_number)
.await
.map(SonarrSerdeable::from),
SonarrEvent::GetSecurityConfig => self
@@ -328,16 +328,16 @@ impl Network<'_, '_> {
.toggle_sonarr_episode_monitoring(episode_id)
.await
.map(SonarrSerdeable::from),
SonarrEvent::ToggleSeasonMonitoring(params) => self
.toggle_sonarr_season_monitoring(params)
SonarrEvent::ToggleSeasonMonitoring(series_id, season_number) => self
.toggle_sonarr_season_monitoring(series_id, season_number)
.await
.map(SonarrSerdeable::from),
SonarrEvent::ToggleSeriesMonitoring(series_id) => self
.toggle_sonarr_series_monitoring(series_id)
.await
.map(SonarrSerdeable::from),
SonarrEvent::TriggerAutomaticSeasonSearch(params) => self
.trigger_automatic_season_search(params)
SonarrEvent::TriggerAutomaticSeasonSearch(series_id, season_number) => self
.trigger_automatic_season_search(series_id, season_number)
.await
.map(SonarrSerdeable::from),
SonarrEvent::TriggerAutomaticSeriesSearch(series_id) => self
@@ -43,8 +43,8 @@ mod test {
SonarrEvent::GetSeriesDetails(0),
SonarrEvent::DeleteSeries(DeleteSeriesParams::default()),
SonarrEvent::EditSeries(EditSeriesParams::default()),
SonarrEvent::ToggleSeasonMonitoring((0, 0)),
SonarrEvent::ToggleSeriesMonitoring(0),
SonarrEvent::ToggleSeasonMonitoring(0, 0),
SonarrEvent::ToggleSeriesMonitoring(0)
)]
event: SonarrEvent,
) {
@@ -76,7 +76,7 @@ mod test {
SonarrEvent::GetQueuedEvents,
SonarrEvent::StartTask(SonarrTaskName::default()),
SonarrEvent::TriggerAutomaticEpisodeSearch(0),
SonarrEvent::TriggerAutomaticSeasonSearch((0, 0)),
SonarrEvent::TriggerAutomaticSeasonSearch(0, 0),
SonarrEvent::TriggerAutomaticSeriesSearch(0),
SonarrEvent::UpdateAllSeries,
SonarrEvent::UpdateAndScanSeries(0),
@@ -108,10 +108,7 @@ mod test {
#[rstest]
fn test_resource_series_history(
#[values(
SonarrEvent::GetSeriesHistory(0),
SonarrEvent::GetSeasonHistory((0, 0))
)]
#[values(SonarrEvent::GetSeriesHistory(0), SonarrEvent::GetSeasonHistory(0, 0))]
event: SonarrEvent,
) {
assert_str_eq!(event.resource(), "/history/series");
@@ -139,7 +136,7 @@ mod test {
#[rstest]
fn test_resource_release(
#[values(
SonarrEvent::GetSeasonReleases((0, 0)),
SonarrEvent::GetSeasonReleases(0, 0),
SonarrEvent::GetEpisodeReleases(0)
)]
event: SonarrEvent,