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    pub ids: Option<RsIds>,
80
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub page_key: Option<String>
83}
84#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
85#[serde(rename_all = "camelCase")]
86pub struct RsLookupSong {
87    pub title: Option<String>,
88    pub author: Option<String>,
89    pub album: Option<String>,
90    pub ids: Option<RsIds>,
91
92    #[serde(skip_serializing_if = "Option::is_none")]
93    pub page_key: Option<String>
94}
95
96#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
97#[serde(rename_all = "camelCase")]
98pub struct RsLookupMedia {
99    pub search: Option<String>,
100    pub ids: Option<RsIds>,
101
102    #[serde(skip_serializing_if = "Option::is_none")]
103    pub page_key: Option<String>
104}
105
106#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
107#[serde(rename_all = "camelCase")]
108pub struct RsLookupMovie {
109    pub name: Option<String>,
110    pub ids: Option<RsIds>,
111
112    #[serde(skip_serializing_if = "Option::is_none")]
113    pub page_key: Option<String>
114}
115
116#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, strum_macros::Display, EnumString)]
117#[serde(rename_all = "camelCase")]
118#[strum(serialize_all = "camelCase")]
119pub enum RsLookupQuery {
120    Book(RsLookupBook),
121    Media(RsLookupMedia),
122    Episode(RsLookupEpisode),
123    Movie(RsLookupMovie),
124    Person(RsLookupPerson),
125    Serie(RsLookupSerie),
126    SerieSeason(RsLookupSerieSeason),
127    Song(RsLookupSong),
128}
129
130#[derive(
131    Debug, Serialize, Deserialize, Clone, PartialEq, strum_macros::Display, EnumString,
132)]
133#[serde(rename_all = "camelCase")]
134#[strum(serialize_all = "camelCase")]
135pub enum RsLookupMatchType {
136    ExactId,
137    ExactText,
138}
139
140#[derive(
141    Debug, Serialize, Deserialize, Clone, PartialEq, strum_macros::Display, EnumString, Default,
142)]
143#[serde(rename_all = "camelCase")]
144#[strum(serialize_all = "camelCase")]
145pub enum RsLookupMetadataResult {
146    Book(Book),
147    Media(Media),
148    Episode(Episode),
149    Movie(Movie),
150    Person(Person),
151    Serie(Serie),
152    #[default]
153    None,
154}
155
156impl RsLookupMetadataResult {
157    /// Extract all IDs from the inner entity as an `RsIds` set.
158    pub fn extract_ids(&self) -> Option<RsIds> {
159        match self {
160            Self::Movie(m) => Some(RsIds::from(m.clone())),
161            Self::Serie(s) => Some(RsIds::from(s.clone())),
162            Self::Book(b) => Some(RsIds::from(b.clone())),
163            Self::Person(p) => Some(RsIds::from(p.clone())),
164            Self::Episode(e) => Some(RsIds::from(e.clone())),
165            Self::Media(_) | Self::None => None,
166        }
167    }
168
169    /// Apply merged IDs back onto the inner entity.
170    pub fn apply_ids(&mut self, ids: &RsIds) {
171        match self {
172            Self::Movie(m) => m.apply_rs_ids(ids),
173            Self::Serie(s) => s.apply_rs_ids(ids),
174            Self::Book(b) => b.apply_rs_ids(ids),
175            Self::Person(p) => p.apply_rs_ids(ids),
176            Self::Episode(e) => e.apply_rs_ids(ids),
177            Self::Media(_) | Self::None => {}
178        }
179    }
180}
181
182#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq)]
183#[serde(rename_all = "camelCase")]
184pub struct RsLookupMetadataResults {
185    pub results: Vec<RsLookupMetadataResultWrapper>,
186
187    #[serde(skip_serializing_if = "Option::is_none")]
188    pub next_page_key: Option<String>,
189    
190}
191
192#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq)]
193#[serde(rename_all = "camelCase")]
194pub struct RsLookupMetadataResultWrapper {
195    pub metadata: RsLookupMetadataResult,
196
197    #[serde(skip_serializing_if = "Option::is_none")]
198    pub relations: Option<Relations>,
199
200    #[serde(skip_serializing_if = "Option::is_none")]
201    pub match_type: Option<RsLookupMatchType>,
202
203}
204
205#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
206#[serde(rename_all = "camelCase")]
207pub struct RsLookupWrapper {
208    pub query: RsLookupQuery,
209    pub credential: Option<PluginCredential>,
210    pub params: Option<HashMap<String, CustomParamTypes>>,
211}