use serde::{Deserialize, Serialize};
#[cfg(test)]
use super::params::{
VideoRegionDynamicParams, VideoRegionNewListRankParams, VideoRegionTagDynamicParams,
};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct RegionPage {
pub count: u32,
pub num: u32,
pub size: u32,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct RegionArchivesData {
pub archives: Vec<serde_json::Value>, pub page: RegionPage,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct NewListRankResult {
#[serde(rename = "pubdate")]
pub pub_date: String,
pub pic: String,
pub tag: String,
pub duration: u32,
pub id: u64,
pub rank_score: Option<u64>,
pub badgepay: bool,
pub senddate: Option<u64>,
pub author: String,
pub review: u64,
pub mid: u64,
pub is_union_video: u8,
pub rank_index: Option<u64>,
#[serde(rename = "type")]
pub type_name: String,
pub play: String,
#[serde(rename = "video_review")]
pub video_review: u64,
pub is_pay: u8,
pub favorites: u64,
pub arcurl: String,
pub bvid: String,
pub title: String,
pub description: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct NewListRankData {
pub result: Option<Vec<NewListRankResult>>,
#[serde(rename = "numResults")]
pub num_results: u32,
pub page: u32,
pub pagesize: u32,
pub msg: String,
}
#[cfg(test)]
mod tests {
use super::super::params::VideoNewListRankOrder;
use super::*;
use crate::BpiClient;
use chrono::{Duration, Local};
use tracing::info;
#[ignore = "legacy live API test; requires explicit BPI_LIVE_TEST review"]
#[tokio::test]
async fn test_video_region_dynamic() {
let bpi = BpiClient::new().expect("client should build");
let rid = 21; let params = VideoRegionDynamicParams::new(rid)
.expect("rid is valid")
.with_page(1)
.expect("page is valid")
.with_page_size(2)
.expect("page size is valid");
let resp = bpi.video_ranking().region_dynamic(params).await;
info!("{:?}", resp);
assert!(resp.is_ok());
let data = resp.unwrap();
info!("total videos: {}", data.page.count);
info!("first item: {:?}", data.archives.first());
}
#[ignore = "legacy live API test; requires explicit BPI_LIVE_TEST review"]
#[tokio::test]
async fn test_video_region_tag_dynamic() {
let bpi = BpiClient::new().expect("client should build");
let rid = 136; let tag_id = 10026108; let params = VideoRegionTagDynamicParams::new(rid, tag_id)
.expect("required ids are valid")
.with_page(1)
.expect("page is valid")
.with_page_size(2)
.expect("page size is valid");
let resp = bpi.video_ranking().region_tag_dynamic(params).await;
info!("{:?}", resp);
assert!(resp.is_ok());
let data = resp.unwrap();
info!("total videos: {}", data.page.count);
info!("first item: {:?}", data.archives.first());
}
#[ignore = "legacy live API test; requires explicit BPI_LIVE_TEST review"]
#[tokio::test]
async fn test_video_region_newlist_rank() {
let bpi = BpiClient::new().expect("client should build");
let cate_id = 231; let pagesize = 2;
let today = Local::now().date_naive();
let seven_days_ago = today - Duration::days(7);
let time_from = seven_days_ago.format("%Y%m%d").to_string();
let time_to = today.format("%Y%m%d").to_string();
let params = VideoRegionNewListRankParams::new(cate_id, pagesize, time_from, time_to)
.expect("rank params are valid")
.with_order(VideoNewListRankOrder::Click)
.with_page(1)
.expect("page is valid");
let resp = bpi.video_ranking().region_newlist_rank(params).await;
info!("{:?}", resp);
assert!(resp.is_ok());
let data = resp.unwrap();
info!("total results: {}", data.num_results);
info!("first result: {:?}", data.result.unwrap().first());
}
}