60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"time"
|
|
)
|
|
|
|
func secs_to_srt_time(secs float64) string {
|
|
dur := time.Duration(secs) * time.Second
|
|
|
|
hh := int64(dur.Hours())
|
|
mm := int64(dur.Minutes()) - (hh * 60)
|
|
ss := int64(dur.Seconds()) - (hh * 3600) - (mm * 60)
|
|
ms := int64(dur.Milliseconds()) - (hh * 3600000) - (mm * 60000) - (ss * 1000)
|
|
|
|
return fmt.Sprintf("%02d:%02d:%02d,%03d", hh, mm, ss, ms)
|
|
}
|
|
|
|
func (ltc *loadTupContent) WriteSRT(w io.Writer, totalVideoDurationSecs float64) error {
|
|
/*
|
|
|
|
SRT file format (example from Wikipedia):
|
|
|
|
1
|
|
00:02:17,440 --> 00:02:20,375
|
|
Senator, we're making
|
|
our final approach into Coruscant.
|
|
|
|
2
|
|
00:02:20,476 --> 00:02:22,501
|
|
Very good, Lieutenant.
|
|
*/
|
|
|
|
ctr := 1
|
|
for i := 0; i < len(ltc.Caps); i += 1 {
|
|
if ltc.Caps[i] == "" {
|
|
// Don't show anything
|
|
continue
|
|
}
|
|
|
|
start := secs_to_srt_time(ltc.Secs[i])
|
|
var end string
|
|
if i < len(ltc.Caps)-1 {
|
|
end = secs_to_srt_time(ltc.Secs[i+1])
|
|
} else {
|
|
// The final subtitle. Loadtup displays these for the entire
|
|
// remaining video duration
|
|
end = secs_to_srt_time(totalVideoDurationSecs)
|
|
}
|
|
|
|
fmt.Fprintf(w, "%d\n%s --> %s\n%s\n\n",
|
|
ctr, start, end, ltc.Caps[i])
|
|
// We emitted a message, increase the counter
|
|
ctr += 1
|
|
}
|
|
|
|
return nil
|
|
}
|