autopulse_service/settings/triggers/
radarr.rs

1use 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    /// 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
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}