autopulse_service/settings/triggers/
radarr.rs1use 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 pub rewrite: Option<Rewrite>,
11 pub timer: Option<Timer>,
13 #[serde(default)]
15 pub excludes: Vec<String>,
16 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}