Skip to main content

autopulse_service/settings/triggers/
radarr.rs

1use crate::settings::path_filter::PathFilter;
2use crate::settings::rewrite::Rewrite;
3use crate::settings::timer::{EventTimers, Timer};
4use crate::settings::triggers::{TriggerConfig, TriggerRequest};
5use autopulse_utils::join_path;
6use serde::{Deserialize, Serialize};
7
8#[derive(Serialize, Deserialize, Clone)]
9pub struct Radarr {
10    /// Rewrite path
11    pub rewrite: Option<Rewrite>,
12    /// Timer settings
13    pub timer: Option<Timer>,
14    /// Targets to ignore
15    #[serde(default)]
16    pub excludes: Vec<String>,
17    /// Path filter matched against the rewritten file path.
18    #[serde(default)]
19    pub filter: PathFilter,
20    /// Event-specific timers
21    pub event_timers: Option<EventTimers>,
22}
23
24impl TriggerConfig for Radarr {
25    fn rewrite(&self) -> Option<&Rewrite> {
26        self.rewrite.as_ref()
27    }
28
29    fn timer(&self) -> Option<&Timer> {
30        self.timer.as_ref()
31    }
32
33    fn excludes(&self) -> &Vec<String> {
34        &self.excludes
35    }
36
37    fn filter(&self) -> &PathFilter {
38        &self.filter
39    }
40
41    fn event_timers(&self) -> Option<&EventTimers> {
42        self.event_timers.as_ref()
43    }
44}
45
46#[derive(Deserialize, Clone)]
47#[serde(rename_all = "camelCase")]
48#[doc(hidden)]
49pub struct MovieFile {
50    pub relative_path: String,
51}
52
53#[derive(Deserialize, Clone)]
54#[serde(rename_all = "camelCase")]
55#[doc(hidden)]
56pub struct Movie {
57    pub folder_path: String,
58}
59
60#[derive(Deserialize, Clone)]
61#[serde(tag = "eventType")]
62#[doc(hidden)]
63pub enum RadarrRequest {
64    #[serde(rename = "Download")]
65    #[serde(rename_all = "camelCase")]
66    Download {
67        movie_file: MovieFile,
68        movie: Movie,
69        #[serde(default)]
70        deleted_files: Vec<MovieFile>,
71    },
72    #[serde(rename = "MovieDelete")]
73    #[serde(rename_all = "camelCase")]
74    MovieDelete { movie: Movie },
75    #[serde(rename = "MovieFileDelete")]
76    #[serde(rename_all = "camelCase")]
77    MovieFileDelete { movie_file: MovieFile, movie: Movie },
78    #[serde(rename = "Rename")]
79    #[serde(rename_all = "camelCase")]
80    Rename { movie: Movie },
81    #[serde(rename = "Test")]
82    Test,
83    #[serde(other)]
84    Other,
85}
86
87impl TriggerRequest for RadarrRequest {
88    fn from_json(json: serde_json::Value) -> anyhow::Result<Self> {
89        serde_json::from_value(json).map_err(|e| anyhow::anyhow!(e))
90    }
91    fn paths(&self) -> Vec<(String, bool)> {
92        match self {
93            Self::MovieFileDelete { movie, movie_file } => {
94                vec![(
95                    join_path(&movie.folder_path, &movie_file.relative_path),
96                    false,
97                )]
98            }
99            Self::Rename { movie } => {
100                vec![(movie.folder_path.clone(), true)]
101            }
102            Self::MovieDelete { movie } => {
103                vec![(movie.folder_path.clone(), false)]
104            }
105            Self::Download {
106                movie,
107                movie_file,
108                deleted_files,
109            } => {
110                let mut paths = vec![(
111                    join_path(&movie.folder_path, &movie_file.relative_path),
112                    true,
113                )];
114
115                for file in deleted_files {
116                    paths.push((join_path(&movie.folder_path, &file.relative_path), false));
117                }
118
119                paths
120            }
121            Self::Test | Self::Other => vec![],
122        }
123    }
124}