From fdfb2ee9871fa2e3b7d1e8024fff0a73122d0315 Mon Sep 17 00:00:00 2001 From: truewhile <779943132@qq.com> Date: Tue, 8 Sep 2026 08:41:01 +0800 Subject: [PATCH] =?UTF-8?q?bug=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/service/stream_hls.go | 6 +++--- internal/service/stream_test.go | 9 ++++++--- internal/service/transcoder_test.go | 5 ++++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/internal/service/stream_hls.go b/internal/service/stream_hls.go index 7a42151..ebf4b76 100644 --- a/internal/service/stream_hls.go +++ b/internal/service/stream_hls.go @@ -94,8 +94,8 @@ func appendQueryToHLSSegments(playlist, rawQuery string) string { if strings.TrimSpace(rawQuery) == "" { return playlist } - // Segment fetches only need auth/profile tokens; drop start= so a seek - // restart does not keep forcing EnsureJobFrom on every .ts hit. + // Segment fetches do not need start=, but must keep _seek as a cache-busting + // generation because every transcode restart reuses seg_00000.ts names. q := filterHLSSegmentQuery(rawQuery) if q == "" { return playlist @@ -131,7 +131,7 @@ func filterHLSSegmentQuery(rawQuery string) string { key = part[:i] } switch strings.ToLower(key) { - case "start", "_seek": + case "start": continue } kept = append(kept, part) diff --git a/internal/service/stream_test.go b/internal/service/stream_test.go index ae3c4d3..6678c35 100644 --- a/internal/service/stream_test.go +++ b/internal/service/stream_test.go @@ -302,9 +302,12 @@ func TestRequestTokenFromMediaBrowserAuthorizationHeader(t *testing.T) { func TestAppendQueryToHLSSegments(t *testing.T) { in := "#EXTM3U\n#EXTINF:4.0,\nseg_00000.ts\n#EXTINF:4.0,\nseg_00001.ts?old=1\n" - got := appendQueryToHLSSegments(in, "token=abc") - if !strings.Contains(got, "seg_00000.ts?token=abc") { - t.Fatalf("missing tokenized segment: %q", got) + got := appendQueryToHLSSegments(in, "token=abc&start=120.5&_seek=1001") + if !strings.Contains(got, "seg_00000.ts?token=abc&_seek=1001") { + t.Fatalf("missing token or seek generation on segment: %q", got) + } + if strings.Contains(got, "start=120.5") { + t.Fatalf("segment URL must not contain transcode start: %q", got) } if !strings.Contains(got, "seg_00001.ts?old=1") { t.Fatalf("existing query should be preserved: %q", got) diff --git a/internal/service/transcoder_test.go b/internal/service/transcoder_test.go index a266327..381bbec 100644 --- a/internal/service/transcoder_test.go +++ b/internal/service/transcoder_test.go @@ -284,11 +284,14 @@ func TestShouldReplaceHLSJob(t *testing.T) { } func TestFilterHLSSegmentQueryDropsStart(t *testing.T) { - got := filterHLSSegmentQuery("token=abc&start=120.5&profile_id=1") + got := filterHLSSegmentQuery("token=abc&start=120.5&_seek=1001&profile_id=1") if strings.Contains(got, "start=") { t.Fatalf("start should be stripped, got %q", got) } if !strings.Contains(got, "token=abc") || !strings.Contains(got, "profile_id=1") { t.Fatalf("auth/profile query should remain, got %q", got) } + if !strings.Contains(got, "_seek=1001") { + t.Fatalf("_seek must remain to isolate cached segment generations, got %q", got) + } }