diff --git a/src/withHTMLSubtitles/subtitlesConverter.js b/src/withHTMLSubtitles/subtitlesConverter.js new file mode 100644 index 0000000..c854131 --- /dev/null +++ b/src/withHTMLSubtitles/subtitlesConverter.js @@ -0,0 +1,67 @@ +// from: https://github.com/silviapfeiffer/silviapfeiffer.github.io/blob/master/index.html#L150-L216 + +function srt2webvtt(data) { + // remove dos newlines + var srt = data.replace(/\r+/g, ''); + // trim white space start and end + srt = srt.replace(/^\s+|\s+$/g, ''); + // get cues + var cuelist = srt.split('\n\n'); + var result = ''; + if (cuelist.length > 0) { + result += 'WEBVTT\n\n'; + for (var i = 0; i < cuelist.length; i=i+1) { + result += convertSrtCue(cuelist[i]); + } + } + return result; +} + +function convertSrtCue(caption) { + // remove all html tags for security reasons + caption = caption.replace(/<[a-zA-Z/][^>]*>/g, ''); + + var cue = ''; + var s = caption.split(/\n/); + // concatenate muilt-line string separated in array into one + while (s.length > 3) { + for (var i = 3; i < s.length; i++) { + s[2] += '\n' + s[i]; + } + s.splice(3, s.length - 3); + } + var line = 0; + // detect identifier + if (!s[0].match(/\d+:\d+:\d+/) && s[1].match(/\d+:\d+:\d+/)) { + cue += s[0].match(/\w+/) + '\n'; + line += 1; + } + // get time strings + if (s[line].match(/\d+:\d+:\d+/)) { + // convert time string + var m = s[1].match(/(\d+):(\d+):(\d+)(?:,(\d+))?\s*--?>\s*(\d+):(\d+):(\d+)(?:,(\d+))?/); + if (m) { + cue += m[1]+':'+m[2]+':'+m[3]+'.'+m[4]+' --> ' + +m[5]+':'+m[6]+':'+m[7]+'.'+m[8]+'\n'; + line += 1; + } else { + // Unrecognized timestring + return ''; + } + } else { + // file format error or comment lines + return ''; + } + // get cue text + if (s[line]) { + cue += s[line] + '\n\n'; + } + return cue; +} + +module.exports = { + convert: function(text) { + // presume all to be SRT if not WEBVTT + return text.includes('WEBVTT') ? text : srt2webvtt(text); + } +}; diff --git a/src/withHTMLSubtitles/withHTMLSubtitles.js b/src/withHTMLSubtitles/withHTMLSubtitles.js index ec928fb..7d5a81e 100644 --- a/src/withHTMLSubtitles/withHTMLSubtitles.js +++ b/src/withHTMLSubtitles/withHTMLSubtitles.js @@ -4,6 +4,7 @@ var deepFreeze = require('deep-freeze'); var ERROR = require('../error'); var subtitlesParser = require('./subtitlesParser'); var subtitlesRenderer = require('./subtitlesRenderer'); +var subtitlesConverter = require('./subtitlesConverter'); function withHTMLSubtitles(Video) { function VideoWithHTMLSubtitles(options) { @@ -214,6 +215,9 @@ function withHTMLSubtitles(Video) { .then(function(resp) { return resp.text(); }) + .then(function(text) { + return subtitlesConverter.convert(text); + }) .then(function(text) { return subtitlesParser.parse(text); })