Skip to main content

bpi_rs/video/
model.rs

1use serde::{Deserialize, Serialize};
2
3use crate::ids::{Aid, Bvid, Cid, Mid};
4
5/// `/x/web-interface/view` 返回的载荷。
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct VideoView {
8    /// AV 数字视频 ID。
9    pub aid: Aid,
10    /// BV 字符串视频 ID。
11    pub bvid: Bvid,
12    /// 视频分 P 数。
13    pub videos: u32,
14    /// 视频标题。
15    pub title: String,
16    /// 视频封面 URL。
17    pub pic: String,
18    /// UP 主信息。
19    pub owner: VideoOwner,
20    /// 视频统计。
21    pub stat: VideoStat,
22    /// 默认内容或分 P ID。
23    pub cid: Cid,
24    /// 分 P 列表。
25    #[serde(default)]
26    pub pages: Vec<VideoPage>,
27}
28
29/// `/x/web-interface/view/detail` 返回的载荷。
30#[derive(Debug, Clone, Serialize, Deserialize)]
31pub struct VideoDetail {
32    /// 主视频 view 载荷。
33    #[serde(rename = "View")]
34    pub view: VideoView,
35    /// 视频关联标签。
36    #[serde(default, rename = "Tags")]
37    pub tags: Vec<VideoTag>,
38    /// Bilibili 推荐场景返回的相关视频。
39    #[serde(default, rename = "Related")]
40    pub related: Vec<VideoRelated>,
41    /// UP 主卡片和空间数据。该载荷偏展示用途,因此保留原始值。
42    #[serde(default, rename = "Card")]
43    pub card: Option<serde_json::Value>,
44    /// 评论预览数据。它会随评论场景实验变化,因此保留原始值。
45    #[serde(default, rename = "Reply")]
46    pub reply: Option<serde_json::Value>,
47}
48
49/// 视频 view 载荷中嵌入的 UP 主信息。
50#[derive(Debug, Clone, Serialize, Deserialize)]
51pub struct VideoOwner {
52    /// UP 主 member ID。
53    pub mid: Mid,
54    /// UP 主显示名称。
55    pub name: String,
56    /// UP 主头像 URL。
57    pub face: String,
58}
59
60/// 视频 view endpoint 返回的稳定统计字段。
61#[derive(Debug, Clone, Serialize, Deserialize)]
62pub struct VideoStat {
63    /// AV 数字视频 ID。
64    pub aid: Aid,
65    /// 播放数。
66    pub view: u64,
67    /// 弹幕数。
68    pub danmaku: u64,
69    /// 回复数。
70    pub reply: u64,
71    /// 较新载荷中的收藏数。
72    #[serde(default)]
73    pub favorite: Option<u64>,
74    /// 部分载荷中观察到的收藏数字段别名。
75    #[serde(default)]
76    pub fav: Option<u64>,
77    /// 投币数。
78    pub coin: u64,
79    /// 分享数。
80    pub share: u64,
81    /// 点赞数。
82    pub like: u64,
83}
84
85/// 多 P 视频中的一个分 P。
86#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct VideoPage {
88    /// 内容或分 P ID。
89    pub cid: Cid,
90    /// 从 1 开始的分 P 索引。
91    pub page: u32,
92    /// 分 P 标题。
93    pub part: String,
94    /// 时长,单位秒。
95    pub duration: u64,
96}
97
98/// detail endpoint 返回的一个视频标签。
99#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct VideoTag {
101    /// 标签 ID。
102    pub tag_id: u64,
103    /// 标签显示名称。
104    #[serde(default)]
105    pub tag_name: String,
106    /// 可选标签跳转 URL。
107    #[serde(default)]
108    pub jump_url: String,
109}
110
111/// detail endpoint 返回的相关视频稳定字段。
112#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct VideoRelated {
114    /// AV 数字视频 ID。
115    pub aid: Aid,
116    /// BV 字符串视频 ID。
117    pub bvid: Bvid,
118    /// 相关视频标题。
119    #[serde(default)]
120    pub title: String,
121    /// Bilibili 返回时的默认内容或分 P ID。
122    #[serde(default)]
123    pub cid: Option<Cid>,
124    /// 存在时的 UP 主信息。
125    #[serde(default)]
126    pub owner: Option<VideoOwner>,
127    /// 存在时的视频统计。
128    #[serde(default)]
129    pub stat: Option<VideoStat>,
130}