fix(radarr): Pass the movie ID alongside all UpdateAndScan events published to the networking channel
This commit is contained in:
@@ -4,6 +4,9 @@ set -e
|
|||||||
|
|
||||||
echo "Running pre-push hook:"
|
echo "Running pre-push hook:"
|
||||||
|
|
||||||
|
echo "Executing: cargo fmt"
|
||||||
|
cargo fmt
|
||||||
|
|
||||||
echo "Executing: make lint"
|
echo "Executing: make lint"
|
||||||
make lint
|
make lint
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ set -e
|
|||||||
|
|
||||||
echo "Running pre-push hook:"
|
echo "Running pre-push hook:"
|
||||||
|
|
||||||
|
echo "Executing: cargo fmt --check"
|
||||||
|
cargo fmt --check
|
||||||
|
|
||||||
echo "Executing: make lint"
|
echo "Executing: make lint"
|
||||||
make lint
|
make lint
|
||||||
|
|
||||||
|
|||||||
@@ -680,7 +680,7 @@ mod tests {
|
|||||||
mock_network
|
mock_network
|
||||||
.expect_handle_network_event()
|
.expect_handle_network_event()
|
||||||
.with(eq::<NetworkEvent>(
|
.with(eq::<NetworkEvent>(
|
||||||
RadarrEvent::UpdateAndScan(Some(expected_movie_id)).into(),
|
RadarrEvent::UpdateAndScan(expected_movie_id).into(),
|
||||||
))
|
))
|
||||||
.times(1)
|
.times(1)
|
||||||
.returning(|_| {
|
.returning(|_| {
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrRefreshCommand>
|
|||||||
RadarrRefreshCommand::Movie { movie_id } => {
|
RadarrRefreshCommand::Movie { movie_id } => {
|
||||||
let resp = self
|
let resp = self
|
||||||
.network
|
.network
|
||||||
.handle_network_event(RadarrEvent::UpdateAndScan(Some(movie_id)).into())
|
.handle_network_event(RadarrEvent::UpdateAndScan(movie_id).into())
|
||||||
.await?;
|
.await?;
|
||||||
serde_json::to_string_pretty(&resp)?
|
serde_json::to_string_pretty(&resp)?
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ mod tests {
|
|||||||
mock_network
|
mock_network
|
||||||
.expect_handle_network_event()
|
.expect_handle_network_event()
|
||||||
.with(eq::<NetworkEvent>(
|
.with(eq::<NetworkEvent>(
|
||||||
RadarrEvent::UpdateAndScan(Some(expected_movie_id)).into(),
|
RadarrEvent::UpdateAndScan(expected_movie_id).into(),
|
||||||
))
|
))
|
||||||
.times(1)
|
.times(1)
|
||||||
.returning(|_| {
|
.returning(|_| {
|
||||||
|
|||||||
@@ -278,7 +278,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
|
|||||||
}
|
}
|
||||||
ActiveRadarrBlock::UpdateAndScanPrompt => {
|
ActiveRadarrBlock::UpdateAndScanPrompt => {
|
||||||
if self.app.data.radarr_data.prompt_confirm {
|
if self.app.data.radarr_data.prompt_confirm {
|
||||||
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::UpdateAndScan(None));
|
self.app.data.radarr_data.prompt_confirm_action =
|
||||||
|
Some(RadarrEvent::UpdateAndScan(self.extract_movie_id()));
|
||||||
}
|
}
|
||||||
|
|
||||||
self.app.pop_navigation_stack();
|
self.app.pop_navigation_stack();
|
||||||
@@ -371,7 +372,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
|
|||||||
}
|
}
|
||||||
ActiveRadarrBlock::UpdateAndScanPrompt if key == DEFAULT_KEYBINDINGS.confirm.key => {
|
ActiveRadarrBlock::UpdateAndScanPrompt if key == DEFAULT_KEYBINDINGS.confirm.key => {
|
||||||
self.app.data.radarr_data.prompt_confirm = true;
|
self.app.data.radarr_data.prompt_confirm = true;
|
||||||
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::UpdateAndScan(None));
|
self.app.data.radarr_data.prompt_confirm_action =
|
||||||
|
Some(RadarrEvent::UpdateAndScan(self.extract_movie_id()));
|
||||||
|
|
||||||
self.app.pop_navigation_stack();
|
self.app.pop_navigation_stack();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -363,10 +363,7 @@ mod tests {
|
|||||||
ActiveRadarrBlock::AutomaticallySearchMoviePrompt,
|
ActiveRadarrBlock::AutomaticallySearchMoviePrompt,
|
||||||
RadarrEvent::TriggerAutomaticSearch(1)
|
RadarrEvent::TriggerAutomaticSearch(1)
|
||||||
)]
|
)]
|
||||||
#[case(
|
#[case(ActiveRadarrBlock::UpdateAndScanPrompt, RadarrEvent::UpdateAndScan(1))]
|
||||||
ActiveRadarrBlock::UpdateAndScanPrompt,
|
|
||||||
RadarrEvent::UpdateAndScan(None)
|
|
||||||
)]
|
|
||||||
#[case(
|
#[case(
|
||||||
ActiveRadarrBlock::ManualSearchConfirmPrompt,
|
ActiveRadarrBlock::ManualSearchConfirmPrompt,
|
||||||
RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody {
|
RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody {
|
||||||
@@ -784,10 +781,7 @@ mod tests {
|
|||||||
ActiveRadarrBlock::AutomaticallySearchMoviePrompt,
|
ActiveRadarrBlock::AutomaticallySearchMoviePrompt,
|
||||||
RadarrEvent::TriggerAutomaticSearch(1)
|
RadarrEvent::TriggerAutomaticSearch(1)
|
||||||
)]
|
)]
|
||||||
#[case(
|
#[case(ActiveRadarrBlock::UpdateAndScanPrompt, RadarrEvent::UpdateAndScan(1))]
|
||||||
ActiveRadarrBlock::UpdateAndScanPrompt,
|
|
||||||
RadarrEvent::UpdateAndScan(None)
|
|
||||||
)]
|
|
||||||
#[case(
|
#[case(
|
||||||
ActiveRadarrBlock::ManualSearchConfirmPrompt,
|
ActiveRadarrBlock::ManualSearchConfirmPrompt,
|
||||||
RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody {
|
RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody {
|
||||||
|
|||||||
@@ -2,10 +2,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
pub(in crate::handlers::radarr_handlers) mod utils {
|
pub(in crate::handlers::radarr_handlers) mod utils {
|
||||||
use crate::models::radarr_models::{
|
use crate::models::radarr_models::{
|
||||||
AddMovieBody, AddMovieOptions, AddMovieSearchResult, BlocklistItem, BlocklistItemMovie,
|
AddMovieBody, AddMovieOptions, AddMovieSearchResult, Collection, CollectionMovie,
|
||||||
Collection, CollectionMovie, Credit, CreditType, DownloadRecord, DownloadsResponse,
|
DownloadRecord, IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection,
|
||||||
IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection, MovieFile,
|
MovieFile, RadarrRelease, Rating, RatingsList,
|
||||||
MovieHistoryItem, RadarrRelease, Rating, RatingsList,
|
|
||||||
};
|
};
|
||||||
use crate::models::servarr_models::{
|
use crate::models::servarr_models::{
|
||||||
Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder,
|
Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder,
|
||||||
@@ -305,28 +304,6 @@ pub(in crate::handlers::radarr_handlers) mod utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn blocklist_item() -> BlocklistItem {
|
|
||||||
BlocklistItem {
|
|
||||||
id: 1,
|
|
||||||
movie_id: 1,
|
|
||||||
source_title: "z movie".to_owned(),
|
|
||||||
languages: vec![language()],
|
|
||||||
quality: quality_wrapper(),
|
|
||||||
custom_formats: Some(vec![language()]),
|
|
||||||
date: DateTime::from(DateTime::parse_from_rfc3339("2024-02-10T07:28:45Z").unwrap()),
|
|
||||||
protocol: "usenet".to_owned(),
|
|
||||||
indexer: "DrunkenSlug (Prowlarr)".to_owned(),
|
|
||||||
message: "test message".to_owned(),
|
|
||||||
movie: blocklist_item_movie(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn blocklist_item_movie() -> BlocklistItemMovie {
|
|
||||||
BlocklistItemMovie {
|
|
||||||
title: "Test".into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn collection() -> Collection {
|
pub fn collection() -> Collection {
|
||||||
Collection {
|
Collection {
|
||||||
id: 123,
|
id: 123,
|
||||||
@@ -422,16 +399,6 @@ pub(in crate::handlers::radarr_handlers) mod utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn movie_history_item() -> MovieHistoryItem {
|
|
||||||
MovieHistoryItem {
|
|
||||||
source_title: HorizontallyScrollableText::from("Test"),
|
|
||||||
quality: quality_wrapper(),
|
|
||||||
languages: vec![language()],
|
|
||||||
date: DateTime::from(DateTime::parse_from_rfc3339("2022-12-30T07:37:56Z").unwrap()),
|
|
||||||
event_type: "grabbed".to_owned(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn download_record() -> DownloadRecord {
|
pub fn download_record() -> DownloadRecord {
|
||||||
DownloadRecord {
|
DownloadRecord {
|
||||||
title: "Test Download Title".to_owned(),
|
title: "Test Download Title".to_owned(),
|
||||||
@@ -446,12 +413,6 @@ pub(in crate::handlers::radarr_handlers) mod utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn downloads_response() -> DownloadsResponse {
|
|
||||||
DownloadsResponse {
|
|
||||||
records: vec![download_record()],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn root_folder() -> RootFolder {
|
pub fn root_folder() -> RootFolder {
|
||||||
RootFolder {
|
RootFolder {
|
||||||
id: 1,
|
id: 1,
|
||||||
@@ -462,26 +423,6 @@ pub(in crate::handlers::radarr_handlers) mod utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cast_credit() -> Credit {
|
|
||||||
Credit {
|
|
||||||
person_name: "Madison Clarke".to_owned(),
|
|
||||||
character: Some("Johnny Blaze".to_owned()),
|
|
||||||
department: None,
|
|
||||||
job: None,
|
|
||||||
credit_type: CreditType::Cast,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn crew_credit() -> Credit {
|
|
||||||
Credit {
|
|
||||||
person_name: "Alex Clarke".to_owned(),
|
|
||||||
character: None,
|
|
||||||
department: Some("Music".to_owned()),
|
|
||||||
job: Some("Composition".to_owned()),
|
|
||||||
credit_type: CreditType::Crew,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn indexer() -> Indexer {
|
pub fn indexer() -> Indexer {
|
||||||
Indexer {
|
Indexer {
|
||||||
enable_rss: true,
|
enable_rss: true,
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ pub enum RadarrEvent {
|
|||||||
TestAllIndexers,
|
TestAllIndexers,
|
||||||
TriggerAutomaticSearch(i64),
|
TriggerAutomaticSearch(i64),
|
||||||
UpdateAllMovies,
|
UpdateAllMovies,
|
||||||
UpdateAndScan(Option<i64>),
|
UpdateAndScan(i64),
|
||||||
UpdateCollections,
|
UpdateCollections,
|
||||||
UpdateDownloads,
|
UpdateDownloads,
|
||||||
}
|
}
|
||||||
@@ -1778,13 +1778,12 @@ impl<'a, 'b> Network<'a, 'b> {
|
|||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn update_and_scan_movie(&mut self, movie_id: Option<i64>) -> Result<Value> {
|
async fn update_and_scan_movie(&mut self, movie_id: i64) -> Result<Value> {
|
||||||
let (id, _) = self.extract_movie_id(movie_id).await;
|
let event = RadarrEvent::UpdateAndScan(movie_id);
|
||||||
let event = RadarrEvent::UpdateAndScan(None);
|
info!("Updating and scanning movie with ID: {movie_id}");
|
||||||
info!("Updating and scanning movie with ID: {id}");
|
|
||||||
let body = MovieCommandBody {
|
let body = MovieCommandBody {
|
||||||
name: "RefreshMovie".to_owned(),
|
name: "RefreshMovie".to_owned(),
|
||||||
movie_ids: vec![id],
|
movie_ids: vec![movie_id],
|
||||||
};
|
};
|
||||||
|
|
||||||
let request_props = self
|
let request_props = self
|
||||||
@@ -1857,23 +1856,6 @@ impl<'a, 'b> Network<'a, 'b> {
|
|||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn extract_movie_id(&mut self, movie_id: Option<i64>) -> (i64, String) {
|
|
||||||
let movie_id = if let Some(id) = movie_id {
|
|
||||||
id
|
|
||||||
} else {
|
|
||||||
self
|
|
||||||
.app
|
|
||||||
.lock()
|
|
||||||
.await
|
|
||||||
.data
|
|
||||||
.radarr_data
|
|
||||||
.movies
|
|
||||||
.current_selection()
|
|
||||||
.id
|
|
||||||
};
|
|
||||||
(movie_id, format!("movieId={movie_id}"))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_movie_status(has_file: bool, downloads_vec: &[DownloadRecord], movie_id: i64) -> String {
|
fn get_movie_status(has_file: bool, downloads_vec: &[DownloadRecord], movie_id: i64) -> String {
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ mod test {
|
|||||||
RadarrEvent::StartTask(RadarrTaskName::default()),
|
RadarrEvent::StartTask(RadarrTaskName::default()),
|
||||||
RadarrEvent::GetQueuedEvents,
|
RadarrEvent::GetQueuedEvents,
|
||||||
RadarrEvent::TriggerAutomaticSearch(0),
|
RadarrEvent::TriggerAutomaticSearch(0),
|
||||||
RadarrEvent::UpdateAndScan(None),
|
RadarrEvent::UpdateAndScan(0),
|
||||||
RadarrEvent::UpdateAllMovies,
|
RadarrEvent::UpdateAllMovies,
|
||||||
RadarrEvent::UpdateDownloads,
|
RadarrEvent::UpdateDownloads,
|
||||||
RadarrEvent::UpdateCollections
|
RadarrEvent::UpdateCollections
|
||||||
@@ -988,39 +988,7 @@ mod test {
|
|||||||
})),
|
})),
|
||||||
Some(json!({})),
|
Some(json!({})),
|
||||||
None,
|
None,
|
||||||
RadarrEvent::UpdateAndScan(None),
|
RadarrEvent::UpdateAndScan(1),
|
||||||
None,
|
|
||||||
None,
|
|
||||||
)
|
|
||||||
.await;
|
|
||||||
app_arc
|
|
||||||
.lock()
|
|
||||||
.await
|
|
||||||
.data
|
|
||||||
.radarr_data
|
|
||||||
.movies
|
|
||||||
.set_items(vec![movie()]);
|
|
||||||
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
|
||||||
|
|
||||||
assert!(network
|
|
||||||
.handle_radarr_event(RadarrEvent::UpdateAndScan(None))
|
|
||||||
.await
|
|
||||||
.is_ok());
|
|
||||||
|
|
||||||
async_server.assert_async().await;
|
|
||||||
}
|
|
||||||
|
|
||||||
#[tokio::test]
|
|
||||||
async fn test_handle_update_and_scan_movie_event_uses_provied_movie_id() {
|
|
||||||
let (async_server, app_arc, _server) = mock_servarr_api(
|
|
||||||
RequestMethod::Post,
|
|
||||||
Some(json!({
|
|
||||||
"name": "RefreshMovie",
|
|
||||||
"movieIds": [ 1 ]
|
|
||||||
})),
|
|
||||||
Some(json!({})),
|
|
||||||
None,
|
|
||||||
RadarrEvent::UpdateAndScan(None),
|
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
@@ -1028,7 +996,7 @@ mod test {
|
|||||||
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
||||||
|
|
||||||
assert!(network
|
assert!(network
|
||||||
.handle_radarr_event(RadarrEvent::UpdateAndScan(Some(1)))
|
.handle_radarr_event(RadarrEvent::UpdateAndScan(1))
|
||||||
.await
|
.await
|
||||||
.is_ok());
|
.is_ok());
|
||||||
|
|
||||||
@@ -3954,65 +3922,6 @@ mod test {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
|
||||||
async fn test_extract_movie_id() {
|
|
||||||
let app_arc = Arc::new(Mutex::new(App::default()));
|
|
||||||
app_arc
|
|
||||||
.lock()
|
|
||||||
.await
|
|
||||||
.data
|
|
||||||
.radarr_data
|
|
||||||
.movies
|
|
||||||
.set_items(vec![Movie {
|
|
||||||
id: 1,
|
|
||||||
..Movie::default()
|
|
||||||
}]);
|
|
||||||
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
|
||||||
|
|
||||||
let (id, movie_id_param) = network.extract_movie_id(None).await;
|
|
||||||
|
|
||||||
assert_eq!(id, 1);
|
|
||||||
assert_str_eq!(movie_id_param, "movieId=1");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[tokio::test]
|
|
||||||
async fn test_extract_movie_id_uses_provided_id() {
|
|
||||||
let app_arc = Arc::new(Mutex::new(App::default()));
|
|
||||||
app_arc
|
|
||||||
.lock()
|
|
||||||
.await
|
|
||||||
.data
|
|
||||||
.radarr_data
|
|
||||||
.movies
|
|
||||||
.set_items(vec![Movie {
|
|
||||||
id: 1,
|
|
||||||
..Movie::default()
|
|
||||||
}]);
|
|
||||||
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
|
||||||
|
|
||||||
let (id, movie_id_param) = network.extract_movie_id(Some(2)).await;
|
|
||||||
|
|
||||||
assert_eq!(id, 2);
|
|
||||||
assert_str_eq!(movie_id_param, "movieId=2");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[tokio::test]
|
|
||||||
async fn test_extract_movie_id_filtered_movies() {
|
|
||||||
let app_arc = Arc::new(Mutex::new(App::default()));
|
|
||||||
let mut filtered_movies = StatefulTable::default();
|
|
||||||
filtered_movies.set_filtered_items(vec![Movie {
|
|
||||||
id: 1,
|
|
||||||
..Movie::default()
|
|
||||||
}]);
|
|
||||||
app_arc.lock().await.data.radarr_data.movies = filtered_movies;
|
|
||||||
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
|
||||||
|
|
||||||
let (id, movie_id_param) = network.extract_movie_id(None).await;
|
|
||||||
|
|
||||||
assert_eq!(id, 1);
|
|
||||||
assert_str_eq!(movie_id_param, "movieId=1");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_get_movie_status_downloaded() {
|
fn test_get_movie_status_downloaded() {
|
||||||
assert_str_eq!(get_movie_status(true, &[], 0), "Downloaded");
|
assert_str_eq!(get_movie_status(true, &[], 0), "Downloaded");
|
||||||
|
|||||||
Reference in New Issue
Block a user