diff --git a/manifest-chromium.json b/manifest-chromium.json index f8a1117..f9c55d6 100644 --- a/manifest-chromium.json +++ b/manifest-chromium.json @@ -17,5 +17,5 @@ "activeTab", "" ], - "version": "1.0.0" + "version": "1.0.1" } diff --git a/manifest-firefox.json b/manifest-firefox.json index 45d6db6..17ddf7b 100644 --- a/manifest-firefox.json +++ b/manifest-firefox.json @@ -23,5 +23,5 @@ "activeTab", "" ], - "version": "1.0.0" + "version": "1.0.1" } diff --git a/src/assign-captions.js b/src/assign-captions.js index d68c875..5db5865 100644 --- a/src/assign-captions.js +++ b/src/assign-captions.js @@ -104,20 +104,26 @@ video.pause(); }; + // https://en.wikipedia.org/wiki/WebVTT#Main_differences_from_SubRip + const srtParse = function(raw) { const vtt = [ 'WEBVTT', '' ]; const entries = raw.replace(/(\r\n|\n\r)/g, '\n') .trim() .split(/\s*\n\n+\s*/); for ( const entry of entries ) { + let i = 0; const lines = entry.split(/\s*\n\s*/); - if ( /^\d+$/.test(lines[0]) === false ) { continue; } - const times = /(\S+)\s+--+>\s+(\S+)/.exec(lines[1]); + // "The frame numbering/identification preceding the + // "timecode is optional" + if ( /^\d+$/.test(lines[i+0]) ) { + i += 1; + } + const times = /^(\S+)\s+--+>\s+(\S+)/.exec(lines[i+0]); if ( times === null ) { continue; } vtt.push( - lines[0], times[1].replace(/,/g, '.') + ' --> ' + times[2].replace(/,/g, '.'), - lines.slice(2).join('\n'), + lines.slice(i+1).join('\n'), '' ); } @@ -136,7 +142,7 @@ track.setAttribute('label', 'CCaptioner'); track.setAttribute('srclang', 'zz'); track.setAttribute('src', blobURL); - track.setAttribute('data-vtt-delta', '0'); + track.setAttribute('data-vtt-offset', '0'); track.setAttribute('data-vtt', vtt); video.appendChild(track); track.track.mode = 'showing'; diff --git a/src/offset-captions.js b/src/offset-captions.js index 304f0e8..8517d8b 100644 --- a/src/offset-captions.js +++ b/src/offset-captions.js @@ -53,12 +53,12 @@ for ( let i = 0; i < entries.length; i++ ) { const lines = entries[i].split(/\n/); - const times = /(\S+) --> (\S+)/.exec(lines[1]); + const times = /(\S+) --> (\S+)/.exec(lines[0]); if ( times === null ) { continue; } const t0 = timeShift(times[1]); if ( t0 === '' ) { return; } const t1 = timeShift(times[2]); - lines[1] = `${t0} --> ${t1}`; + lines[0] = `${t0} --> ${t1}`; entries[i] = lines.join('\n'); } vtt = entries.join('\n\n'); @@ -66,6 +66,7 @@ const blob = new Blob([ vtt ], { type: 'text/vtt' }); const blobURL = URL.createObjectURL(blob); const newTrack = oldTrack.cloneNode(false); + newTrack.setAttribute('data-vtt-offset', timeDelta); newTrack.setAttribute('src', blobURL); oldTrack.replaceWith(newTrack); newTrack.track.mode = 'showing';