animebytes_rs/models/
search.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::{errors, Client};
6
7impl Client {
8    /// Searches for anime with a given search string.
9    /// # Example
10    /// ```rust
11    /// # async fn run() -> Result<(), animebytes_rs::errors::Error> {
12    /// let client = animebytes_rs::Client::new("password", "username")?;
13    ///
14    /// let search_result = client.search_anime("hyouka").await?;
15    ///
16    /// println!("{:?}", search_result);
17    /// Ok(())
18    /// # }
19    /// ```
20    /// # Errors
21    /// This method will fail if there's any issue with username, password or if
22    /// there's an HTTP error.
23    pub async fn search_anime(&self, search: &str) -> Result<SearchDTO, errors::Error> {
24        self.get(&format!(
25            "https://animebytes.tv/scrape.php?torrent_pass={}&username={}&type=anime&searchstr={}",
26            self.torrent_pass, self.username, search
27        ))
28        .await
29    }
30}
31
32#[derive(Debug, Serialize, Deserialize)]
33pub struct SearchDTO {
34    #[serde(rename = "Matches")]
35    pub matches: i64,
36    #[serde(rename = "Limit")]
37    pub limit: i64,
38    #[serde(rename = "Results")]
39    pub results: String,
40    #[serde(rename = "Groups")]
41    pub groups: Vec<Group>,
42}
43
44#[derive(Debug, Serialize, Deserialize)]
45pub struct Group {
46    #[serde(rename = "ID")]
47    pub id: i64,
48    #[serde(rename = "CategoryName")]
49    pub category_name: CategoryName,
50    #[serde(rename = "FullName")]
51    pub full_name: String,
52    #[serde(rename = "GroupName")]
53    pub group_name: String,
54    #[serde(rename = "SeriesID")]
55    pub series_id: String,
56    #[serde(rename = "SeriesName")]
57    pub series_name: String,
58    #[serde(rename = "Artists")]
59    pub artists: Option<serde_json::Value>,
60    #[serde(rename = "Year")]
61    pub year: String,
62    #[serde(rename = "Image")]
63    pub image: String,
64    #[serde(rename = "Synonymns")]
65    pub synonymns: Synonymns,
66    #[serde(rename = "Snatched")]
67    pub snatched: i64,
68    #[serde(rename = "Comments")]
69    pub comments: i64,
70    #[serde(rename = "Links")]
71    pub links: LinksUnion,
72    #[serde(rename = "Votes")]
73    pub votes: i64,
74    #[serde(rename = "AvgVote")]
75    pub avg_vote: f64,
76    #[serde(rename = "Associations")]
77    pub associations: Option<serde_json::Value>,
78    #[serde(rename = "Description")]
79    pub description: String,
80    #[serde(rename = "DescriptionHTML")]
81    pub description_html: String,
82    #[serde(rename = "EpCount")]
83    pub ep_count: i64,
84    #[serde(rename = "StudioList")]
85    pub studio_list: Option<String>,
86    #[serde(rename = "PastWeek")]
87    pub past_week: i64,
88    #[serde(rename = "Incomplete")]
89    pub incomplete: bool,
90    #[serde(rename = "Ongoing")]
91    pub ongoing: bool,
92    #[serde(rename = "Tags")]
93    pub tags: Vec<String>,
94    #[serde(rename = "Torrents")]
95    pub torrents: Vec<Torrent>,
96}
97
98#[derive(Debug, Serialize, Deserialize)]
99pub struct LinksClass {
100    #[serde(rename = "AniDB")]
101    pub ani_db: Option<String>,
102    #[serde(rename = "ANN")]
103    pub ann: Option<String>,
104    #[serde(rename = "Wikipedia")]
105    pub wikipedia: Option<String>,
106    #[serde(rename = "MAL")]
107    pub mal: Option<String>,
108    #[serde(rename = "Manga-Updates")]
109    pub manga_updates: Option<String>,
110}
111
112#[derive(Debug, Serialize, Deserialize)]
113pub struct Torrent {
114    #[serde(rename = "ID")]
115    pub id: i64,
116    #[serde(rename = "EditionData")]
117    pub edition_data: EditionData,
118    #[serde(rename = "RawDownMultiplier")]
119    pub raw_down_multiplier: f64,
120    #[serde(rename = "RawUpMultiplier")]
121    pub raw_up_multiplier: f64,
122    #[serde(rename = "Link")]
123    pub link: String,
124    #[serde(rename = "Property")]
125    pub property: String,
126    #[serde(rename = "Snatched")]
127    pub snatched: i64,
128    #[serde(rename = "Seeders")]
129    pub seeders: i64,
130    #[serde(rename = "Leechers")]
131    pub leechers: i64,
132    #[serde(rename = "Size")]
133    pub size: i64,
134    #[serde(rename = "FileCount")]
135    pub file_count: i64,
136    #[serde(rename = "UploadTime")]
137    pub upload_time: String,
138}
139
140#[derive(Debug, Serialize, Deserialize)]
141pub struct EditionData {
142    #[serde(rename = "EditionTitle")]
143    pub edition_title: String,
144    #[serde(rename = "ReleaseDate")]
145    pub release_date: Option<String>,
146}
147
148#[derive(Debug, Serialize, Deserialize)]
149#[serde(untagged)]
150pub enum LinksUnion {
151    AnythingArray(Vec<Option<serde_json::Value>>),
152    LinksClass(LinksClass),
153}
154
155#[derive(Debug, Serialize, Deserialize)]
156#[serde(untagged)]
157pub enum Synonymns {
158    StringArray(Vec<String>),
159    StringMap(HashMap<String, String>),
160}
161
162#[derive(Debug, Serialize, Deserialize)]
163pub enum CategoryName {
164    Anime,
165    Artbook,
166    Game,
167    #[serde(rename = "Light Novel")]
168    LightNovel,
169    Manga,
170}