From 07ae5d3ac755d632f68c4b3286ebe68da37f430a Mon Sep 17 00:00:00 2001 From: davotoula Date: Tue, 14 Apr 2026 15:30:31 +0200 Subject: [PATCH] test(hls): add byterange playlist rewrite case Verifies HlsPlaylistRewriter handles the default single-file-per-rendition output from HlsPreparer where every segment reference points to the same combined fMP4 file and EXT-X-BYTERANGE lines must be preserved unchanged. Co-Authored-By: Claude Opus 4.5 --- .../uploads/hls/HlsPlaylistRewriterTest.kt | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/amethyst/src/test/java/com/vitorpamplona/amethyst/service/uploads/hls/HlsPlaylistRewriterTest.kt b/amethyst/src/test/java/com/vitorpamplona/amethyst/service/uploads/hls/HlsPlaylistRewriterTest.kt index 7c1b72576..b837e1a77 100644 --- a/amethyst/src/test/java/com/vitorpamplona/amethyst/service/uploads/hls/HlsPlaylistRewriterTest.kt +++ b/amethyst/src/test/java/com/vitorpamplona/amethyst/service/uploads/hls/HlsPlaylistRewriterTest.kt @@ -216,6 +216,56 @@ class HlsPlaylistRewriterTest { assertEquals(expected, rewritten) } + @Test + fun rewritesSingleFileByterangePlaylist() { + // Matches PlaylistGenerator.buildByteRangeMediaPlaylist output when HlsConfig + // singleFilePerRendition=true (the default). All segment references point to + // the same combined fMP4 file; #EXT-X-BYTERANGE lines must be preserved. + val playlist = + """ + #EXTM3U + #EXT-X-VERSION:7 + #EXT-X-TARGETDURATION:6 + #EXT-X-MEDIA-SEQUENCE:0 + #EXT-X-PLAYLIST-TYPE:VOD + #EXT-X-MAP:URI="360p.mp4",BYTERANGE="1234@0" + + #EXTINF:6.000, + #EXT-X-BYTERANGE:500000@1234 + 360p.mp4 + #EXTINF:6.000, + #EXT-X-BYTERANGE:480000@501234 + 360p.mp4 + #EXT-X-ENDLIST + """.trimIndent() + + val rewritten = + HlsPlaylistRewriter.rewrite( + playlist, + mapOf("360p.mp4" to "https://cdn/abc.mp4"), + ) + + val expected = + """ + #EXTM3U + #EXT-X-VERSION:7 + #EXT-X-TARGETDURATION:6 + #EXT-X-MEDIA-SEQUENCE:0 + #EXT-X-PLAYLIST-TYPE:VOD + #EXT-X-MAP:URI="https://cdn/abc.mp4",BYTERANGE="1234@0" + + #EXTINF:6.000, + #EXT-X-BYTERANGE:500000@1234 + https://cdn/abc.mp4 + #EXTINF:6.000, + #EXT-X-BYTERANGE:480000@501234 + https://cdn/abc.mp4 + #EXT-X-ENDLIST + """.trimIndent() + + assertEquals(expected, rewritten) + } + @Test fun throwsWhenSegmentReferenceIsMissingFromUrlMap() { val playlist =