Skip to main content

rs_plugin_common_interfaces/lookup/
mod.rs

1use std::collections::HashMap;
2
3use crate::domain::Relations;
4use crate::domain::book::Book;
5use crate::domain::episode::Episode;
6use crate::domain::media::Media;
7use crate::domain::movie::Movie;
8use crate::domain::person::Person;
9use crate::domain::serie::Serie;
10use crate::{CustomParamTypes, PluginCredential};
11use crate::request::RsGroupDownload;
12use crate::domain::rs_ids::{ApplyRsIds, RsIds};
13use crate::request::RsRequest;
14use serde::{Deserialize, Serialize};
15use strum_macros::EnumString;
16
17#[derive(
18    Debug, Serialize, Deserialize, Clone, PartialEq, strum_macros::Display, EnumString, Default,
19)]
20#[serde(rename_all = "camelCase")]
21#[strum(serialize_all = "camelCase")]
22pub enum RsLookupSourceResult {
23    Requests(Vec<RsRequest>),
24    GroupRequest(Vec<RsGroupDownload>),
25    NotFound,
26    #[default]
27    NotApplicable,
28}
29
30#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
31#[serde(rename_all = "camelCase")]
32pub struct RsLookupPerson {
33    pub name: Option<String>,
34    pub ids: Option<RsIds>,
35
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub page_key: Option<String>
38
39    
40}
41
42#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
43#[serde(rename_all = "camelCase")]
44pub struct RsLookupSerie {
45    pub name: Option<String>,
46    pub ids: Option<RsIds>,
47
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub page_key: Option<String>
50}
51
52#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
53#[serde(rename_all = "camelCase")]
54pub struct RsLookupSerieSeason {
55    pub name: Option<String>,
56    pub ids: Option<RsIds>,
57
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub page_key: Option<String>
60}
61
62#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
63#[serde(rename_all = "camelCase")]
64pub struct RsLookupEpisode {
65    pub name: Option<String>,
66    pub ids: Option<RsIds>,
67
68    pub season: u32,
69    pub number: Option<u32>,
70
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub page_key: Option<String>
73}
74
75#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
76#[serde(rename_all = "camelCase")]
77pub struct RsLookupBook {
78    pub name: Option<String>,
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub author: Option<String>,
81    pub ids: Option<RsIds>,
82
83    #[serde(skip_serializing_if = "Option::is_none")]
84    pub page_key: Option<String>
85}
86#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
87#[serde(rename_all = "camelCase")]
88pub struct RsLookupSong {
89    pub title: Option<String>,
90    pub author: Option<String>,
91    pub album: Option<String>,
92    pub ids: Option<RsIds>,
93
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub page_key: Option<String>
96}
97
98#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
99#[serde(rename_all = "camelCase")]
100pub struct RsLookupMedia {
101    pub search: Option<String>,
102    pub ids: Option<RsIds>,
103
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub page_key: Option<String>
106}
107
108#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
109#[serde(rename_all = "camelCase")]
110pub struct RsLookupMovie {
111    pub name: Option<String>,
112    pub ids: Option<RsIds>,
113
114    #[serde(skip_serializing_if = "Option::is_none")]
115    pub page_key: Option<String>
116}
117
118#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, strum_macros::Display, EnumString)]
119#[serde(rename_all = "camelCase")]
120#[strum(serialize_all = "camelCase")]
121pub enum RsLookupQuery {
122    Book(RsLookupBook),
123    Media(RsLookupMedia),
124    Episode(RsLookupEpisode),
125    Movie(RsLookupMovie),
126    Person(RsLookupPerson),
127    Serie(RsLookupSerie),
128    SerieSeason(RsLookupSerieSeason),
129    Song(RsLookupSong),
130}
131
132#[derive(
133    Debug, Serialize, Deserialize, Clone, PartialEq, strum_macros::Display, EnumString,
134)]
135#[serde(rename_all = "camelCase")]
136#[strum(serialize_all = "camelCase")]
137pub enum RsLookupMatchType {
138    ExactId,
139    ExactText,
140}
141
142#[derive(
143    Debug, Serialize, Deserialize, Clone, PartialEq, strum_macros::Display, EnumString, Default,
144)]
145#[serde(rename_all = "camelCase")]
146#[strum(serialize_all = "camelCase")]
147pub enum RsLookupMetadataResult {
148    Book(Book),
149    Media(Media),
150    Episode(Episode),
151    Movie(Movie),
152    Person(Person),
153    Serie(Serie),
154    #[default]
155    None,
156}
157
158impl RsLookupMetadataResult {
159    /// Extract all IDs from the inner entity as an `RsIds` set.
160    pub fn extract_ids(&self) -> Option<RsIds> {
161        match self {
162            Self::Movie(m) => Some(RsIds::from(m.clone())),
163            Self::Serie(s) => Some(RsIds::from(s.clone())),
164            Self::Book(b) => Some(RsIds::from(b.clone())),
165            Self::Person(p) => Some(RsIds::from(p.clone())),
166            Self::Episode(e) => Some(RsIds::from(e.clone())),
167            Self::Media(_) | Self::None => None,
168        }
169    }
170
171    /// Apply merged IDs back onto the inner entity.
172    pub fn apply_ids(&mut self, ids: &RsIds) {
173        match self {
174            Self::Movie(m) => m.apply_rs_ids(ids),
175            Self::Serie(s) => s.apply_rs_ids(ids),
176            Self::Book(b) => b.apply_rs_ids(ids),
177            Self::Person(p) => p.apply_rs_ids(ids),
178            Self::Episode(e) => e.apply_rs_ids(ids),
179            Self::Media(_) | Self::None => {}
180        }
181    }
182}
183
184#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq)]
185#[serde(rename_all = "camelCase")]
186pub struct RsLookupMetadataResults {
187    pub results: Vec<RsLookupMetadataResultWrapper>,
188
189    #[serde(skip_serializing_if = "Option::is_none")]
190    pub next_page_key: Option<String>,
191    
192}
193
194#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq)]
195#[serde(rename_all = "camelCase")]
196pub struct RsLookupMetadataResultWrapper {
197    pub metadata: RsLookupMetadataResult,
198
199    #[serde(skip_serializing_if = "Option::is_none")]
200    pub relations: Option<Relations>,
201
202    #[serde(skip_serializing_if = "Option::is_none")]
203    pub match_type: Option<RsLookupMatchType>,
204
205}
206
207#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
208#[serde(rename_all = "camelCase")]
209pub struct RsLookupWrapper {
210    pub query: RsLookupQuery,
211    pub credential: Option<PluginCredential>,
212    pub params: Option<HashMap<String, CustomParamTypes>>,
213}