use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
use serde::{ Deserialize, Serialize };
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PopularListData {
pub list: Vec<serde_json::Value>, pub no_more: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PopularSeriesItem {
pub number: u32,
pub subject: String,
pub status: u8,
pub name: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PopularSeriesListData {
pub list: Vec<PopularSeriesItem>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PopularSeriesConfig {
pub id: u64,
#[serde(rename = "type")]
pub type_name: String,
pub number: u32,
pub subject: String,
pub stime: u64,
pub etime: u64,
pub status: u8,
pub name: String,
pub label: String,
pub hint: String,
pub color: u32,
pub cover: String,
pub share_title: String,
pub share_subtitle: String,
pub media_id: u64,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PopularSeriesOneData {
pub config: PopularSeriesConfig,
pub reminder: Option<String>,
pub list: Vec<serde_json::Value>,
}
impl BpiClient {
pub async fn video_popular_list(
&self,
pn: Option<u32>,
ps: Option<u32>
) -> Result<BpiResponse<PopularListData>, BpiError> {
let mut request = self.get("https://api.bilibili.com/x/web-interface/popular");
if let Some(pn) = pn {
request = request.query(&[("pn", pn)]);
}
if let Some(ps) = ps {
request = request.query(&[("ps", ps)]);
}
request.send_bpi("获取当前热门视频列表").await
}
pub async fn video_popular_series_list(
&self
) -> Result<BpiResponse<PopularSeriesListData>, BpiError> {
self
.get("https://api.bilibili.com/x/web-interface/popular/series/list")
.send_bpi("获取每周必看全部列表").await
}
pub async fn video_popular_series_one(
&self,
number: u32
) -> Result<BpiResponse<PopularSeriesOneData>, BpiError> {
self
.get("https://api.bilibili.com/x/web-interface/popular/series/one")
.query(&[("number", number)])
.send_bpi("获取每周必看选期详细信息").await
}
}
#[cfg(test)]
mod tests {
use super::*;
use tracing::info;
#[tokio::test]
async fn test_video_popular_list() {
let bpi = BpiClient::new();
let resp = bpi.video_popular_list(Some(1), Some(2)).await;
info!("{:?}", resp);
assert!(resp.is_ok());
let resp_data = resp.unwrap();
info!("code: {}", resp_data.code);
if let Some(data) = resp_data.data {
info!("no_more: {}", data.no_more);
info!("first item: {:?}", data.list.first());
}
}
#[tokio::test]
async fn test_video_popular_series_list() {
let bpi = BpiClient::new();
let resp = bpi.video_popular_series_list().await;
info!("{:?}", resp);
assert!(resp.is_ok());
let resp_data = resp.unwrap();
info!("code: {}", resp_data.code);
if let Some(data) = resp_data.data {
info!("first series: {:?}", data.list.first());
}
}
#[tokio::test]
async fn test_video_popular_series_one() {
let bpi = BpiClient::new();
let resp = bpi.video_popular_series_one(1).await;
info!("{:?}", resp);
assert!(resp.is_ok());
let resp_data = resp.unwrap();
info!("code: {}", resp_data.code);
if let Some(data) = resp_data.data {
info!("config: {:?}", data.config);
info!("first video: {:?}", data.list.first());
}
}
}