@@ -20,18 +20,12 @@ func looksLikeSrt(s string) bool {
20
20
}
21
21
22
22
// ParseSrt parses a .srt text into []Caption, assumes s is a clean utf8 string
23
- func parseSrt (s string ) []caption {
24
-
25
- var res []caption
26
-
23
+ func parseSrt (s string ) (res []caption ) {
27
24
r1 := regexp .MustCompile ("([0-9:.,]*) --> ([0-9:.,]*)" )
28
-
29
25
lines := strings .Split (s , "\n " )
30
-
31
26
outSeq := 1
32
27
33
28
for i := 0 ; i < len (lines ); i ++ {
34
-
35
29
seq := strings .Trim (lines [i ], "\r " )
36
30
if seq == "" {
37
31
continue
@@ -57,13 +51,13 @@ func parseSrt(s string) []caption {
57
51
continue
58
52
}
59
53
60
- o .Start , err = parseTime (matches [1 ])
54
+ o .Start , err = ParseTime (matches [1 ])
61
55
if err != nil {
62
56
fmt .Printf ("[srt] Parse error 3 at line %d: %v\n " , i , err )
63
57
continue
64
58
}
65
59
66
- o .End , err = parseTime (matches [2 ])
60
+ o .End , err = ParseTime (matches [2 ])
67
61
if err != nil {
68
62
fmt .Printf ("[srt] Parse error 4 at line %d: %v\n " , i , err )
69
63
continue
@@ -97,42 +91,36 @@ func parseSrt(s string) []caption {
97
91
outSeq ++
98
92
}
99
93
}
100
-
101
- return res
94
+ return
102
95
}
103
96
104
- func parseTime (in string ) (time.Time , error ) {
97
+ // ParseTime parses a subtitle time (duration since start of film)
98
+ func ParseTime (in string ) (time.Time , error ) {
99
+ // . and , to :
100
+ in = strings .Replace (in , "," , ":" , - 1 )
101
+ in = strings .Replace (in , "." , ":" , - 1 )
105
102
106
- // . to ,
107
- in = strings .Replace (in , "," , "." , 1 )
108
-
109
- if ! strings .ContainsAny (in , "." ) {
110
- in += ".000"
103
+ if strings .Count (in , ":" ) == 2 {
104
+ in += ":000"
111
105
}
112
106
113
- r1 := regexp .MustCompile ("([0-9]+):([0-9]+):([0-9]+)[.]([0-9]+)" )
114
-
107
+ r1 := regexp .MustCompile ("([0-9]+):([0-9]+):([0-9]+):([0-9]+)" )
115
108
matches := r1 .FindStringSubmatch (in )
116
-
117
109
if len (matches ) < 5 {
118
110
return time .Now (), fmt .Errorf ("[srt] Regexp didnt match: %s" , in )
119
111
}
120
-
121
112
h , err := strconv .Atoi (matches [1 ])
122
113
if err != nil {
123
114
return time .Now (), err
124
115
}
125
-
126
116
m , err := strconv .Atoi (matches [2 ])
127
117
if err != nil {
128
118
return time .Now (), err
129
119
}
130
-
131
120
s , err := strconv .Atoi (matches [3 ])
132
121
if err != nil {
133
122
return time .Now (), err
134
123
}
135
-
136
124
ms , err := strconv .Atoi (matches [4 ])
137
125
if err != nil {
138
126
return time .Now (), err
@@ -143,30 +131,19 @@ func parseTime(in string) (time.Time, error) {
143
131
144
132
// writeSrt prints a srt render to outFileName
145
133
func writeSrt (subs []caption , outFileName string ) error {
146
-
147
134
text := renderSrt (subs )
148
-
149
- err := ioutil .WriteFile (outFileName , []byte (text ), 0644 )
150
- if err != nil {
151
- return err
152
- }
153
- return nil
135
+ return ioutil .WriteFile (outFileName , []byte (text ), 0644 )
154
136
}
155
137
156
138
// renderSrt produces a text representation of the subtitles
157
- func renderSrt (subs []caption ) string {
158
-
159
- res := ""
160
-
139
+ func renderSrt (subs []caption ) (res string ) {
161
140
for _ , sub := range subs {
162
141
res += renderCaptionAsSrt (sub )
163
142
}
164
-
165
- return res
143
+ return
166
144
}
167
145
168
146
func renderCaptionAsSrt (cap caption ) string {
169
-
170
147
res := fmt .Sprintf ("%d" , cap .Seq ) + eol +
171
148
cap .srtTime () + eol
172
149
0 commit comments