use serde::{ Deserialize, Serialize };
use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct ArchiveStat {
pub aid: i64,
pub view: i64,
pub danmaku: i64,
pub reply: i64,
pub favorite: i64,
pub coin: i64,
pub share: i64,
pub now_rank: i64,
pub his_rank: i64,
pub like: i64,
pub dislike: i64,
pub vt: i64,
pub vv: i64,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct Archive {
pub aid: i64,
pub bvid: String,
pub title: String,
pub cover: String,
pub duration: i64,
pub desc: String,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct ArcAudit {
#[serde(rename = "Archive")]
pub archive: Option<Archive>,
#[serde(rename = "Videos")]
pub videos: Option<serde_json::Value>,
pub stat: ArchiveStat,
pub state_panel: i64,
pub parent_tname: Option<String>,
pub typename: Option<String>,
pub open_appeal: i64,
pub activity: Option<serde_json::Value>,
pub season_add_state: i64,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct PageInfo {
pub pn: i64,
pub ps: i64,
pub count: i64,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct SpArchivesData {
pub arc_audits: Vec<ArcAudit>,
pub page: PageInfo,
pub play_type: i64,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct VideoPart {
pub cid: i64,
pub index: i64,
pub title: String,
pub duration: i64,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct ArchiveInfo {
pub aid: i64,
pub bvid: String,
pub title: String,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct ArchiveVideosData {
pub archive: ArchiveInfo,
pub videos: Vec<VideoPart>,
}
impl BpiClient {
pub async fn up_archives_list(
&self,
pn: i64,
ps: Option<i64>
) -> Result<BpiResponse<SpArchivesData>, BpiError> {
let mut req = self
.get("https://member.bilibili.com/x2/creative/web/archives/sp")
.query(&[("pn", pn)]);
if let Some(ps) = ps {
req = req.query(&[("ps", ps)]);
}
req.send_bpi("获取稿件列表").await
}
pub async fn up_archive_videos(
&self,
aid: i64
) -> Result<BpiResponse<ArchiveVideosData>, BpiError> {
self
.get("https://member.bilibili.com/x/web/archive/videos")
.query(&[("aid", aid)])
.send_bpi("获取视频基础信息").await
}
}
#[cfg(test)]
mod tests {
use super::*;
use tracing::info;
const TEST_AID: i64 = 113602455409683;
#[tokio::test]
async fn test_archives_list() -> Result<(), Box<BpiError>> {
let bpi = BpiClient::new();
let data = bpi.up_archives_list(1, Some(10)).await?.into_data()?;
info!("稿件列表: {:?}", data);
Ok(())
}
#[tokio::test]
async fn test_archive_videos() -> Result<(), Box<BpiError>> {
let bpi = BpiClient::new();
let data = bpi.up_archive_videos(TEST_AID).await?.into_data()?;
info!("视频基础信息: {:?}", data);
Ok(())
}
}