Skip to content

Commit 6299e69

Browse files
committed
vtt: fix parsing of short times, fixes #4
1 parent 5620167 commit 6299e69

File tree

6 files changed

+45
-27
lines changed

6 files changed

+45
-27
lines changed

ccdb.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,5 @@ func NewFromCCDBCapture(s string) (res Subtitle, err error) {
5959
}
6060

6161
func parseCCDBTime(s string) (time.Time, error) {
62-
return parseTime(s)
62+
return parseSrtTime(s)
6363
}

dcsub.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ func (parser *dcsubParser) traverse(n *parser.Node) (Subtitle, bool) {
5454
parser.cap.Seq, _ = strconv.Atoi(p)
5555
}
5656
if p, ok := getAttribute(n, "timein"); ok {
57-
parser.cap.Start, _ = parseTime(p)
57+
parser.cap.Start, _ = parseSrtTime(p)
5858
}
5959
if p, ok := getAttribute(n, "timeout"); ok {
60-
parser.cap.End, _ = parseTime(p)
60+
parser.cap.End, _ = parseSrtTime(p)
6161
}
6262
}
6363

srt.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ func NewFromSRT(s string) (res Subtitle, err error) {
5454
break
5555
}
5656

57-
o.Start, err = parseTime(matches[1])
57+
o.Start, err = parseSrtTime(matches[1])
5858
if err != nil {
5959
err = fmt.Errorf("srt: start error at line %d: %v", i, err)
6060
break
6161
}
6262

63-
o.End, err = parseTime(matches[2])
63+
o.End, err = parseSrtTime(matches[2])
6464
if err != nil {
6565
err = fmt.Errorf("srt: end error at line %d: %v", i, err)
6666
break

srt_test.go

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,6 @@ import (
66
"github.com/stretchr/testify/assert"
77
)
88

9-
func TestParseTime(t *testing.T) {
10-
t1, _ := parseTime("18:40:22.110")
11-
t2, _ := parseTime("18:40:22,110")
12-
t3, _ := parseTime("18:40:22:110")
13-
t4, _ := parseTime("18:40:22")
14-
t5, _ := parseTime("00:00:0,500")
15-
t6, _ := parseTime("00:00:2,00")
16-
t7, _ := parseTime("00:14:52.12")
17-
18-
assert.Equal(t, makeTime(18, 40, 22, 110), t1)
19-
assert.Equal(t, makeTime(18, 40, 22, 110), t2)
20-
assert.Equal(t, makeTime(18, 40, 22, 110), t3)
21-
assert.Equal(t, makeTime(18, 40, 22, 0), t4)
22-
assert.Equal(t, makeTime(0, 0, 0, 500), t5)
23-
assert.Equal(t, makeTime(0, 0, 2, 0), t6)
24-
assert.Equal(t, makeTime(0, 14, 52, 12), t7)
25-
}
26-
279
func TestNewFromSRT(t *testing.T) {
2810
in := "1\n" +
2911
"00:00:04,630 --> 00:00:06,018\n" +

time.go

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ func makeTime(h int, m int, s int, ms int) time.Time {
1313
return time.Date(0, 1, 1, h, m, s, ms*1000*1000, time.UTC)
1414
}
1515

16-
// parseTime parses a subtitle time (duration since start of film)
17-
func parseTime(in string) (time.Time, error) {
16+
// parseSrtTime parses a srt subtitle time (duration since start of film)
17+
func parseSrtTime(in string) (time.Time, error) {
1818
// . and , to :
1919
in = strings.Replace(in, ",", ":", -1)
2020
in = strings.Replace(in, ".", ":", -1)
@@ -47,3 +47,39 @@ func parseTime(in string) (time.Time, error) {
4747

4848
return makeTime(h, m, s, ms), nil
4949
}
50+
51+
// parseVttTime parses a VTT time (duration since start of film)
52+
// specification at https://www.w3.org/TR/webvtt1/#cue-timings-and-settings-parsing
53+
func parseVttTime(in string) (time.Time, error) {
54+
// . and , to :
55+
in = strings.Replace(in, ",", ":", -1)
56+
in = strings.Replace(in, ".", ":", -1)
57+
58+
if strings.Count(in, ":") == 2 {
59+
in = "00:" + in
60+
}
61+
62+
r1 := regexp.MustCompile("([0-9]+):([0-9]+):([0-9]+):([0-9]+)")
63+
matches := r1.FindStringSubmatch(in)
64+
if len(matches) < 5 {
65+
return time.Now(), fmt.Errorf("[vtt] Regexp didnt match: %s", in)
66+
}
67+
h, err := strconv.Atoi(matches[1])
68+
if err != nil {
69+
return time.Now(), err
70+
}
71+
m, err := strconv.Atoi(matches[2])
72+
if err != nil {
73+
return time.Now(), err
74+
}
75+
s, err := strconv.Atoi(matches[3])
76+
if err != nil {
77+
return time.Now(), err
78+
}
79+
ms, err := strconv.Atoi(matches[4])
80+
if err != nil {
81+
return time.Now(), err
82+
}
83+
84+
return makeTime(h, m, s, ms), nil
85+
}

vtt.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@ func NewFromVTT(s string) (res Subtitle, err error) {
6767
break
6868
}
6969

70-
o.Start, err = parseTime(matches[1])
70+
o.Start, err = parseVttTime(matches[1])
7171
if err != nil {
7272
err = fmt.Errorf("vtt: start error at line %d: %v", i, err)
7373
break
7474
}
7575

76-
o.End, err = parseTime(matches[2])
76+
o.End, err = parseVttTime(matches[2])
7777
if err != nil {
7878
err = fmt.Errorf("vtt: end error at line %d: %v", i, err)
7979
break

0 commit comments

Comments
 (0)