bpi_rs/creativecenter/
videos.rs1use serde::{ Deserialize, Serialize };
6
7use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
8
9#[derive(Debug, Serialize, Clone, Deserialize)]
11pub struct ArchiveStat {
12 pub aid: i64,
13 pub view: i64,
14 pub danmaku: i64,
15 pub reply: i64,
16 pub favorite: i64,
17 pub coin: i64,
18 pub share: i64,
19 pub now_rank: i64,
20 pub his_rank: i64,
21 pub like: i64,
22 pub dislike: i64,
23 pub vt: i64,
24 pub vv: i64,
25}
26
27#[derive(Debug, Serialize, Clone, Deserialize)]
29pub struct Archive {
30 pub aid: i64,
31 pub bvid: String,
32 pub title: String,
33 pub cover: String,
34 pub duration: i64,
35 pub desc: String,
36}
37
38#[derive(Debug, Serialize, Clone, Deserialize)]
40pub struct ArcAudit {
41 #[serde(rename = "Archive")]
42 pub archive: Option<Archive>,
43 #[serde(rename = "Videos")]
44 pub videos: Option<serde_json::Value>,
45 pub stat: ArchiveStat,
46 pub state_panel: i64,
47 pub parent_tname: Option<String>,
48 pub typename: Option<String>,
49 pub open_appeal: i64,
50 pub activity: Option<serde_json::Value>,
51 pub season_add_state: i64,
52}
53
54#[derive(Debug, Serialize, Clone, Deserialize)]
56pub struct PageInfo {
57 pub pn: i64,
58 pub ps: i64,
59 pub count: i64,
60}
61
62#[derive(Debug, Serialize, Clone, Deserialize)]
64pub struct SpArchivesData {
65 pub arc_audits: Vec<ArcAudit>,
66 pub page: PageInfo,
67 pub play_type: i64,
68}
69
70#[derive(Debug, Serialize, Clone, Deserialize)]
72pub struct VideoPart {
73 pub cid: i64,
75 pub index: i64,
77 pub title: String,
79 pub duration: i64,
81}
82
83#[derive(Debug, Serialize, Clone, Deserialize)]
85pub struct ArchiveInfo {
86 pub aid: i64,
88 pub bvid: String,
90 pub title: String,
92}
93
94#[derive(Debug, Serialize, Clone, Deserialize)]
96pub struct ArchiveVideosData {
97 pub archive: ArchiveInfo,
99 pub videos: Vec<VideoPart>,
101}
102
103impl BpiClient {
104 pub async fn up_archives_list(
117 &self,
118 pn: i64,
119 ps: Option<i64>
120 ) -> Result<BpiResponse<SpArchivesData>, BpiError> {
121 let mut req = self
122 .get("https://member.bilibili.com/x2/creative/web/archives/sp")
123 .query(&[("pn", pn)]);
124 if let Some(ps) = ps {
125 req = req.query(&[("ps", ps)]);
126 }
127 req.send_bpi("获取稿件列表").await
128 }
129
130 pub async fn up_archive_videos(
142 &self,
143 aid: i64
144 ) -> Result<BpiResponse<ArchiveVideosData>, BpiError> {
145 self
146 .get("https://member.bilibili.com/x/web/archive/videos")
147 .query(&[("aid", aid)])
148 .send_bpi("获取视频基础信息").await
149 }
150}
151
152#[cfg(test)]
153mod tests {
154 use super::*;
155 use tracing::info;
156
157 const TEST_AID: i64 = 113602455409683;
158
159 #[tokio::test]
160 async fn test_archives_list() -> Result<(), Box<BpiError>> {
161 let bpi = BpiClient::new();
162 let data = bpi.up_archives_list(1, Some(10)).await?.into_data()?;
163 info!("稿件列表: {:?}", data);
164 Ok(())
165 }
166
167 #[tokio::test]
168 async fn test_archive_videos() -> Result<(), Box<BpiError>> {
169 let bpi = BpiClient::new();
170 let data = bpi.up_archive_videos(TEST_AID).await?.into_data()?;
171 info!("视频基础信息: {:?}", data);
172 Ok(())
173 }
174}