1use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
5use serde::{ Deserialize, Serialize };
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct ActivityInfoData {
10 pub id: u64,
12 pub stime: i64,
14 pub etime: i64,
16 pub ctime: i64,
18 pub mtime: i64,
20 pub name: String,
22 pub act_url: String,
24 pub cover: String,
26 pub dic: String,
28 pub h5_cover: String,
30 pub android_url: String,
32 pub ios_url: String,
34 pub child_sids: String,
36 pub lid: Option<i64>,
38}
39
40impl BpiClient {
41 pub async fn activity_info(
52 &self,
53 sid: u64,
54 bvid: Option<&str>
55 ) -> Result<BpiResponse<ActivityInfoData>, BpiError> {
56 let mut params = vec![("sid", sid.to_string())];
57
58 if let Some(bvid) = bvid {
59 params.push(("bvid", bvid.to_string()));
60 }
61
62 let result = self
63 .get("https://api.bilibili.com/x/activity/subject/info")
64 .query(¶ms)
65 .send_bpi("获取活动主题信息").await?;
66
67 Ok(result)
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 use super::*;
74
75 #[tokio::test]
76 async fn test_activity_info() -> Result<(), Box<BpiError>> {
77 let bpi = BpiClient::new();
78 let sid = 4017552;
79 let bvid = Some("BV1mKY4e8ELy");
80
81 let result = bpi.activity_info(sid, bvid).await?;
82 let data = result.into_data()?;
83 tracing::info!("{:#?}", data);
84
85 Ok(())
86 }
87
88 #[tokio::test]
89 async fn test_activity_info_without_bvid() -> Result<(), Box<BpiError>> {
90 let bpi = BpiClient::new();
91 let sid = 4017552;
92
93 let result = bpi.activity_info(sid, None).await?;
94 let data = result.into_data()?;
95 tracing::info!("{:#?}", data);
96
97 assert_eq!(data.id, sid);
98
99 Ok(())
100 }
101}