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 }