UNPKG

shaka-player

Version:
136 lines (111 loc) 2.75 kB
/*! @license * Shaka Player * Copyright 2016 Google LLC * SPDX-License-Identifier: Apache-2.0 */ goog.provide('shaka.text.SrtTextParser'); goog.require('goog.asserts'); goog.require('shaka.text.TextEngine'); goog.require('shaka.text.VttTextParser'); goog.require('shaka.util.BufferUtils'); goog.require('shaka.util.StringUtils'); /** * @implements {shaka.extern.TextParser} * @export */ shaka.text.SrtTextParser = class { /** */ constructor() { /** * @type {!shaka.extern.TextParser} * @private */ this.parser_ = new shaka.text.VttTextParser(); } /** * @override * @export */ parseInit(data) { goog.asserts.assert(false, 'SRT does not have init segments'); } /** * @override * @export */ setSequenceMode(sequenceMode) { // Unused. } /** * @override * @export */ setManifestType(manifestType) { // Unused. } /** * @override * @export */ parseMedia(data, time, uri) { const SrtTextParser = shaka.text.SrtTextParser; const BufferUtils = shaka.util.BufferUtils; const StringUtils = shaka.util.StringUtils; // Get the input as a string. const str = StringUtils.fromUTF8(data); const vvtText = SrtTextParser.srt2webvtt(str); const newData = BufferUtils.toUint8(StringUtils.toUTF8(vvtText)); return this.parser_.parseMedia(newData, time, uri, /* images= */ []); } /** * Convert a SRT format to WebVTT * * @param {string} data * @return {string} * @export */ static srt2webvtt(data) { const SrtTextParser = shaka.text.SrtTextParser; let result = 'WEBVTT\n\n'; // Supports no cues if (data == '') { return result; } // remove dos newlines let srt = data.replace(/\r+/g, ''); // trim white space start and end srt = srt.trim(); // get cues const cuelist = srt.split('\n\n'); for (const cue of cuelist) { result += SrtTextParser.convertSrtCue_(cue); } return result; } /** * Convert a SRT cue into WebVTT cue * * @param {string} caption * @return {string} * @private */ static convertSrtCue_(caption) { const lines = caption.split(/\n/); // detect and skip numeric identifier if (lines[0].match(/\d+/)) { lines.shift(); } // convert time codes lines[0] = lines[0].replace(/,/g, '.'); const webvttCue = lines.join('\n') .replace(/{b}/g, '<b>') .replace(/{\/b}/g, '</b>') .replace(/{i}/g, '<i>') .replace(/{\/i}/g, '</i>') .replace(/{u}/g, '<u>') .replace(/{\/u}/g, '</u>'); return webvttCue + '\n\n'; } }; shaka.text.TextEngine.registerParser( 'text/srt', () => new shaka.text.SrtTextParser());