fix: pre get m3u8 file in token

build v0.7.5
zijiren233 2 years ago
parent 4fc2c054a0
commit e1a05a057a

@ -654,7 +654,7 @@ func ServeM3u8(ctx *gin.Context) {
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorStringResp("invalid token")) ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorStringResp("invalid token"))
return return
} }
err = proxy.ProxyM3u8(ctx, claims.TargetUrl, m.Movie.MovieBase.Headers, utils.IsM3u8Url(claims.TargetUrl), ctx.GetString("token"), room.ID, m.ID) err = proxy.ProxyM3u8(ctx, claims.TargetUrl, m.Movie.MovieBase.Headers, claims.IsM3u8File, ctx.GetString("token"), room.ID, m.ID)
if err != nil { if err != nil {
log.Errorf("proxy m3u8 error: %v", err) log.Errorf("proxy m3u8 error: %v", err)
} }

@ -18,9 +18,10 @@ import (
) )
type m3u8TargetClaims struct { type m3u8TargetClaims struct {
RoomId string `json:"r"` RoomId string `json:"r"`
MovieId string `json:"m"` MovieId string `json:"m"`
TargetUrl string `json:"t"` TargetUrl string `json:"t"`
IsM3u8File bool `json:"f"`
jwt.RegisteredClaims jwt.RegisteredClaims
} }
@ -38,11 +39,12 @@ func GetM3u8Target(token string) (*m3u8TargetClaims, error) {
return claims, nil return claims, nil
} }
func NewM3u8TargetToken(targetUrl, roomId, movieId string) (string, error) { func NewM3u8TargetToken(targetUrl, roomId, movieId string, isM3u8File bool) (string, error) {
claims := &m3u8TargetClaims{ claims := &m3u8TargetClaims{
RoomId: roomId, RoomId: roomId,
MovieId: movieId, MovieId: movieId,
TargetUrl: targetUrl, TargetUrl: targetUrl,
IsM3u8File: isM3u8File,
RegisteredClaims: jwt.RegisteredClaims{ RegisteredClaims: jwt.RegisteredClaims{
NotBefore: jwt.NewNumericDate(time.Now()), NotBefore: jwt.NewNumericDate(time.Now()),
}, },
@ -74,8 +76,19 @@ func ProxyM3u8(ctx *gin.Context, u string, headers map[string]string, isM3u8File
if err != nil { if err != nil {
return fmt.Errorf("read response body error: %w", err) return fmt.Errorf("read response body error: %w", err)
} }
hasM3u8File := false
err = m3u8.RangeM3u8SegmentsWithBaseUrl(stream.BytesToString(b), u, func(segmentUrl string) (bool, error) {
if utils.IsM3u8Url(segmentUrl) {
hasM3u8File = true
return false, nil
}
return true, nil
})
if err != nil {
return fmt.Errorf("range m3u8 segments with base url error: %w", err)
}
m3u8Str, err := m3u8.ReplaceM3u8SegmentsWithBaseUrl(stream.BytesToString(b), u, func(segmentUrl string) (string, error) { m3u8Str, err := m3u8.ReplaceM3u8SegmentsWithBaseUrl(stream.BytesToString(b), u, func(segmentUrl string) (string, error) {
targetToken, err := NewM3u8TargetToken(segmentUrl, roomId, movieId) targetToken, err := NewM3u8TargetToken(segmentUrl, roomId, movieId, hasM3u8File)
if err != nil { if err != nil {
return "", err return "", err
} }

@ -9,9 +9,9 @@ import (
func GetM3u8AllSegments(m3u8Str string, baseUrl string) ([]string, error) { func GetM3u8AllSegments(m3u8Str string, baseUrl string) ([]string, error) {
var segments []string var segments []string
err := RangeM3u8SegmentsWithBaseUrl(m3u8Str, baseUrl, func(segmentUrl string) error { err := RangeM3u8SegmentsWithBaseUrl(m3u8Str, baseUrl, func(segmentUrl string) (bool, error) {
segments = append(segments, segmentUrl) segments = append(segments, segmentUrl)
return nil return true, nil
}) })
if err != nil { if err != nil {
return nil, err return nil, err
@ -19,13 +19,15 @@ func GetM3u8AllSegments(m3u8Str string, baseUrl string) ([]string, error) {
return segments, nil return segments, nil
} }
func RangeM3u8Segments(m3u8Str string, callback func(segmentUrl string) error) error { func RangeM3u8Segments(m3u8Str string, callback func(segmentUrl string) (bool, error)) error {
scanner := bufio.NewScanner(strings.NewReader(m3u8Str)) scanner := bufio.NewScanner(strings.NewReader(m3u8Str))
for scanner.Scan() { for scanner.Scan() {
line := strings.TrimSpace(scanner.Text()) line := strings.TrimSpace(scanner.Text())
if line != "" && !strings.HasPrefix(line, "#") { if line != "" && !strings.HasPrefix(line, "#") {
if err := callback(line); err != nil { if ok, err := callback(line); err != nil {
return err return err
} else if !ok {
break
} }
} }
} }
@ -35,16 +37,16 @@ func RangeM3u8Segments(m3u8Str string, callback func(segmentUrl string) error) e
return nil return nil
} }
func RangeM3u8SegmentsWithBaseUrl(m3u8Str string, baseUrl string, callback func(segmentUrl string) error) error { func RangeM3u8SegmentsWithBaseUrl(m3u8Str string, baseUrl string, callback func(segmentUrl string) (bool, error)) error {
baseUrlParsed, err := url.Parse(baseUrl) baseUrlParsed, err := url.Parse(baseUrl)
if err != nil { if err != nil {
return fmt.Errorf("parse base url error: %w", err) return fmt.Errorf("parse base url error: %w", err)
} }
return RangeM3u8Segments(m3u8Str, func(segmentUrl string) error { return RangeM3u8Segments(m3u8Str, func(segmentUrl string) (bool, error) {
if !strings.HasPrefix(segmentUrl, "http://") && !strings.HasPrefix(segmentUrl, "https://") { if !strings.HasPrefix(segmentUrl, "http://") && !strings.HasPrefix(segmentUrl, "https://") {
segmentUrlParsed, err := url.Parse(segmentUrl) segmentUrlParsed, err := url.Parse(segmentUrl)
if err != nil { if err != nil {
return fmt.Errorf("parse segment url error: %w", err) return false, fmt.Errorf("parse segment url error: %w", err)
} }
segmentUrl = baseUrlParsed.ResolveReference(segmentUrlParsed).String() segmentUrl = baseUrlParsed.ResolveReference(segmentUrlParsed).String()
} }

Loading…
Cancel
Save