Files
huangguo_server/models/v/vidmod/m3u8sign.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

53 lines
1.8 KiB
Go

package vidmod
// M3u8Signer 就地改写单个 m3u8 播放地址字段,由 app/service/m3u8ticket 实现。
// playable 表示正片、preview 表示试看,用于票据里区分播放语义。
type M3u8Signer interface {
SignM3u8URL(field *string, playable, preview bool)
}
// M3u8Signable 由携带 m3u8 播放地址的响应体实现:把自己(含嵌套列表)所有需要签票的地址字段
// 逐个交给 signer 就地改写,避免 m3u8ticket 反向依赖上层包,也避免每次请求反射遍历响应体。
type M3u8Signable interface {
SignM3u8(s M3u8Signer)
}
// SignM3u8Infos 依次为列表里每个 *VideoInfo 签票,供各外层响应体的 SignM3u8 复用(nil 元素安全跳过)。
func SignM3u8Infos(s M3u8Signer, list []*VideoInfo) {
for _, v := range list {
v.SignM3u8(s)
}
}
// SignM3u8Resps 依次为列表里每个 *VideoInfoResp 签票,供各外层响应体的 SignM3u8 复用(nil 元素安全跳过)。
func SignM3u8Resps(s M3u8Signer, list []*VideoInfoResp) {
for _, v := range list {
v.SignM3u8(s)
}
}
// SignM3u8 对详情/列表项的 sourceURL、h265Url 按正片,previewURL 按试看交给 signer 签票。
func (v *VideoInfo) SignM3u8(s M3u8Signer) {
if v == nil {
return
}
s.SignM3u8URL(&v.SourceURL, true, false)
s.SignM3u8URL(&v.H265Url, true, false)
s.SignM3u8URL(&v.PreviewURL, false, true)
}
// SignM3u8 对列表返回体(无 previewURL 字段)的 sourceURL、h265Url 按正片签票。
func (v *VideoInfoResp) SignM3u8(s M3u8Signer) {
if v == nil {
return
}
s.SignM3u8URL(&v.SourceURL, true, false)
s.SignM3u8URL(&v.H265Url, true, false)
}
// 编译期断言:叶子视频类型实现 M3u8Signable,供 m3u8ticket 零反射签票分支使用。
var (
_ M3u8Signable = (*VideoInfo)(nil)
_ M3u8Signable = (*VideoInfoResp)(nil)
)