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, Serialize};
5
6#[derive(Serialize, Deserialize, Clone)]
7pub struct Lidarr {
8 pub rewrite: Option<Rewrite>,
10 pub timer: Option<Timer>,
12 #[serde(default)]
14 pub excludes: Vec<String>,
15 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#[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}