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("获取活动主题信息")
66 .await?;
67
68 Ok(result)
69 }
70}
71
72#[cfg(test)]
73mod tests {
74 use super::*;
75
76 #[tokio::test]
77 async fn test_activity_info() -> Result<(), Box<BpiError>> {
78 let bpi = BpiClient::new();
79 let sid = 4017552;
80 let bvid = Some("BV1mKY4e8ELy");
81
82 let result = bpi.activity_info(sid, bvid).await?;
83 let data = result.into_data()?;
84 tracing::info!("{:#?}", data);
85
86 Ok(())
87 }
88
89 #[tokio::test]
90 async fn test_activity_info_without_bvid() -> Result<(), Box<BpiError>> {
91 let bpi = BpiClient::new();
92 let sid = 4017552;
93
94 let result = bpi.activity_info(sid, None).await?;
95 let data = result.into_data()?;
96 tracing::info!("{:#?}", data);
97
98 assert_eq!(data.id, sid);
99
100 Ok(())
101 }
102}