autopulse_service/settings/triggers/
lidarr.rs

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