forked from all_user/stat_center
Initial commit
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user