This commit is contained in:
2026-04-02 15:16:34 +08:00
commit 4facf82956
58 changed files with 6630 additions and 0 deletions
+253
View File
@@ -0,0 +1,253 @@
package bilibili
import (
"encoding/json"
"bilidown/common"
)
// BaseRes 来自 Bilibili 的接口响应,Message 字段为 msg
type BaseRes struct {
Code int `json:"code"`
Message string `json:"msg"`
Data json.RawMessage `json:"data"`
}
// BaseRes2 来自 Bilibili 的接口响应,Message 字段为 message 而不是 msg
type BaseResV2 struct {
Code int `json:"code"`
Message string `json:"message"`
Data json.RawMessage `json:"data"`
}
// BaseResV3 来自 Bilibili 的接口响应,Message 字段为 message 而不是 msgData 字段为 result
type BaseResV3 struct {
Code int `json:"code"`
Message string `json:"message"`
Result json.RawMessage `json:"result"`
}
func (b *BaseRes) Success() bool {
return b.Code == 0
}
func (b *BaseResV2) Success() bool {
return b.Code == 0
}
func (b *BaseResV3) Success() bool {
return b.Code == 0
}
type QRInfo struct {
URL string `json:"url"`
QrcodeKey string `json:"qrcode_key"`
}
type QRStatus struct {
URL string `json:"string"`
RefreshToken string `json:"refresh_token"`
Code int `json:"code"`
Message string `json:"message"`
}
const (
QR_NO_SCAN = 86101 // 未扫码
QR_NO_CLICK = 86090 // 已扫码未确认
QR_EXPIRES = 86038 // 已过期
QR_SUCCESS = 0 // 已确认登录
)
// Dimension 视频分辨率
type Dimension struct {
Width int `json:"width"`
Height int `json:"height"`
Rotate int `json:"rotate"`
}
// StaffItem 视频人员
type StaffItem struct {
Mid int `json:"mid"`
Title string `json:"title"`
Name string `json:"name"`
Face string `json:"face"`
}
// Page 分集信息
type Page struct {
// 配合 Bvid 用于获取播放地址
Cid int `json:"cid"`
// 当前分集在合集中的序号,从 1 开始
Page int `json:"page"`
// 分集标题
Part string `json:"part"`
// 分集时长
Duration int `json:"duration"`
// 分集分辨率
Dimension `json:"dimension"`
}
// 通过 BVID 获取的视频信息
type VideoInfo struct {
Bvid string `json:"bvid"`
Aid int `json:"aid"`
Pic string `json:"pic"`
Title string `json:"title"`
Pubdate int `json:"pubdate"`
Desc string `json:"desc"`
Owner struct {
Mid int `json:"mid"`
Name string `json:"name"`
Face string `json:"face"`
} `json:"owner"`
Dimension `json:"dimension"`
Staff []StaffItem `json:"staff"`
Pages []Page `json:"pages"`
Duration int `json:"duration"`
Stat struct {
Aid int `json:"aid"`
View int `json:"view"` // 播放数量
Danmaku int `json:"danmaku"` // 弹幕数量
Reply int `json:"reply"` // 评论数量
Favorite int `json:"favorite"` // 收藏数量
Coin int `json:"coin"` // 投币数量
Share int `json:"share"` // 转发数量
NowRank int `json:"now_rank"` // 当前排名
HisRank int `json:"his_rank"` // 历史最高排名
Like int `json:"like"` // 点赞数量
Dislike int `json:"dislike"` // 不喜欢
} `json:"stat"`
UgcSeason struct {
Sections []struct {
Title string `json:"title"`
Episodes []struct {
Title string `json:"title"`
Pages []Page `json:"pages"`
Bvid string `json:"bvid"`
} `json:"episodes"`
} `json:"sections"`
Title string `json:"title"`
} `json:"ugc_season"`
}
// EpisodeInBV 通过 BV 获取的视频信息中的合集信息
type EpisodeInBV struct {
Aid int `json:"aid"`
Bvid string `json:"bvid"`
Cid int `json:"cid"`
Pic string `json:"pic"` // 封面
Dimension `json:"dimension"` // 分辨率
Duration int `json:"duration"` // 时长
EPID int `json:"ep_id"`
LongTitle string `json:"long_title"` // 分集完整标题,比如【法外狂徒张三现身!】
PubTime int `json:"pub_time"` // 发布时间
Title string `json:"title"` // 分集简略标题,比如【1】
}
// Episode 剧集分集信息
type Episode struct {
Aid int `json:"aid"`
Bvid string `json:"bvid"`
Cid int `json:"cid"`
Cover string `json:"cover"` // 封面
Dimension `json:"dimension"` // 分辨率
Duration int `json:"duration"` // 时长
EPID int `json:"ep_id"`
LongTitle string `json:"long_title"` // 分集完整标题,比如【法外狂徒张三现身!】
PubTime int `json:"pub_time"` // 发布时间
Title string `json:"title"` // 分集简略标题,比如【1】
}
// 通过 EPID 获取的视频信息
type SeasonInfo struct {
Actors string `json:"actors"` // 演员名单
Areas []struct {
ID int `json:"id"`
Name string `json:"name"`
} `json:"areas"` // 地区列表
Cover string `json:"cover"` // 封面
Evaluate string `json:"evaluate"` // 简介
Publish struct {
IsFinish int `json:"is_finish"` // 是否完结
PubTime string `json:"pub_time"` // 发布时间
} `json:"publish"`
SeasonID int `json:"season_id"` // 剧集编号
SeasonTitle string `json:"season_title"` // 剧集标题
Stat struct {
Coins int `json:"coins"` // 投币数量
Danmakus int `json:"danmakus"` // 弹幕数量
Favorite int `json:"favorite"` // 收藏数量
Favorites int `json:"favorites"` // 追剧数量
Likes int `json:"likes"` // 点赞数量
Reply int `json:"reply"` // 评论数量
Share int `json:"share"` // 分享数量
Views int `json:"views"` // 播放数量
} `json:"stat"`
Styles []string `json:"styles"` // 剧集内容类型,例如 [ "短剧", "奇幻", "搞笑" ]
Title string `json:"title"` // 剧集标题
Total int `json:"total"` // 总集数
Episodes []Episode `json:"episodes"` // 分集信息列表
NewEp struct {
Desc string `json:"desc"` // 更新状态文本
IsNew int `json:"is_new"` // 是否是连载,0 为完结,1 为连载
} `json:"new_ep"`
Section []struct {
Title string `json:"title"`
Episodes []Episode `json:"episodes"`
} `json:"section"`
}
type PlayInfo struct {
AcceptDescription []string `json:"accept_description"`
AcceptQuality []common.MediaFormat `json:"accept_quality"`
SupportFormats []struct {
Quality common.MediaFormat `json:"quality"`
Format string `json:"format"`
NewDescription string `json:"new_description"`
Codecs []string `json:"codecs"`
} `json:"support_formats"`
Dash *Dash `json:"dash"`
}
type Dash struct {
// 视频时长(秒)
Duration int `json:"duration"`
Video []Media `json:"video"`
Audio []Media `json:"audio"`
Flac *struct {
Audio Media `json:"audio"`
} `json:"flac"`
}
type Media struct {
ID common.MediaFormat `json:"id"`
BaseURL string `json:"baseUrl"`
BackupURL []string `json:"backupUrl"`
Bandwidth int `json:"bandwidth"`
MimeType string `json:"mimeType"`
Codecs string `json:"codecs"`
Width int `json:"width"`
Height int `json:"height"`
FrameRate string `json:"frameRate"`
Codecid int `json:"codecid"`
}
type FavList []struct {
Title string `json:"title"`
Cover string `json:"cover"`
Intro string `json:"intro"`
Duration int `json:"duration"`
Upper struct {
Mid int `json:"mid"`
Name string `json:"name"`
Face string `json:"face"`
} `json:"upper"`
PubTime int `json:"pubtime"`
Bvid string `json:"bvid"`
Ugc struct {
FirstCid int `json:"first_cid"`
} `json:"ugc"`
}