bpi_rs/web_widget/
header.rs1use serde::{ Deserialize, Serialize };
5
6use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
7
8#[derive(Debug, Clone, Deserialize, Serialize)]
10pub struct HeaderData {
11 pub name: String,
13 pub pic: String,
15 pub litpic: String,
17 pub url: String,
19 pub is_split_layer: u32,
21 pub split_layer: String,
23
24 pub split_layer_obj: Option<SplitLayer>,
25}
26
27impl HeaderData {
28 pub fn parse_split_layer(&mut self) -> Result<(), BpiError> {
29 let result = serde_json::from_str(&self.split_layer);
30 match result {
31 Ok(r) => {
32 self.split_layer_obj = Some(r);
33 Ok(())
34 }
35 Err(e) => Err(BpiError::parse(format!("解析split_layer失败: {:?}", e))),
36 }
37 }
38}
39
40#[derive(Debug, Clone, Deserialize, Serialize)]
42pub struct SplitLayer {
43 pub version: String,
45 pub layers: Vec<Layer>,
47}
48#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
49#[serde(rename_all = "camelCase")]
50pub struct Layer {
51 pub resources: Vec<Resource>,
52 pub scale: Scale,
53 pub rotate: Rotate,
54 pub translate: Translate,
55 pub blur: Blur,
56 pub opacity: Opacity,
57 pub id: i64,
58 pub name: String,
59}
60
61#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
62#[serde(rename_all = "camelCase")]
63pub struct Resource {
64 pub src: String,
65 pub id: i64,
66}
67
68#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
69#[serde(rename_all = "camelCase")]
70pub struct Scale {
71 pub initial: Option<f64>,
72}
73
74#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
75#[serde(rename_all = "camelCase")]
76pub struct Rotate {
77 pub offset: Option<i64>,
78}
79
80#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
81#[serde(rename_all = "camelCase")]
82pub struct Translate {
83 pub offset: Option<Vec<i64>>,
84 pub initial: Option<Vec<i64>>,
85}
86
87#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
88#[serde(rename_all = "camelCase")]
89pub struct Blur {
90 pub initial: Option<i64>,
91}
92
93#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
94#[serde(rename_all = "camelCase")]
95pub struct Opacity {
96 pub wrap: String,
97 pub initial: Option<f64>,
98}
99
100impl BpiClient {
101 pub async fn web_widget_header_page(&self) -> Result<BpiResponse<HeaderData>, BpiError> {
106 let mut result = self
107 .get("https://api.bilibili.com/x/web-show/page/header")
108 .query(&[("resource_id", 142)])
109 .send_bpi("获取首页头图").await?;
110 let mut header: HeaderData = result.data.take().ok_or_else(|| BpiError::missing_data())?;
111
112 header.parse_split_layer()?;
113
114 result.data = Some(header);
116
117 Ok(result)
118 }
119}
120
121#[cfg(test)]
122mod tests {
123 use super::*;
124 use tracing::info;
125
126 #[tokio::test]
127 async fn test_get_header_page() {
128 let bpi = BpiClient::new();
129 let resp = bpi.web_widget_header_page().await;
130 info!("响应: {:?}", resp);
131 assert!(resp.is_ok());
132 }
133}