autopulse_service/settings/triggers/
radarr.rs1use crate::settings::rewrite::Rewrite;
2use crate::settings::timer::{EventTimers, Timer};
3use crate::settings::triggers::TriggerRequest;
4use autopulse_utils::join_path;
5use serde::{Deserialize, Serialize};
6
7#[derive(Serialize, Deserialize, Clone)]
8pub struct Radarr {
9 pub rewrite: Option<Rewrite>,
11 pub timer: Option<Timer>,
13 #[serde(default)]
15 pub excludes: Vec<String>,
16 pub event_timers: Option<EventTimers>,
18}
19
20#[derive(Deserialize, Clone)]
21#[serde(rename_all = "camelCase")]
22#[doc(hidden)]
23pub struct MovieFile {
24 pub relative_path: String,
25}
26
27#[derive(Deserialize, Clone)]
28#[serde(rename_all = "camelCase")]
29#[doc(hidden)]
30pub struct Movie {
31 pub folder_path: String,
32}
33
34#[derive(Deserialize, Clone)]
35#[serde(tag = "eventType")]
36#[doc(hidden)]
37pub enum RadarrRequest {
38 #[serde(rename = "Download")]
39 #[serde(rename_all = "camelCase")]
40 Download {
41 movie_file: MovieFile,
42 movie: Movie,
43 #[serde(default)]
44 deleted_files: Vec<MovieFile>,
45 },
46 #[serde(rename = "MovieDelete")]
47 #[serde(rename_all = "camelCase")]
48 MovieDelete { movie: Movie },
49 #[serde(rename = "MovieFileDelete")]
50 #[serde(rename_all = "camelCase")]
51 MovieFileDelete { movie_file: MovieFile, movie: Movie },
52 #[serde(rename = "Rename")]
53 #[serde(rename_all = "camelCase")]
54 Rename { movie: Movie },
55 #[serde(rename = "Test")]
56 Test,
57}
58
59impl TriggerRequest for RadarrRequest {
60 fn from_json(json: serde_json::Value) -> anyhow::Result<Self> {
61 serde_json::from_value(json).map_err(|e| anyhow::anyhow!(e))
62 }
63 fn paths(&self) -> Vec<(String, bool)> {
64 match self {
65 Self::MovieFileDelete { movie, movie_file } => {
66 vec![(
67 join_path(&movie.folder_path, &movie_file.relative_path),
68 false,
69 )]
70 }
71 Self::Rename { movie } => {
72 vec![(movie.folder_path.clone(), true)]
73 }
74 Self::MovieDelete { movie } => {
75 vec![(movie.folder_path.clone(), false)]
76 }
77 Self::Download {
78 movie,
79 movie_file,
80 deleted_files,
81 } => {
82 let mut paths = vec![(
83 join_path(&movie.folder_path, &movie_file.relative_path),
84 true,
85 )];
86
87 for file in deleted_files {
88 paths.push((join_path(&movie.folder_path, &file.relative_path), false));
89 }
90
91 paths
92 }
93 Self::Test => vec![],
94 }
95 }
96}