use serde::{ Deserialize, Serialize };
use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct LiveInfo {
pub title: String,
pub cover: String,
pub live_time: i64,
pub live_type: i32,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct VideoInfo {
pub replay_status: i32,
pub estimated_time: String,
pub duration: i32,
pub download_url: Option<String>,
pub alert_code: Option<i32>,
pub alert_message: Option<String>,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct AlarmInfo {
pub code: i32,
pub message: String,
pub cur_time: i64,
pub is_ban_publish: bool,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct ReplayInfo {
pub replay_id: i64,
pub live_info: LiveInfo,
pub video_info: VideoInfo,
pub alarm_info: AlarmInfo,
pub room_id: i64,
pub live_key: String,
pub start_time: i64,
pub end_time: i64,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct Pagination {
pub page: i32,
pub page_size: i32,
pub total: Option<i32>,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct ReplayListData {
pub replay_info: Option<Vec<ReplayInfo>>,
pub pagination: Pagination,
}
impl BpiClient {
pub async fn live_replay_list(
&self,
page: Option<i32>,
page_size: Option<i32>
) -> Result<BpiResponse<ReplayListData>, BpiError> {
let mut query = Vec::new();
if let Some(page) = page {
query.push(("page", page.to_string()));
}
if let Some(page_size) = page_size {
query.push(("page_size", page_size.to_string()));
}
self
.get("https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/AnchorGetReplayList")
.query(&query)
.send_bpi("获取直播回放列表").await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_get_live_replay_list() {
let bpi = BpiClient::new();
let resp = bpi.live_replay_list(Some(1), Some(2)).await.unwrap();
tracing::info!("{:?}", resp);
}
}