mirror of
https://github.com/shaka-project/shaka-player.git
synced 2026-06-14 15:56:38 +03:00
f1768a5f84
We don't need this anymore with `exemptEmptyConstructors` config added in #8901
135 lines
2.7 KiB
JavaScript
135 lines
2.7 KiB
JavaScript
/*! @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());
|