diff --git a/src/app/radarr.rs b/src/app/radarr.rs index 45d5901..25f7e2f 100644 --- a/src/app/radarr.rs +++ b/src/app/radarr.rs @@ -121,7 +121,7 @@ impl Default for RadarrData { TabRoute { title: "Downloads".to_owned(), route: ActiveRadarrBlock::Downloads.into(), - help: String::default(), + help: " delete ".to_owned(), }, TabRoute { title: "Collections".to_owned(), @@ -170,12 +170,12 @@ pub enum ActiveRadarrBlock { AddMovieSelectQualityProfile, AddMovieSelectMonitor, AddMovieConfirmPrompt, - Calendar, Collections, CollectionDetails, Cast, Crew, DeleteMoviePrompt, + DeleteDownloadPrompt, FileInfo, FilterCollections, FilterMovies, @@ -185,7 +185,6 @@ pub enum ActiveRadarrBlock { Downloads, SearchMovie, SearchCollection, - SortOptions, ViewMovieOverview, } diff --git a/src/handlers/radarr_handlers/mod.rs b/src/handlers/radarr_handlers/mod.rs index 0fc979f..6b7fbd3 100644 --- a/src/handlers/radarr_handlers/mod.rs +++ b/src/handlers/radarr_handlers/mod.rs @@ -183,10 +183,14 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for RadarrHandler<'a> { } fn handle_delete(&mut self) { - if *self.active_radarr_block == ActiveRadarrBlock::Movies { - self + match self.active_radarr_block { + ActiveRadarrBlock::Movies => self .app - .push_navigation_stack(ActiveRadarrBlock::DeleteMoviePrompt.into()); + .push_navigation_stack(ActiveRadarrBlock::DeleteMoviePrompt.into()), + ActiveRadarrBlock::Downloads => self + .app + .push_navigation_stack(ActiveRadarrBlock::DeleteDownloadPrompt.into()), + _ => (), } } @@ -221,7 +225,9 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for RadarrHandler<'a> { _ => (), } } - ActiveRadarrBlock::DeleteMoviePrompt => handle_prompt_toggle(self.app, self.key), + ActiveRadarrBlock::DeleteMoviePrompt | ActiveRadarrBlock::DeleteDownloadPrompt => { + handle_prompt_toggle(self.app, self.key) + } _ => (), } } @@ -295,6 +301,13 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for RadarrHandler<'a> { self.app.pop_navigation_stack(); } + ActiveRadarrBlock::DeleteDownloadPrompt => { + if self.app.data.radarr_data.prompt_confirm { + self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteDownload); + } + + self.app.pop_navigation_stack(); + } _ => (), } } @@ -309,7 +322,7 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for RadarrHandler<'a> { self.app.data.radarr_data.reset_search(); self.app.should_ignore_quit_key = false; } - ActiveRadarrBlock::DeleteMoviePrompt => { + ActiveRadarrBlock::DeleteMoviePrompt | ActiveRadarrBlock::DeleteDownloadPrompt => { self.app.pop_navigation_stack(); self.app.data.radarr_data.prompt_confirm = false; } diff --git a/src/models/radarr_models.rs b/src/models/radarr_models.rs index 35dfb97..55211bd 100644 --- a/src/models/radarr_models.rs +++ b/src/models/radarr_models.rs @@ -148,7 +148,7 @@ pub struct DownloadRecord { pub title: String, pub status: String, #[derivative(Default(value = "Number::from(0)"))] - pub movie_id: Number, + pub id: Number, #[derivative(Default(value = "Number::from(0)"))] pub size: Number, #[derivative(Default(value = "Number::from(0)"))] diff --git a/src/network/radarr_network.rs b/src/network/radarr_network.rs index 971ad96..2f47b31 100644 --- a/src/network/radarr_network.rs +++ b/src/network/radarr_network.rs @@ -8,8 +8,7 @@ use urlencoding::encode; use crate::app::RadarrConfig; use crate::models::radarr_models::{ AddMovieBody, AddMovieSearchResult, AddOptions, Collection, Credit, CreditType, DiskSpace, - DownloadsResponse, MinimumAvailability, Movie, MovieHistoryItem, QualityProfile, RootFolder, - SystemStatus, + DownloadsResponse, Movie, MovieHistoryItem, QualityProfile, RootFolder, SystemStatus, }; use crate::models::ScrollableText; use crate::network::utils::get_movie_status; @@ -19,6 +18,7 @@ use crate::utils::{convert_runtime, convert_to_gb}; #[derive(Debug, Eq, PartialEq, Clone)] pub enum RadarrEvent { AddMovie, + DeleteDownload, DeleteMovie, GetCollections, GetDownloads, @@ -38,7 +38,7 @@ impl RadarrEvent { const fn resource(self) -> &'static str { match self { RadarrEvent::GetCollections => "/collection", - RadarrEvent::GetDownloads => "/queue", + RadarrEvent::GetDownloads | RadarrEvent::DeleteDownload => "/queue", RadarrEvent::AddMovie | RadarrEvent::GetMovies | RadarrEvent::GetMovieDetails @@ -70,6 +70,7 @@ impl<'a> Network<'a> { RadarrEvent::GetStatus => self.get_status().await, RadarrEvent::GetMovies => self.get_movies().await, RadarrEvent::DeleteMovie => self.delete_movie().await, + RadarrEvent::DeleteDownload => self.delete_download().await, RadarrEvent::GetMovieCredits => self.get_credits().await, RadarrEvent::GetMovieDetails => self.get_movie_details().await, RadarrEvent::GetMovieHistory => self.get_movie_history().await, @@ -490,6 +491,34 @@ impl<'a> Network<'a> { .await; } + async fn delete_download(&self) { + let movie_id = self + .app + .lock() + .await + .data + .radarr_data + .downloads + .current_selection() + .id + .as_u64() + .unwrap(); + + info!("Deleting Radarr download for movie with id: {}", movie_id); + + let request_props = self + .radarr_request_props_from( + format!("{}/{}", RadarrEvent::DeleteDownload.resource(), movie_id).as_str(), + RequestMethod::Delete, + None::<()>, + ) + .await; + + self + .handle_request::<(), ()>(request_props, |_, _| ()) + .await; + } + async fn add_movie(&self) { info!("Adding new movie to Radarr"); let body = { diff --git a/src/network/utils.rs b/src/network/utils.rs index 7e269f7..8749825 100644 --- a/src/network/utils.rs +++ b/src/network/utils.rs @@ -16,7 +16,7 @@ pub fn get_movie_status( if !has_file { if let Some(download) = downloads_vec .iter() - .find(|&download| download.movie_id.as_u64().unwrap() == movie_id.as_u64().unwrap()) + .find(|&download| download.id.as_u64().unwrap() == movie_id.as_u64().unwrap()) { if download.status == "downloading" { return "Downloading".to_owned(); diff --git a/src/ui/radarr_ui/mod.rs b/src/ui/radarr_ui/mod.rs index 55d10a2..e529496 100644 --- a/src/ui/radarr_ui/mod.rs +++ b/src/ui/radarr_ui/mod.rs @@ -92,6 +92,15 @@ pub(super) fn draw_radarr_ui(f: &mut Frame<'_, B>, app: &mut App, ar 30, 30, ), + ActiveRadarrBlock::DeleteDownloadPrompt => draw_popup_over( + f, + app, + content_rect, + draw_downloads, + draw_delete_download_prompt, + 30, + 30, + ), _ => (), } } @@ -179,6 +188,20 @@ fn draw_delete_movie_prompt(f: &mut Frame<'_, B>, app: &mut App, pro ); } +fn draw_delete_download_prompt(f: &mut Frame<'_, B>, app: &mut App, prompt_area: Rect) { + draw_prompt_box( + f, + prompt_area, + " Confirm Cancel Download? ", + format!( + "Do you really want to delete this download: {}?", + app.data.radarr_data.downloads.current_selection().title + ) + .as_str(), + &app.data.radarr_data.prompt_confirm, + ); +} + fn draw_search_box(f: &mut Frame<'_, B>, app: &mut App, area: Rect) { let chunks = vertical_chunks_with_margin(vec![Constraint::Length(3)], area, 1); if !app.data.radarr_data.is_searching { @@ -446,7 +469,7 @@ fn determine_row_style(downloads_vec: &[DownloadRecord], movie: &Movie) -> Style if !movie.has_file { if let Some(download) = downloads_vec .iter() - .find(|&download| download.movie_id == movie.id) + .find(|&download| download.id == movie.id) { if download.status == "downloading" { return style_warning();