feat(network): Support for deleting a download from Sonarr

This commit is contained in:
2024-11-21 14:46:18 -07:00
parent d2e3750de6
commit 6a0049eb8f
5 changed files with 102 additions and 7 deletions
+1 -1
View File
@@ -51,7 +51,7 @@ docker run --rm -it -v ~/.config/managarr/config.yml:/root/.config/managarr/conf
You can also clone this repo and run `make docker` to build a docker image locally and run it using the above command. You can also clone this repo and run `make docker` to build a docker image locally and run it using the above command.
Please note that you will need to create and popular your configuration file first before starting the container. Otherwise the container will fail to start. Please note that you will need to create and popular your configuration file first before starting the container. Otherwise, the container will fail to start.
## Features ## Features
Key: Key:
+2 -2
View File
@@ -156,7 +156,7 @@ impl<'a, 'b> Network<'a, 'b> {
.await .await
.map(RadarrSerdeable::from), .map(RadarrSerdeable::from),
RadarrEvent::DeleteDownload(download_id) => self RadarrEvent::DeleteDownload(download_id) => self
.delete_download(download_id) .delete_radarr_download(download_id)
.await .await
.map(RadarrSerdeable::from), .map(RadarrSerdeable::from),
RadarrEvent::DeleteIndexer(indexer_id) => self RadarrEvent::DeleteIndexer(indexer_id) => self
@@ -504,7 +504,7 @@ impl<'a, 'b> Network<'a, 'b> {
.await .await
} }
async fn delete_download(&mut self, download_id: Option<i64>) -> Result<()> { async fn delete_radarr_download(&mut self, download_id: Option<i64>) -> Result<()> {
let event = RadarrEvent::DeleteDownload(None); let event = RadarrEvent::DeleteDownload(None);
let id = if let Some(dl_id) = download_id { let id = if let Some(dl_id) = download_id {
dl_id dl_id
+2 -2
View File
@@ -3231,7 +3231,7 @@ mod test {
} }
#[tokio::test] #[tokio::test]
async fn test_handle_delete_download_event() { async fn test_handle_delete_radarr_download_event() {
let (async_server, app_arc, _server) = mock_servarr_api( let (async_server, app_arc, _server) = mock_servarr_api(
RequestMethod::Delete, RequestMethod::Delete,
None, None,
@@ -3260,7 +3260,7 @@ mod test {
} }
#[tokio::test] #[tokio::test]
async fn test_handle_delete_download_event_uses_provided_id() { async fn test_handle_delete_radarr_download_event_uses_provided_id() {
let (async_server, app_arc, _server) = mock_servarr_api( let (async_server, app_arc, _server) = mock_servarr_api(
RequestMethod::Delete, RequestMethod::Delete,
None, None,
+39 -1
View File
@@ -32,6 +32,7 @@ mod sonarr_network_tests;
pub enum SonarrEvent { pub enum SonarrEvent {
ClearBlocklist, ClearBlocklist,
DeleteBlocklistItem(Option<i64>), DeleteBlocklistItem(Option<i64>),
DeleteDownload(Option<i64>),
GetAllIndexerSettings, GetAllIndexerSettings,
GetBlocklist, GetBlocklist,
GetDownloads, GetDownloads,
@@ -61,7 +62,7 @@ impl NetworkResource for SonarrEvent {
SonarrEvent::DeleteBlocklistItem(_) => "/blocklist", SonarrEvent::DeleteBlocklistItem(_) => "/blocklist",
SonarrEvent::GetAllIndexerSettings => "/config/indexer", SonarrEvent::GetAllIndexerSettings => "/config/indexer",
SonarrEvent::GetBlocklist => "/blocklist?page=1&pageSize=10000", SonarrEvent::GetBlocklist => "/blocklist?page=1&pageSize=10000",
SonarrEvent::GetDownloads => "/queue", SonarrEvent::GetDownloads | SonarrEvent::DeleteDownload(_) => "/queue",
SonarrEvent::GetEpisodes(_) | SonarrEvent::GetEpisodeDetails(_) => "/episode", SonarrEvent::GetEpisodes(_) | SonarrEvent::GetEpisodeDetails(_) => "/episode",
SonarrEvent::GetHistory(_) | SonarrEvent::GetEpisodeHistory(_) => "/history", SonarrEvent::GetHistory(_) | SonarrEvent::GetEpisodeHistory(_) => "/history",
SonarrEvent::GetHostConfig | SonarrEvent::GetSecurityConfig => "/config/host", SonarrEvent::GetHostConfig | SonarrEvent::GetSecurityConfig => "/config/host",
@@ -102,6 +103,10 @@ impl<'a, 'b> Network<'a, 'b> {
.delete_sonarr_blocklist_item(blocklist_item_id) .delete_sonarr_blocklist_item(blocklist_item_id)
.await .await
.map(SonarrSerdeable::from), .map(SonarrSerdeable::from),
SonarrEvent::DeleteDownload(download_id) => self
.delete_sonarr_download(download_id)
.await
.map(SonarrSerdeable::from),
SonarrEvent::GetBlocklist => self.get_sonarr_blocklist().await.map(SonarrSerdeable::from), SonarrEvent::GetBlocklist => self.get_sonarr_blocklist().await.map(SonarrSerdeable::from),
SonarrEvent::GetDownloads => self.get_sonarr_downloads().await.map(SonarrSerdeable::from), SonarrEvent::GetDownloads => self.get_sonarr_downloads().await.map(SonarrSerdeable::from),
SonarrEvent::GetEpisodes(series_id) => self SonarrEvent::GetEpisodes(series_id) => self
@@ -230,6 +235,39 @@ impl<'a, 'b> Network<'a, 'b> {
.await .await
} }
async fn delete_sonarr_download(&mut self, download_id: Option<i64>) -> Result<()> {
let event = SonarrEvent::DeleteDownload(None);
let id = if let Some(dl_id) = download_id {
dl_id
} else {
self
.app
.lock()
.await
.data
.sonarr_data
.downloads
.current_selection()
.id
};
info!("Deleting Sonarr download for download with id: {id}");
let request_props = self
.request_props_from(
event,
RequestMethod::Delete,
None::<()>,
Some(format!("/{id}")),
None,
)
.await;
self
.handle_request::<(), ()>(request_props, |_, _| ())
.await
}
async fn get_all_sonarr_indexer_settings(&mut self) -> Result<IndexerSettings> { async fn get_all_sonarr_indexer_settings(&mut self) -> Result<IndexerSettings> {
info!("Fetching Sonarr indexer settings"); info!("Fetching Sonarr indexer settings");
let event = SonarrEvent::GetAllIndexerSettings; let event = SonarrEvent::GetAllIndexerSettings;
+58 -1
View File
@@ -163,6 +163,13 @@ mod test {
assert_str_eq!(event.resource(), "/history"); assert_str_eq!(event.resource(), "/history");
} }
#[rstest]
fn test_resource_queue(
#[values(SonarrEvent::GetDownloads, SonarrEvent::DeleteDownload(None))] event: SonarrEvent,
) {
assert_str_eq!(event.resource(), "/queue");
}
#[rstest] #[rstest]
fn test_resource_release( fn test_resource_release(
#[values( #[values(
@@ -179,7 +186,6 @@ mod test {
#[case(SonarrEvent::DeleteBlocklistItem(None), "/blocklist")] #[case(SonarrEvent::DeleteBlocklistItem(None), "/blocklist")]
#[case(SonarrEvent::HealthCheck, "/health")] #[case(SonarrEvent::HealthCheck, "/health")]
#[case(SonarrEvent::GetBlocklist, "/blocklist?page=1&pageSize=10000")] #[case(SonarrEvent::GetBlocklist, "/blocklist?page=1&pageSize=10000")]
#[case(SonarrEvent::GetDownloads, "/queue")]
#[case(SonarrEvent::GetSeriesHistory(None), "/history/series")] #[case(SonarrEvent::GetSeriesHistory(None), "/history/series")]
#[case(SonarrEvent::GetLogs(Some(500)), "/log")] #[case(SonarrEvent::GetLogs(Some(500)), "/log")]
#[case(SonarrEvent::GetQualityProfiles, "/qualityprofile")] #[case(SonarrEvent::GetQualityProfiles, "/qualityprofile")]
@@ -269,6 +275,57 @@ mod test {
async_server.assert_async().await; async_server.assert_async().await;
} }
#[tokio::test]
async fn test_handle_delete_sonarr_download_event() {
let (async_server, app_arc, _server) = mock_servarr_api(
RequestMethod::Delete,
None,
None,
None,
SonarrEvent::DeleteDownload(None),
Some("/1"),
None,
)
.await;
app_arc
.lock()
.await
.data
.sonarr_data
.downloads
.set_items(vec![download_record()]);
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
assert!(network
.handle_sonarr_event(SonarrEvent::DeleteDownload(None))
.await
.is_ok());
async_server.assert_async().await;
}
#[tokio::test]
async fn test_handle_delete_sonarr_download_event_uses_provided_id() {
let (async_server, app_arc, _server) = mock_servarr_api(
RequestMethod::Delete,
None,
None,
None,
SonarrEvent::DeleteDownload(None),
Some("/1"),
None,
)
.await;
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
assert!(network
.handle_sonarr_event(SonarrEvent::DeleteDownload(Some(1)))
.await
.is_ok());
async_server.assert_async().await;
}
#[rstest] #[rstest]
#[tokio::test] #[tokio::test]
async fn test_handle_get_sonarr_blocklist_event(#[values(true, false)] use_custom_sorting: bool) { async fn test_handle_get_sonarr_blocklist_event(#[values(true, false)] use_custom_sorting: bool) {