rs_plugin_common_interfaces/lookup/
mod.rs1use 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 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 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}