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