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