forked from all_user/stat_center
115 lines
3.0 KiB
Go
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
|
|
}
|