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;
6
7#[derive(Deserialize, Clone)]
8pub struct Radarr {
9 pub rewrite: Option<Rewrite>,
11 #[serde(default)]
13 pub timer: Timer,
14 #[serde(default)]
16 pub excludes: Vec<String>,
17 #[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}