use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
use serde::{ Deserialize, Serialize };
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ActivityInfoData {
pub id: u64,
pub stime: i64,
pub etime: i64,
pub ctime: i64,
pub mtime: i64,
pub name: String,
pub act_url: String,
pub cover: String,
pub dic: String,
pub h5_cover: String,
pub android_url: String,
pub ios_url: String,
pub child_sids: String,
pub lid: Option<i64>,
}
impl BpiClient {
pub async fn activity_info(
&self,
sid: u64,
bvid: Option<&str>
) -> Result<BpiResponse<ActivityInfoData>, BpiError> {
let mut params = vec![("sid", sid.to_string())];
if let Some(bvid) = bvid {
params.push(("bvid", bvid.to_string()));
}
let result = self
.get("https://api.bilibili.com/x/activity/subject/info")
.query(¶ms)
.send_bpi("获取活动主题信息").await?;
Ok(result)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_activity_info() -> Result<(), Box<BpiError>> {
let bpi = BpiClient::new();
let sid = 4017552;
let bvid = Some("BV1mKY4e8ELy");
let result = bpi.activity_info(sid, bvid).await?;
let data = result.into_data()?;
tracing::info!("{:#?}", data);
Ok(())
}
#[tokio::test]
async fn test_activity_info_without_bvid() -> Result<(), Box<BpiError>> {
let bpi = BpiClient::new();
let sid = 4017552;
let result = bpi.activity_info(sid, None).await?;
let data = result.into_data()?;
tracing::info!("{:#?}", data);
assert_eq!(data.id, sid);
Ok(())
}
}