Allow segments to be mp4 additional to ts

This commit is contained in:
Ingo Oppermann 2024-11-04 12:06:59 +01:00
parent a79004388f
commit 83ec412e05
No known key found for this signature in database
GPG Key ID: 2AB32426E9DD229E
6 changed files with 108 additions and 11 deletions

View File

@ -81,7 +81,7 @@ func (h *handler) handleHLSIngress(c echo.Context, _ string, data map[string]int
mem.Put(r.buffer)
}()
} else if strings.HasSuffix(path, ".ts") {
} else if strings.HasSuffix(path, ".ts") || strings.HasSuffix(path, ".mp4") {
// Get the size of the .ts file and store it in the ts-map for later use.
reader := req.Body
r := &bodysizeReader{
@ -117,7 +117,7 @@ func (h *handler) handleHLSEgress(c echo.Context, _ string, data map[string]inte
sessionID := c.QueryParam("session")
isM3U8 := strings.HasSuffix(path, ".m3u8")
isTS := strings.HasSuffix(path, ".ts")
isTS := strings.HasSuffix(path, ".ts") || strings.HasSuffix(path, ".mp4")
rewrite := false
@ -281,7 +281,7 @@ func (r *segmentReader) getSegments(dir string) []string {
}
// Ignore anything that doesn't end in .ts
if !strings.HasSuffix(u.Path, ".ts") {
if !strings.HasSuffix(u.Path, ".ts") && !strings.HasSuffix(u.Path, ".mp4") {
continue
}
@ -337,7 +337,7 @@ func (g *sessionRewriter) rewriteHLS(sessionID string, requestURL *url.URL, buff
}
// Write anything that doesn't end in .m3u8 or .ts unmodified
if !strings.HasSuffix(u.Path, ".m3u8") && !strings.HasSuffix(u.Path, ".ts") {
if !strings.HasSuffix(u.Path, ".m3u8") && !strings.HasSuffix(u.Path, ".ts") && !strings.HasSuffix(u.Path, ".mp4") {
buffer.Write(byteline)
buffer.WriteByte('\n')
continue

View File

@ -11,8 +11,8 @@ import (
"github.com/stretchr/testify/require"
)
func TestHLSSegmentReader(t *testing.T) {
data, err := os.ReadFile("./fixtures/segments.txt")
func TestHLSSegmentReaderTS(t *testing.T) {
data, err := os.ReadFile("./fixtures/segments_v6.txt")
require.NoError(t, err)
r := bytes.NewReader(data)
@ -38,8 +38,33 @@ func TestHLSSegmentReader(t *testing.T) {
}, segments)
}
func TestHLSSegmentReaderMP4(t *testing.T) {
data, err := os.ReadFile("./fixtures/segments_v7.txt")
require.NoError(t, err)
r := bytes.NewReader(data)
br := &segmentReader{
reader: io.NopCloser(r),
buffer: &mem.Buffer{},
}
_, err = io.ReadAll(br)
require.NoError(t, err)
segments := br.getSegments("/foobar")
require.Equal(t, []string{
"/foobar/test_output_0_0067.mp4",
"/foobar/test_output_0_0068.mp4",
"/foobar/test_output_0_0069.mp4",
"/foobar/test_output_0_0070.mp4",
"/foobar/test_output_0_0071.mp4",
"/foobar/test_output_0_0072.mp4",
}, segments)
}
func BenchmarkHLSSegmentReader(b *testing.B) {
data, err := os.ReadFile("./fixtures/segments.txt")
data, err := os.ReadFile("./fixtures/segments_v6.txt")
require.NoError(b, err)
rd := bytes.NewReader(data)
@ -59,8 +84,8 @@ func BenchmarkHLSSegmentReader(b *testing.B) {
}
}
func TestHLSRewrite(t *testing.T) {
data, err := os.ReadFile("./fixtures/segments.txt")
func TestHLSRewriteTS(t *testing.T) {
data, err := os.ReadFile("./fixtures/segments_v6.txt")
require.NoError(t, err)
br := &sessionRewriter{
@ -77,14 +102,38 @@ func TestHLSRewrite(t *testing.T) {
br.rewriteHLS("oT5GV8eWBbRAh4aib5egoK", u, buffer)
data, err = os.ReadFile("./fixtures/segments_with_session.txt")
data, err = os.ReadFile("./fixtures/segments_v6_with_session.txt")
require.NoError(t, err)
require.Equal(t, data, buffer.Bytes())
}
func TestHLSRewriteMP4(t *testing.T) {
data, err := os.ReadFile("./fixtures/segments_v7.txt")
require.NoError(t, err)
br := &sessionRewriter{
buffer: &mem.Buffer{},
}
_, err = br.Write(data)
require.NoError(t, err)
u, err := url.Parse("http://example.com/test.m3u8")
require.NoError(t, err)
buffer := &mem.Buffer{}
br.rewriteHLS("oT5GV8eWBbRAh4aib5egoK", u, buffer)
data, err = os.ReadFile("./fixtures/segments_v7_with_session.txt")
require.NoError(t, err)
require.Equal(t, data, buffer.Bytes())
}
func BenchmarkHLSRewrite(b *testing.B) {
data, err := os.ReadFile("./fixtures/segments.txt")
data, err := os.ReadFile("./fixtures/segments_v6.txt")
require.NoError(b, err)
u, err := url.Parse("http://example.com/test.m3u8")

View File

@ -0,0 +1,24 @@
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:67
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MAP:URI="test.mp4"
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2024-11-04T10:14:54.317+0000
test_output_0_0067.mp4
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2024-11-04T10:14:56.317+0000
test_output_0_0068.mp4
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2024-11-04T10:14:58.317+0000
test_output_0_0069.mp4
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2024-11-04T10:15:00.317+0000
test_output_0_0070.mp4
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2024-11-04T10:15:02.317+0000
test_output_0_0071.mp4
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2024-11-04T10:15:04.317+0000
test_output_0_0072.mp4

View File

@ -0,0 +1,24 @@
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:67
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MAP:URI="test.mp4"
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2024-11-04T10:14:54.317+0000
test_output_0_0067.mp4?session=oT5GV8eWBbRAh4aib5egoK
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2024-11-04T10:14:56.317+0000
test_output_0_0068.mp4?session=oT5GV8eWBbRAh4aib5egoK
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2024-11-04T10:14:58.317+0000
test_output_0_0069.mp4?session=oT5GV8eWBbRAh4aib5egoK
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2024-11-04T10:15:00.317+0000
test_output_0_0070.mp4?session=oT5GV8eWBbRAh4aib5egoK
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2024-11-04T10:15:02.317+0000
test_output_0_0071.mp4?session=oT5GV8eWBbRAh4aib5egoK
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2024-11-04T10:15:04.317+0000
test_output_0_0072.mp4?session=oT5GV8eWBbRAh4aib5egoK