From be0bd81107301cb7f8450001a0ff6b399661b8b3 Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Sat, 11 May 2024 11:06:27 +0200 Subject: [PATCH] Transcoder: Prevent error caused by buggy chapters parsing by mediainfo --- transcoder/src/info.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/transcoder/src/info.go b/transcoder/src/info.go index 3a75c621..10f32b40 100644 --- a/transcoder/src/info.go +++ b/transcoder/src/info.go @@ -13,6 +13,7 @@ import ( "strconv" "strings" "sync" + "unicode" "github.com/zoriya/go-mediainfo" ) @@ -152,6 +153,15 @@ func Map[T, U any](ts []T, f func(T, int) U) []U { return us } +func Filter[T any](ss []T, test func(T, int) bool) (ret []T) { + for i, s := range ss { + if test(s, i) { + ret = append(ret, s) + } + } + return +} + func OrNull(str string) *string { if str == "" { return nil @@ -300,13 +310,20 @@ func getInfo(path string) (*MediaInfo, error) { Link: link, } }), - Chapters: Map(make([]Chapter, max(chapters_end-chapters_begin, 1)-1), func(_ Chapter, i int) Chapter { + Chapters: Filter(Map(make([]Chapter, max(chapters_end-chapters_begin, 1)-1), func(_ Chapter, i int) Chapter { + startTime := mi.GetI(mediainfo.StreamMenu, 0, int(chapters_begin)+i, mediainfo.InfoName) + // We expect `startTime` to be something like `00:00:00` + if len(startTime) > 0 && !unicode.IsDigit(rune(startTime[0])) { + return Chapter{} + } return Chapter{ - StartTime: ParseTime(mi.GetI(mediainfo.StreamMenu, 0, int(chapters_begin)+i, mediainfo.InfoName)), + StartTime: ParseTime(startTime), // +1 is safe, the value at chapters_end contains the right duration EndTime: ParseTime(mi.GetI(mediainfo.StreamMenu, 0, int(chapters_begin)+i+1, mediainfo.InfoName)), Name: mi.GetI(mediainfo.StreamMenu, 0, int(chapters_begin)+i, mediainfo.InfoText), } + }), func(chapter Chapter, i int) bool { + return chapter != Chapter{} }), Fonts: Map( attachments,