I was watching a French movie today and realised that the subtitle was coming up to early - about 1 second too early. It's a bit annoying. So I decided to fix it with a simple Javascript - it runs under Node.js.
To run it in a command shell://srt_update.jsfunction main() {// syntax: node srt_update.js filename// therefore the first argument is the 3rd word in the command line.const args = process.argv.slice(2);var filename = args[0];if (filename == null) {console.log("please specify file name.");return;}const readLine = require('readline');const f = require('fs');var rl = readLine.createInterface({input : f.createReadStream(filename),output : process.stdout,terminal: false});//const re=/(?<order>\d+)\n(?<start>[\d:,]+)\s+-{2}\>\s+(?<end>[\d:,]+)\n(?<text>[\s\S]*?(?=\n{2}|$))/gi;//const re=/(?<start>[\d:,]+)\s+-{2}\>\s+(?<end>[\d:,]+)/gi;const re=/(?<shour>[\d]+)[:](?<sminute>[\d]+)[:](?<ssecond>[\d]+)[,](?<smilli>[\d]+)\s+-{2}\>\s+(?<ehour>[\d]+)[:](?<eminute>[\d]+)[:](?<esecond>[\d]+)[,](?<emilli>[\d]+)/gi;rl.on('line', function (line) {var elements=re.exec(line);if (elements!=null) {var ssecond = parseInt( elements.groups.ssecond);if (ssecond!=59)ssecond=String(ssecond+1).padStart(2,'0');var esecond = parseInt(elements.groups.esecond);if (esecond!=59)esecond=String(esecond+1).padStart(2,'0');//console.log(`${line} => ${elements.groups.shour}-${elements.groups.sminute}-${ssecond}-${elements.groups.smilli}, ${elements.groups.ehour}-${elements.groups.eminute}-${esecond}-${elements.groups.emilli}`);console.log(`${elements.groups.shour}:${elements.groups.sminute}:${ssecond},${elements.groups.smilli} --> ${elements.groups.ehour}:${elements.groups.eminute}:${esecond},${elements.groups.emilli}`);} elseconsole.log(line);});}main();
$ time node srt_update.js input.srt > output.srt
real 0m1.321s
user 0m0.701s
sys 0m0.062s
An alternative version by not using regular expression:
Running result:
$ time node srt_update2.js input.srt > output.srt
real 0m1.304s
user 0m0.701s
sys 0m0.049s
The performance of the two versions seem to be very similar.