Skip to content

Commit 25b7e22

Browse files
Allow for more lenient duration parsing (#124)
1 parent 646078d commit 25b7e22

File tree

4 files changed

+47
-6
lines changed

4 files changed

+47
-6
lines changed

srt.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ import (
1414

1515
// Constants
1616
const (
17-
srtTimeBoundariesSeparator = " --> "
17+
srtTimeBoundariesSeparator = "-->"
1818
)
1919

2020
// Vars
2121
var (
22-
bytesSRTTimeBoundariesSeparator = []byte(srtTimeBoundariesSeparator)
22+
bytesSRTTimeBoundariesSeparator = []byte(" "+srtTimeBoundariesSeparator+" ")
2323
)
2424

2525
// parseDurationSRT parses an .srt duration
@@ -106,7 +106,7 @@ func ReadFromSRT(i io.Reader) (o *Subtitles, err error) {
106106
return
107107
}
108108
// We do this to eliminate extra stuff like positions which are not documented anywhere
109-
s2 := strings.Split(s1[1], " ")
109+
s2 := strings.Fields(s1[1])
110110

111111
// Parse time boundaries
112112
if s.StartAt, err = parseDurationSRT(s1[0]); err != nil {

srt_test.go

+17
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import (
44
"bytes"
55
"io/ioutil"
66
"os"
7+
"strings"
78
"testing"
89
"time"
910

1011
"github.com/asticode/go-astisub"
1112
"github.com/stretchr/testify/assert"
13+
"github.com/stretchr/testify/require"
1214
)
1315

1416
func TestSRT(t *testing.T) {
@@ -138,3 +140,18 @@ func TestSRTStyled(t *testing.T) {
138140
assert.NoError(t, err)
139141
assert.Equal(t, string(c), w.String())
140142
}
143+
144+
func TestSRTParseDuration(t *testing.T) {
145+
testData := `
146+
1
147+
00:00:01.876-->00:0:03.390
148+
Duration without enclosing space`
149+
150+
s, err := astisub.ReadFromSRT(strings.NewReader(testData))
151+
require.NoError(t, err)
152+
153+
require.Len(t, s.Items, 1)
154+
assert.Equal(t, 1*time.Second+876*time.Millisecond, s.Items[0].StartAt)
155+
assert.Equal(t, 3*time.Second+390*time.Millisecond, s.Items[0].EndAt)
156+
assert.Equal(t, "Duration without enclosing space", s.Items[0].Lines[0].String())
157+
}

webvtt.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ const (
2525
webvttBlockNameStyle = "style"
2626
webvttBlockNameText = "text"
2727
webvttDefaultStyleID = "astisub-webvtt-default-style-id"
28-
webvttTimeBoundariesSeparator = " --> "
28+
webvttTimeBoundariesSeparator = "-->"
2929
webvttTimestampMapHeader = "X-TIMESTAMP-MAP"
3030
)
3131

3232
// Vars
3333
var (
3434
bytesWebVTTItalicEndTag = []byte("</i>")
3535
bytesWebVTTItalicStartTag = []byte("<i>")
36-
bytesWebVTTTimeBoundariesSeparator = []byte(webvttTimeBoundariesSeparator)
36+
bytesWebVTTTimeBoundariesSeparator = []byte(" "+webvttTimeBoundariesSeparator+" ")
3737
webVTTRegexpInlineTimestamp = regexp.MustCompile(`<((?:\d{2,}:)?\d{2}:\d{2}\.\d{3})>`)
3838
webVTTRegexpTag = regexp.MustCompile(`(</*\s*([^\.\s]+)(\.[^\s/]*)*\s*([^/]*)\s*/*>)`)
3939
)
@@ -237,7 +237,7 @@ func ReadFromWebVTT(i io.Reader) (o *Subtitles, err error) {
237237
var left = strings.Split(line, webvttTimeBoundariesSeparator)
238238

239239
// Split line on space to get remaining of time data
240-
var right = strings.Split(left[1], " ")
240+
var right = strings.Fields(left[1])
241241

242242
// Parse time boundaries
243243
if item.StartAt, err = parseDurationWebVTT(left[0]); err != nil {

webvtt_test.go

+24
Original file line numberDiff line numberDiff line change
@@ -224,3 +224,27 @@ Text with a <00:06:30.000>timestamp in the middle
224224
Do no fall to the next item
225225
`, b.String())
226226
}
227+
228+
func TestWebVTTParseDuration(t *testing.T) {
229+
testData := `WEBVTT
230+
1
231+
00:00:01.876-->00:0:03.390
232+
Duration without enclosing space
233+
234+
2
235+
00:00:03.391-->00:00:06.567 align:middle
236+
Duration with tab spaced styles`
237+
238+
s, err := astisub.ReadFromWebVTT(strings.NewReader(testData))
239+
require.NoError(t, err)
240+
241+
require.Len(t, s.Items, 2)
242+
assert.Equal(t, 1*time.Second+876*time.Millisecond, s.Items[0].StartAt)
243+
assert.Equal(t, 3*time.Second+390*time.Millisecond, s.Items[0].EndAt)
244+
assert.Equal(t, "Duration without enclosing space", s.Items[0].Lines[0].String())
245+
assert.Equal(t, 3*time.Second+391*time.Millisecond, s.Items[1].StartAt)
246+
assert.Equal(t, 6*time.Second+567*time.Millisecond, s.Items[1].EndAt)
247+
assert.Equal(t, "Duration with tab spaced styles", s.Items[1].Lines[0].String())
248+
assert.NotNil(t, s.Items[1].InlineStyle)
249+
assert.Equal(t, s.Items[1].InlineStyle.WebVTTAlign, "middle")
250+
}

0 commit comments

Comments
 (0)