diff --git a/restream/app/progress.go b/restream/app/progress.go index 5015f835..788e868d 100644 --- a/restream/app/progress.go +++ b/restream/app/progress.go @@ -10,7 +10,8 @@ type ProgressIOFramerate struct { type ProgressIO struct { ID string - Address string + URL string // The original URL as reported by ffmpeg + Address string // A possibly modified URL // General Index uint64 @@ -48,6 +49,7 @@ type ProgressIO struct { } func (p *ProgressIO) UnmarshalParser(pp *parse.ProgressIO) { + p.URL = pp.URL p.Address = pp.Address p.Index = pp.Index p.Stream = pp.Stream @@ -85,6 +87,7 @@ func (p *ProgressIO) UnmarshalParser(pp *parse.ProgressIO) { func (p *ProgressIO) MarshalParser() parse.ProgressIO { pp := parse.ProgressIO{ + URL: p.URL, Address: p.Address, Index: p.Index, Stream: p.Stream, diff --git a/restream/task.go b/restream/task.go index 40cb74c4..21dcc3db 100644 --- a/restream/task.go +++ b/restream/task.go @@ -289,25 +289,28 @@ func (t *task) State() (*app.State, error) { progress := t.parser.Progress() state.Progress.UnmarshalParser(&progress) - for i, p := range state.Progress.Input { - if int(p.Index) >= len(t.process.Config.Input) { - continue - } - - state.Progress.Input[i].ID = t.process.Config.Input[p.Index].ID - } - - for i, p := range state.Progress.Output { - if int(p.Index) >= len(t.process.Config.Output) { - continue - } - - state.Progress.Output[i].ID = t.process.Config.Output[p.Index].ID - } + state.Progress.Input = assignConfigID(state.Progress.Input, t.process.Config.Input) + state.Progress.Output = assignConfigID(state.Progress.Output, t.process.Config.Output) return state, nil } +func assignConfigID(progress []app.ProgressIO, config []app.ConfigIO) []app.ProgressIO { + for i, p := range progress { + for _, c := range config { + if c.Address != p.URL { + continue + } + + progress[i].ID = c.ID + + break + } + } + + return progress +} + func (t *task) Report() (*app.Report, error) { token := t.lock.RLock() defer t.lock.RUnlock(token) diff --git a/restream/task_test.go b/restream/task_test.go new file mode 100644 index 00000000..c836fd56 --- /dev/null +++ b/restream/task_test.go @@ -0,0 +1,199 @@ +package restream + +import ( + "testing" + + "github.com/datarhei/core/v16/restream/app" + "github.com/stretchr/testify/require" +) + +func TestAssignConfigID(t *testing.T) { + config := app.Config{ + Input: []app.ConfigIO{ + { + ID: "0", + Address: "https://example.com/3j3wr1ua_360.m3u8", + }, + { + ID: "1", + Address: "https://example.com/3j3wr1ua_720.m3u8", + }, + { + ID: "2", + Address: "https://example.com/3j3wr1ua_1080.m3u8", + }, + { + ID: "3", + Address: "anullsrc=r=44100:cl=mono", + }, + }, + Output: []app.ConfigIO{ + { + ID: "0", + Address: "/%v.m3u8", + }, + { + ID: "snapshot", + Address: "/%v.jpg", + }, + { + ID: "snapshot_main", + Address: "/main.jpg", + }, + { + ID: "snapshot_main_240", + Address: "/main_240.jpg", + }, + }, + } + + progress := app.Progress{ + Input: []app.ProgressIO{ + { + URL: "https://example.com/3j3wr1ua_360.m3u8", + Address: "https://example.com/3j3wr1ua_360.m3u8", + }, + { + URL: "https://example.com/3j3wr1ua_720.m3u8", + Address: "https://example.com/3j3wr1ua_720.m3u8", + }, + { + URL: "https://example.com/3j3wr1ua_1080.m3u8", + Address: "https://example.com/3j3wr1ua_1080.m3u8", + }, + { + URL: "anullsrc=r=44100:cl=mono", + Address: "anullsrc=r=44100:cl=mono", + }, + }, + Output: []app.ProgressIO{ + { + URL: "/%v.m3u8", + Address: "/0.m3u8", + }, + { + URL: "/%v.m3u8", + Address: "/1.m3u8", + }, + { + URL: "/%v.m3u8", + Address: "/2.m3u8", + }, + { + URL: "/%v.m3u8", + Address: "/0.m3u8", + }, + { + URL: "/%v.m3u8", + Address: "/1.m3u8", + }, + { + URL: "/%v.m3u8", + Address: "/2.m3u8", + }, + { + URL: "/%v.jpg", + Address: "/%v.jpg", + }, + { + URL: "/%v.jpg", + Address: "/%v.jpg", + }, + { + URL: "/%v.jpg", + Address: "/%v.jpg", + }, + { + URL: "/main.jpg", + Address: "/main.jpg", + }, + { + URL: "/main_240.jpg", + Address: "/main_240.jpg", + }, + }, + } + + progress.Input = assignConfigID(progress.Input, config.Input) + require.Equal(t, []app.ProgressIO{ + { + ID: "0", + URL: "https://example.com/3j3wr1ua_360.m3u8", + Address: "https://example.com/3j3wr1ua_360.m3u8", + }, + { + ID: "1", + URL: "https://example.com/3j3wr1ua_720.m3u8", + Address: "https://example.com/3j3wr1ua_720.m3u8", + }, + { + ID: "2", + URL: "https://example.com/3j3wr1ua_1080.m3u8", + Address: "https://example.com/3j3wr1ua_1080.m3u8", + }, + { + ID: "3", + URL: "anullsrc=r=44100:cl=mono", + Address: "anullsrc=r=44100:cl=mono", + }, + }, progress.Input) + + progress.Output = assignConfigID(progress.Output, config.Output) + require.Equal(t, []app.ProgressIO{ + { + ID: "0", + URL: "/%v.m3u8", + Address: "/0.m3u8", + }, + { + ID: "0", + URL: "/%v.m3u8", + Address: "/1.m3u8", + }, + { + ID: "0", + URL: "/%v.m3u8", + Address: "/2.m3u8", + }, + { + ID: "0", + URL: "/%v.m3u8", + Address: "/0.m3u8", + }, + { + ID: "0", + URL: "/%v.m3u8", + Address: "/1.m3u8", + }, + { + ID: "0", + URL: "/%v.m3u8", + Address: "/2.m3u8", + }, + { + ID: "snapshot", + URL: "/%v.jpg", + Address: "/%v.jpg", + }, + { + ID: "snapshot", + URL: "/%v.jpg", + Address: "/%v.jpg", + }, + { + ID: "snapshot", + URL: "/%v.jpg", + Address: "/%v.jpg", + }, + { + ID: "snapshot_main", + URL: "/main.jpg", + Address: "/main.jpg", + }, + { + ID: "snapshot_main_240", + URL: "/main_240.jpg", + Address: "/main_240.jpg", + }, + }, progress.Output) +}