use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
use serde::{ Deserialize, Serialize };
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RankingVideoItem {
#[serde(flatten)]
pub inner: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RankingListData {
pub note: String,
pub list: Vec<RankingVideoItem>,
}
impl BpiClient {
pub async fn video_ranking_list(
&self,
rid: Option<u32>,
type_name: Option<&str>
) -> Result<BpiResponse<RankingListData>, BpiError> {
let mut request = self.get("https://api.bilibili.com/x/web-interface/ranking/v2");
if let Some(r) = rid {
request = request.query(&[("rid", r)]);
}
if let Some(t) = type_name {
request = request.query(&[("type", t)]);
}
request = request.header(
"User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
);
request.send_bpi("获取分区视频排行榜列表").await
}
}
#[cfg(test)]
mod tests {
use super::*;
use tracing::info;
#[tokio::test]
async fn test_video_ranking_list() {
let bpi = BpiClient::new();
let resp = bpi.video_ranking_list(None, None).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!("note: {}", data.note);
info!("排行榜视频数: {}", data.list.len());
if let Some(first_item) = data.list.first() {
info!("first item: {}", serde_json::to_string_pretty(&first_item).unwrap());
}
}
}
#[tokio::test]
async fn test_video_ranking_list_with_rid() {
let bpi = BpiClient::new();
let resp = bpi.video_ranking_list(Some(21), None).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!("note: {}", data.note);
info!("排行榜视频数: {}", data.list.len());
}
}
#[tokio::test]
async fn test_video_ranking_list_with_type() {
let bpi = BpiClient::new();
let resp = bpi.video_ranking_list(None, Some("rookie")).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!("note: {}", data.note);
info!("排行榜视频数: {}", data.list.len());
}
}
}