Files
stat_center/common/m3u8/media_play_list.go
T
2026-05-20 16:13:58 +08:00

115 lines
3.0 KiB
Go

package m3u8
import (
//"sz-app-server/pub/common/utils"
"crypto/md5"
"encoding/hex"
"fmt"
"stat/common/utils"
"strings"
"time"
"github.com/grafov/m3u8"
)
// makeMediaPlayList 根据from,重新生成播放列表
func makeMediaPlayList(from *m3u8.MediaPlaylist, cdnDomain string, dirPath string, keyUri string, authKey string) (media *m3u8.MediaPlaylist, err error) {
media, err = m3u8.NewMediaPlaylist(from.WinSize(), from.Count())
if err != nil {
return
}
base := utils.JoinUrlPath(cdnDomain, dirPath)
now := time.Now()
for _, segment := range from.Segments {
if segment == nil {
continue
}
sg := new(m3u8.MediaSegment)
sg.URI = utils.JoinUrlPath(base, segment.URI)
if len(authKey) > 0 {
//生成鉴权url
urlPath := utils.JoinUrlPath(dirPath, segment.URI)
urlAuth := generateUrlAuth(now, urlPath, authKey)
sg.URI = sg.URI + urlAuth
}
sg.Title = segment.Title
sg.Duration = segment.Duration
if err = media.AppendSegment(sg); err != nil {
return
}
}
_ = media.SetDefaultKey("AES-128", keyUri, "", "", "")
media.Close()
return
}
// 生成鉴权url
func generateUrlAuth(now time.Time, path string, authKey string) string {
timestamp := now.Unix()
// randId := maths.GenUUID()
signStr := fmt.Sprintf("%s-%d-0-0-%s", path, timestamp, authKey)
md5Str := getMD5Sign(signStr)
urlAuth := fmt.Sprintf("?md=%d-0-0-%s", timestamp, md5Str)
return urlAuth
}
// getMD5Sign 得到签名
func getMD5Sign(buf string) string {
md5Ctx := md5.New()
md5Ctx.Write([]byte(buf))
cipherStr := md5Ctx.Sum(nil)
nsign := hex.EncodeToString(cipherStr)
return nsign
}
func newMediaPlayList(from *m3u8.MediaPlaylist, cdnDomain, origDomain, dirPath, keyUri string, needHeader bool) (media *m3u8.MediaPlaylist, err error) {
if needHeader {
return makeMediaPlayListWithHeader(from, cdnDomain, origDomain, dirPath, keyUri)
} else {
return makeMediaPlayList(from, cdnDomain, dirPath, keyUri, AuthKey)
}
}
func makeMediaPlayListWithHeader(from *m3u8.MediaPlaylist, cdnDomain, origDomain string, dirPath string, keyUri string) (media *m3u8.MediaPlaylist, err error) {
media, err = m3u8.NewMediaPlaylist(from.WinSize(), from.Count()+headerMediaPlayList.Count())
if err != nil {
return
}
//合并片m3u8
for _, v := range headerMediaPlayList.Segments {
if v == nil {
continue
}
sg := new(m3u8.MediaSegment)
sg.URI = v.URI
if origDomain != "" && strings.HasPrefix(v.URI, origDomain) && origDomain != cdnDomain {
sg.URI = strings.ReplaceAll(v.URI, origDomain, cdnDomain)
}
sg.Title = v.Title
sg.Duration = v.Duration
if err = media.AppendSegment(sg); err != nil {
return
}
}
base := utils.JoinUrlPath(cdnDomain, dirPath)
for k, segment := range from.Segments {
if segment == nil {
continue
}
sg := new(m3u8.MediaSegment)
sg.Discontinuity = k == 0
sg.URI = utils.JoinUrlPath(base, segment.URI)
sg.Title = segment.Title
sg.Duration = segment.Duration
if err = media.AppendSegment(sg); err != nil {
return
}
}
_ = media.SetDefaultKey("AES-128", keyUri, "", "", "")
media.Close()
return
}