Skip to main content

autopulse_service/settings/triggers/
lidarr.rs

1use 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    /// Rewrite path
13    pub rewrite: Option<Rewrite>,
14    /// Timer settings
15    pub timer: Option<Timer>,
16    /// Targets to ignore
17    #[serde(default)]
18    pub excludes: Vec<String>,
19    /// Path filter matched against the rewritten file path.
20    #[serde(default)]
21    pub filter: PathFilter,
22    /// Event-specific timers
23    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// Based on https://github.com/Lidarr/Lidarr/blob/develop/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs
71#[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}