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