Skip to main content

autopulse_service/settings/triggers/
lidarr.rs

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