bangumi_api/module/episode/
service.rs

1use anyhow::Result;
2use reqwest::Method;
3
4use crate::{common::model::BangumiClient, module::model::Paged};
5
6use super::model::{Episode, EpisodeType};
7
8impl BangumiClient {
9    /// 获取指定条目的剧集列表
10    ///
11    /// 支持按剧集类型筛选,并提供分页功能,用于获取某部作品的所有剧集信息
12    ///
13    /// # 参数
14    /// - `subject_id`: 条目ID(必需,指定要查询的作品)
15    /// - `r#type`: 可选,按剧集类型筛选(如普通剧集、SP、OP等)
16    /// - `limit`: 可选,每页返回的结果数量
17    /// - `offset`: 可选,结果偏移量(用于分页,从0开始)
18    ///
19    /// # 返回
20    /// 返回包含剧集列表的分页结果,每页数据为`Episode`结构体数组
21    pub async fn get_episodes(
22        &self,
23        subject_id: u32,
24        r#type: Option<EpisodeType>,
25        limit: Option<u32>,
26        offset: Option<u32>,
27    ) -> Result<Paged<Episode>> {
28        // 构建剧集列表接口URL
29        let url = format!("{}/v0/episodes", self.base_path);
30
31        // 创建GET请求构建器
32        let mut request_builder = self.request_builder(Method::GET, &url);
33
34        // 添加必需的条目ID查询参数(指定查询哪个作品的剧集)
35        request_builder = request_builder.query(&[("subject_id", &subject_id)]);
36        // 可选:添加剧集类型筛选参数
37        if let Some(ref param_value) = r#type {
38            request_builder = request_builder.query(&[("type", &param_value)]);
39        }
40        // 可选:添加分页参数(每页数量)
41        if let Some(ref param_value) = limit {
42            request_builder = request_builder.query(&[("limit", &param_value)]);
43        }
44        // 可选:添加分页参数(偏移量)
45        if let Some(ref param_value) = offset {
46            request_builder = request_builder.query(&[("offset", &param_value)]);
47        }
48
49        // 发送请求并解析响应为分页的剧集列表
50        let res = self.request_send(request_builder).await?.json().await?;
51
52        Ok(res)
53    }
54
55    /// 获取单个剧集的详细信息
56    ///
57    /// 根据剧集ID查询某一具体剧集的完整信息,包括名称、时长、播出日期等
58    ///
59    /// # 参数
60    /// - `episode_id`: 剧集ID(必需,指定要查询的具体剧集)
61    ///
62    /// # 返回
63    /// 返回包含该剧集详细信息的`Episode`结构体
64    pub async fn get_episode(&self, episode_id: u32) -> Result<Episode> {
65        // 构建单个剧集详情接口URL
66        let url = format!("{}/v0/episodes/{episode_id}", self.base_path);
67
68        // 创建GET请求构建器
69        let request_builder = self.request_builder(Method::GET, &url);
70
71        // 发送请求并解析响应为剧集详情结构体
72        let res = self.request_send(request_builder).await?.json().await?;
73
74        Ok(res)
75    }
76}