bangumi_api/module/subject/
service.rs1use anyhow::Result;
2use bytes::Bytes;
3use reqwest::Method;
4
5use crate::{
6 common::model::BangumiClient,
7 module::model::{ImageType, Paged},
8};
9
10use super::model::{
11 DailyCalendarItem, Subject, SubjectBrowseSort, SubjectCategory, SubjectCharacter,
12 SubjectPerson, SubjectSearch, SubjectSubject, SubjectType,
13};
14
15impl BangumiClient {
16 pub async fn get_calendar(&self) -> Result<Vec<DailyCalendarItem>> {
23 let url = format!("{}/calendar", self.base_path);
24
25 let request_builder = self.request_builder(Method::GET, &url);
26
27 let res = self.request_send(request_builder).await?.json().await?;
28
29 Ok(res)
30 }
31
32 pub async fn search_subjects(
44 &self,
45 limit: Option<u32>,
46 offset: Option<u32>,
47 payload: Option<SubjectSearch>,
48 ) -> Result<Paged<Subject>> {
49 let url = format!("{}/v0/search/subjects", self.base_path);
50 let mut request_builder = self.request_builder(Method::POST, &url);
51
52 if let Some(ref limit) = limit {
53 request_builder = request_builder.query(&[("limit", limit)]);
54 }
55
56 if let Some(ref offset) = offset {
57 request_builder = request_builder.query(&[("offset", offset)]);
58 }
59
60 let request_builder = request_builder.json(&payload);
61
62 let res = self.request_send(request_builder).await?.json().await?;
63
64 Ok(res)
65 }
66
67 pub async fn get_subjects(
85 &self,
86 r#type: SubjectType,
87 cat: Option<SubjectCategory>,
88 series: Option<bool>,
89 platform: Option<&str>,
90 sort: Option<SubjectBrowseSort>,
91 year: Option<u32>,
92 month: Option<u32>,
93 limit: Option<u32>,
94 offset: Option<u32>,
95 ) -> Result<Paged<Subject>> {
96 let url = format!("{}/v0/subjects", self.base_path);
97 let mut req_builder = self.request_builder(reqwest::Method::GET, &url);
98
99 req_builder = req_builder.query(&[("type", &r#type)]);
100 if let Some(ref param_value) = cat {
101 req_builder = req_builder.query(&[("cat", ¶m_value)]);
102 }
103 if let Some(ref param_value) = series {
104 req_builder = req_builder.query(&[("series", ¶m_value)]);
105 }
106 if let Some(ref param_value) = platform {
107 req_builder = req_builder.query(&[("platform", ¶m_value)]);
108 }
109 if let Some(ref param_value) = sort {
110 req_builder = req_builder.query(&[("sort", ¶m_value)]);
111 }
112 if let Some(ref param_value) = year {
113 req_builder = req_builder.query(&[("year", ¶m_value)]);
114 }
115 if let Some(ref param_value) = month {
116 req_builder = req_builder.query(&[("month", ¶m_value)]);
117 }
118 if let Some(ref param_value) = limit {
119 req_builder = req_builder.query(&[("limit", ¶m_value)]);
120 }
121 if let Some(ref param_value) = offset {
122 req_builder = req_builder.query(&[("offset", ¶m_value)]);
123 }
124
125 let res = self.request_send(req_builder).await?.json().await?;
126 Ok(res)
127 }
128
129 pub async fn get_subject(&self, subject_id: u32) -> Result<Subject> {
139 let url = format!("{}/v0/subjects/{subject_id}", self.base_path);
140
141 let request_builder = self.request_builder(Method::GET, &url);
142
143 let res = self.request_send(request_builder).await?.json().await?;
144
145 Ok(res)
146 }
147
148 pub async fn get_subject_image(&self, subject_id: u32, r#type: ImageType) -> Result<Bytes> {
159 let url = format!("{}/v0/subjects/{subject_id}/image", self.base_path);
160
161 let mut request_builder = self.request_builder(Method::GET, &url);
162
163 request_builder = request_builder.query(&[("type", &r#type)]);
164
165 let res = self.request_send(request_builder).await?.bytes().await?;
166
167 Ok(res)
168 }
169
170 pub async fn get_subject_persons(&self, subject_id: u32) -> Result<Vec<SubjectPerson>> {
180 let url = format!("{}/v0/subjects/{subject_id}/persons", self.base_path);
181
182 let request_builder = self.request_builder(Method::GET, &url);
183
184 let res = self.request_send(request_builder).await?.json().await?;
185
186 Ok(res)
187 }
188
189 pub async fn get_subject_characters(&self, subject_id: u32) -> Result<Vec<SubjectCharacter>> {
199 let url = format!("{}/v0/subjects/{subject_id}/characters", self.base_path);
200
201 let request_builder = self.request_builder(Method::GET, &url);
202
203 let res = self.request_send(request_builder).await?.json().await?;
204
205 Ok(res)
206 }
207
208 pub async fn get_subject_subjects(&self, subject_id: u32) -> Result<Vec<SubjectSubject>> {
218 let url = format!("{}/v0/subjects/{subject_id}/subjects", self.base_path);
219
220 let request_builder = self.request_builder(Method::GET, &url);
221
222 let res = self.request_send(request_builder).await?.json().await?;
223
224 Ok(res)
225 }
226}