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