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