use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
use serde::{ Deserialize, Serialize };
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct MangaImage {
pub path: String,
pub x: i32,
pub y: i32,
pub video_path: String,
pub video_size: String,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct MangaVideo {
pub svid: String,
pub filename: String,
pub route: String,
pub resource: Vec<serde_json::Value>,
pub raw_width: String,
pub raw_height: String,
pub raw_rotate: String,
pub img_urls: Vec<String>,
pub bin_url: String,
pub img_x_len: i32,
pub img_x_size: i32,
pub img_y_len: i32,
pub img_y_size: i32,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct ImageIndexData {
pub path: String,
pub images: Vec<MangaImage>,
pub last_modified: String,
pub host: String,
pub video: MangaVideo,
}
#[derive(Debug, Clone, Serialize)]
pub struct ImageTokenRequest {
pub urls: String,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct ImageToken {
pub url: String,
pub token: String,
}
impl BpiClient {
#[allow(dead_code)]
async fn manga_image_index(&self, ep_id: i32) -> Result<BpiResponse<ImageIndexData>, BpiError> {
let params = serde_json::json!({
"ep_id": ep_id
});
self
.post("https://manga.bilibili.com/twirp/comic.v1.Comic/GetImageIndex")
.json(¶ms)
.send_bpi("获取漫画图片索引").await
}
#[allow(dead_code)]
async fn manga_image_token(
&self,
image_path: &str
) -> Result<BpiResponse<Vec<ImageToken>>, BpiError> {
let url = format!("[\"https://i0.hdslb.com{}\"]", image_path);
let params = ImageTokenRequest { urls: url };
self
.post("https://manga.bilibili.com/twirp/comic.v1.Comic/ImageToken")
.json(¶ms)
.send_bpi("获取漫画图片token").await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_manga_image_index() -> Result<(), Box<BpiError>> {
let bpi = BpiClient::new();
let ep_id = 482133;
let result = bpi.manga_image_index(ep_id).await?;
let data = result.into_data()?;
tracing::info!("{:#?}", data);
Ok(())
}
}