use crate::article::models::{ ArticleAuthor, ArticleCategory, ArticleStats };
use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
use serde::{ Deserialize, Serialize };
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ArticlesData {
pub list: ArticleList,
pub articles: Vec<ArticleItem>,
pub author: ArticleAuthor,
pub last: ArticleItem,
pub attention: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ArticleList {
pub id: i64,
pub mid: i64,
pub name: String,
pub image_url: String,
pub update_time: i64,
pub ctime: i64,
pub publish_time: i64,
pub summary: String,
pub words: i64,
pub read: i64,
pub articles_count: i32,
pub state: i32,
pub reason: String,
pub apply_time: String,
pub check_time: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ArticleItem {
pub id: i64,
pub title: String,
pub state: i32,
pub publish_time: i64,
pub words: i64,
pub image_urls: Vec<String>,
pub category: ArticleCategory,
pub categories: Vec<ArticleCategory>,
pub summary: String,
pub stats: Option<ArticleStats>,
pub like_state: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthorVip {
pub r#type: i32,
pub status: i32,
pub due_date: i64,
pub vip_pay_type: i32,
pub theme_type: i32,
pub label: Option<serde_json::Value>,
}
impl BpiClient {
pub async fn article_articles_info(
&self,
id: i64
) -> Result<BpiResponse<ArticlesData>, BpiError> {
self
.get("https://api.bilibili.com/x/article/list/web/articles")
.query(&[("id", id.to_string())])
.send_bpi("获取文集基本信息").await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_get_articles_info() -> Result<(), Box<BpiError>> {
let bpi = BpiClient::new();
let rlid = 207146;
let result = bpi.article_articles_info(rlid).await?;
let data = result.into_data()?;
tracing::info!("{:#?}", data);
assert!(!data.list.name.is_empty());
assert!(!data.articles.is_empty());
assert!(!data.author.name.is_empty());
Ok(())
}
}