From d5221826fcdab5baf788328c591e1c28e102c8ec Mon Sep 17 00:00:00 2001 From: sunshineplan Date: Sun, 2 Jun 2024 20:47:18 +0800 Subject: [PATCH 1/2] Fix parse key --- .github/workflows/dependabot.yml | 2 +- .github/workflows/release.yml | 7 +++-- .github/workflows/test.yml | 2 +- m3u8.go | 47 ++++++++++++++++---------------- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/.github/workflows/dependabot.yml b/.github/workflows/dependabot.yml index 8097a9e..e22db99 100644 --- a/.github/workflows/dependabot.yml +++ b/.github/workflows/dependabot.yml @@ -19,7 +19,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.x' + go-version: stable - name: Test Code run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e4aa86b..260dda7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,12 +15,13 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.x' + go-version: stable - name: Build run: | - go build -ldflags "-s -w" -o hlsdl ./cmd - GOOS=windows go build -ldflags "-s -w" -o hlsdl.exe ./cmd + go build -ldflags "-s -w" -o hlsdl-linux-amd64 ./cmd + GOARCH=arm64 GOOS=darwin go build -ldflags "-s -w" -o hlsdl-darwin-arm64 ./cmd + GOOS=windows go build -ldflags "-s -w" -o hlsdl-windows-amd64.exe ./cmd echo "date=$(TZ=PRC date +'%Y-%m-%d')" >> $GITHUB_OUTPUT - name: Upload Release Asset diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f478ad0..6534ba3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.x' + go-version: stable - name: Test Code run: | diff --git a/m3u8.go b/m3u8.go index 568f2cf..585ae71 100644 --- a/m3u8.go +++ b/m3u8.go @@ -19,46 +19,45 @@ var c = cache.New(false) func parse(url *url.URL, playlist m3u8.Playlist) (*url.URL, *m3u8.MediaPlaylist, error) { switch playlist := playlist.(type) { case *m3u8.MediaPlaylist: - var segments []*m3u8.MediaSegment - for _, s := range playlist.Segments { - if s == nil { + if playlist.Key != nil && playlist.Key.URI != "" { + if u, err := url.Parse(playlist.Key.URI); err != nil { + return nil, nil, err + } else { + playlist.Key.URI = u.String() + } + } + for _, i := range playlist.Segments { + if i == nil { continue } - - if s.Key != nil && s.Key.URI != "" { - u, err := url.Parse(s.Key.URI) - if err != nil { + if i.Key != nil && i.Key.URI != "" { + if u, err := url.Parse(i.Key.URI); err != nil { return nil, nil, err + } else { + i.Key.URI = u.String() } - s.Key.URI = u.String() } - - if s.Discontinuity { - playlist.Key = s.Key + if i.Discontinuity { + playlist.Key = i.Key } else { - if s.Key == nil && playlist.Key != nil { - s.Key = playlist.Key + if i.Key == nil && playlist.Key != nil { + i.Key = playlist.Key } } - - u, err := url.Parse(s.URI) - if err != nil { + if u, err := url.Parse(i.URI); err != nil { return nil, nil, err + } else { + i.URI = u.String() } - s.URI = u.String() - - segments = append(segments, s) } - playlist.Segments = segments - return url, playlist, nil case *m3u8.MasterPlaylist: for _, i := range playlist.Variants { - u, err := url.Parse(i.URI) - if err != nil { + if u, err := url.Parse(i.URI); err != nil { continue + } else { + i.URI = u.String() } - i.URI = u.String() } sort.SliceStable(playlist.Variants, func(i, j int) bool { return playlist.Variants[i].Bandwidth > playlist.Variants[j].Bandwidth From 7e29dcd9bbd411ce1a115663496ee1002d4d68ce Mon Sep 17 00:00:00 2001 From: sunshineplan Date: Sun, 2 Jun 2024 20:52:22 +0800 Subject: [PATCH 2/2] Remove nil MediaSegment --- m3u8.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/m3u8.go b/m3u8.go index 585ae71..990310a 100644 --- a/m3u8.go +++ b/m3u8.go @@ -6,6 +6,7 @@ import ( "log/slog" "net/url" "os" + "slices" "sort" "time" @@ -26,6 +27,7 @@ func parse(url *url.URL, playlist m3u8.Playlist) (*url.URL, *m3u8.MediaPlaylist, playlist.Key.URI = u.String() } } + playlist.Segments = slices.DeleteFunc(playlist.Segments, func(i *m3u8.MediaSegment) bool { return i == nil }) for _, i := range playlist.Segments { if i == nil { continue