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) )