mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-07 17:10:29 +00:00
New hls protocol in internal/protocol/hls (registered ahead of http): - master playlist variant picking (highest bandwidth), RFC3986 segment URL resolution, fMP4 init segments, EXT-X-BYTERANGE, EXT-X-GAP skip - AES-128 decryption with mid-playlist key rotation and sequence-derived IVs; explicit errors for live streams, SAMPLE-AES and multi-period fMP4 - concurrent segment downloads with retry, journal-based resume across pause/app restarts, automatic in-order merge into a single .ts/.mp4 - best-effort Content-Length probing for determinate progress - anti-hotlink Referer/Cookie/UA via task extra headers (Go transport does not filter them) Core: fix SchemeFilter extension match for URLs with query strings (also benefits .torrent links); Flutter: Protocol.hls enum, hls protocol config model (prevents config round-trip wipe) and HLS settings block with localized labels in all 22 locales. Tests: parser/crypto unit tests, httptest e2e (Referer-enforced CDN, encrypted streams, byterange, pause/resume, store/restore) and an opt-in live-site acceptance gate (HLS_LIVE_URL).
40 lines
1.0 KiB
Go
40 lines
1.0 KiB
Go
package hls
|
|
|
|
import (
|
|
_ "embed"
|
|
"net/url"
|
|
"testing"
|
|
)
|
|
|
|
//go:embed testdata/olemovienews.m3u8
|
|
var realWorldPlaylist string
|
|
|
|
// TestParseMediaRealWorld guards parsing against a real site playlist
|
|
// (olemovienews.com VOD, 138 TS segments).
|
|
func TestParseMediaRealWorld(t *testing.T) {
|
|
base, err := url.Parse("https://europe.olemovienews.com/ts2/20230125/afAxfjit/mp4/afAxfjit.mp4/index-v1-a1.m3u8")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
media, err := ParseMedia(realWorldPlaylist, base)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if media.Live {
|
|
t.Error("real VOD playlist should not be live")
|
|
}
|
|
if media.IsFMP4 {
|
|
t.Error("playlist should be detected as TS")
|
|
}
|
|
if len(media.Segments) != 138 {
|
|
t.Errorf("want 138 segments, got %d", len(media.Segments))
|
|
}
|
|
first := media.Segments[0]
|
|
if first.URI != "https://europe.olemovienews.com/ts2/20230125/afAxfjit/mp4/afAxfjit.mp4/seg-1-v1-a1.ts" {
|
|
t.Errorf("segment URI resolution wrong: %s", first.URI)
|
|
}
|
|
if media.Segments[0].Sequence != 1 {
|
|
t.Errorf("first sequence = %d, want 1", media.Segments[0].Sequence)
|
|
}
|
|
}
|