Transcoder: Fix missing last chapter

This commit is contained in:
Arthur Jamet 2024-05-13 20:12:59 +02:00 committed by Arthur Jamet
parent 9222b2e2d3
commit 8a2343e76b

View File

@ -252,13 +252,14 @@ func getInfo(path string) (*MediaInfo, error) {
// fmt.Printf("%s", mi.Option("info_parameters", "")) // fmt.Printf("%s", mi.Option("info_parameters", ""))
// duration in seconds
duration := ParseFloat(mi.Parameter(mediainfo.StreamGeneral, 0, "Duration")) / 1000
ret := MediaInfo{ ret := MediaInfo{
Path: path, Path: path,
// Remove leading . // Remove leading .
Extension: filepath.Ext(path)[1:], Extension: filepath.Ext(path)[1:],
Size: ParseUint64(mi.Parameter(mediainfo.StreamGeneral, 0, "FileSize")), Size: ParseUint64(mi.Parameter(mediainfo.StreamGeneral, 0, "FileSize")),
// convert ms to seconds Duration: duration,
Duration: ParseFloat(mi.Parameter(mediainfo.StreamGeneral, 0, "Duration")) / 1000,
Container: OrNull(mi.Parameter(mediainfo.StreamGeneral, 0, "Format")), Container: OrNull(mi.Parameter(mediainfo.StreamGeneral, 0, "Format")),
Videos: Map(make([]Video, ParseUint(mi.Parameter(mediainfo.StreamVideo, 0, "StreamCount"))), func(_ Video, i int) Video { Videos: Map(make([]Video, ParseUint(mi.Parameter(mediainfo.StreamVideo, 0, "StreamCount"))), func(_ Video, i int) Video {
return Video{ return Video{
@ -310,7 +311,7 @@ func getInfo(path string) (*MediaInfo, error) {
Link: link, Link: link,
} }
}), }),
Chapters: getChapters(chapters_begin, chapters_end, mi), Chapters: getChapters(chapters_begin, chapters_end, mi, duration),
Fonts: Map( Fonts: Map(
attachments, attachments,
func(font string, _ int) string { func(font string, _ int) string {
@ -345,8 +346,8 @@ func chapterTimeIsValid(chapterTime string) bool {
return len(chapterTime) > 0 && unicode.IsDigit(rune(chapterTime[0])) return len(chapterTime) > 0 && unicode.IsDigit(rune(chapterTime[0]))
} }
func getChapters(chapters_begin uint32, chapters_end uint32, mi *mediainfo.File) []Chapter { func getChapters(chapters_begin uint32, chapters_end uint32, mi *mediainfo.File, duration float32) []Chapter {
chapterCount := max(chapters_end-chapters_begin, 1) - 1 chapterCount := max(chapters_end-chapters_begin, 1)
chapterIterationCount := chapterCount chapterIterationCount := chapterCount
for i := uint32(0); i < chapterIterationCount; i++ { for i := uint32(0); i < chapterIterationCount; i++ {
@ -360,11 +361,16 @@ func getChapters(chapters_begin uint32, chapters_end uint32, mi *mediainfo.File)
if !chapterTimeIsValid(startTime) { if !chapterTimeIsValid(startTime) {
return Chapter{} return Chapter{}
} }
// +1 is safe, the value at chapters_end contains the right duration
rawEndTime := mi.GetI(mediainfo.StreamMenu, 0, int(chapters_begin)+i+1, mediainfo.InfoName)
parsedEndTime := duration
if chapterTimeIsValid(rawEndTime) {
parsedEndTime = ParseTime(rawEndTime)
}
return Chapter{ return Chapter{
StartTime: ParseTime(startTime), StartTime: ParseTime(startTime),
// +1 is safe, the value at chapters_end contains the right duration EndTime: parsedEndTime,
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),
Name: mi.GetI(mediainfo.StreamMenu, 0, int(chapters_begin)+i, mediainfo.InfoText),
} }
}), func(chapter Chapter, i int) bool { }), func(chapter Chapter, i int) bool {
return chapter != Chapter{} return chapter != Chapter{}