Skip to main content

autopulse_service/settings/triggers/
radarr.rs

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