autopulse_service/settings/triggers/
readarr.rs

1use crate::settings::rewrite::Rewrite;
2use crate::settings::timer::{EventTimers, Timer};
3use crate::settings::triggers::TriggerRequest;
4use serde::{Deserialize, Serialize};
5
6#[derive(Serialize, Deserialize, Clone)]
7pub struct Readarr {
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 BookFile {
23    path: String,
24}
25
26#[derive(Deserialize, Clone)]
27#[serde(rename_all = "camelCase")]
28#[doc(hidden)]
29pub struct RenamedBookFile {
30    path: String,
31    previous_path: String,
32}
33
34#[derive(Deserialize, Clone)]
35#[serde(rename_all = "camelCase")]
36#[doc(hidden)]
37pub struct Author {
38    path: String,
39}
40
41// Based on https://github.com/Readarr/Readarr/blob/develop/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs
42#[derive(Deserialize, Clone)]
43#[serde(tag = "eventType")]
44#[doc(hidden)]
45pub enum ReadarrRequest {
46    #[serde(rename = "Download")]
47    #[serde(rename_all = "camelCase")]
48    Download { book_files: Vec<BookFile> },
49    #[serde(rename = "Rename")]
50    #[serde(rename_all = "camelCase")]
51    Rename {
52        renamed_book_files: Vec<RenamedBookFile>,
53    },
54    #[serde(rename = "AuthorDelete")]
55    #[serde(rename_all = "camelCase")]
56    AuthorDelete { author: Author },
57    #[serde(rename = "BookDelete")]
58    #[serde(rename_all = "camelCase")]
59    BookDelete { author: Author },
60    #[serde(rename = "BookFileDelete")]
61    #[serde(rename_all = "camelCase")]
62    BookFileDelete { book_file: BookFile },
63    #[serde(rename = "Test")]
64    Test,
65}
66
67impl TriggerRequest for ReadarrRequest {
68    fn from_json(json: serde_json::Value) -> anyhow::Result<Self> {
69        serde_json::from_value(json).map_err(|e| anyhow::anyhow!(e))
70    }
71    fn paths(&self) -> Vec<(String, bool)> {
72        match self {
73            Self::Download { book_files } => book_files
74                .iter()
75                .map(|book_file| (book_file.path.clone(), true))
76                .collect(),
77            Self::Rename { renamed_book_files } => {
78                let mut paths = vec![];
79
80                for file in renamed_book_files {
81                    paths.push((file.previous_path.clone(), false));
82                    paths.push((file.path.clone(), true));
83                }
84
85                paths
86            }
87            Self::AuthorDelete { author } | Self::BookDelete { author } => {
88                vec![(author.path.clone(), false)]
89            }
90            Self::BookFileDelete { book_file } => {
91                vec![(book_file.path.clone(), false)]
92            }
93            Self::Test => vec![],
94        }
95    }
96}