File: src\player\subtitle.js
import Logger from "../service/logger";
class Subtitle {
/**
* This class is for Subtitle operations. It works with Player
*
* @class Subtitle
* @constructor
*/
constructor(srt, Player, target) {
this.Player = Player;
this.srt = srt;
this.target = document.querySelector(target);
Logger.addLog('Player - Subtitle', 'create', `Subtitle initialization started`, this);
this.setSRT(srt);
this.Player.Events.addListener('player_onTimeUpdate', () => this.tick());
this.Player.Events.addListener('player_onEnded', () => this.target.innerText = '');
}
/**
* Set SRT subtitles
*
* example: https://www.npmjs.com/package/subtitles-parser
* example: https://raw.githubusercontent.com/bazh/subtitles-parser/master/index.js
* license: MIT
*
* @param {String} subtitles
*/
setSRT(srt) {
/**
* Time to miliseconds
*
* @param {String} time value
* @return {Number} miliseconds
*/
const timeMs = function (val) {
const regex = /(\d+):(\d{2}):(\d{2}),(\d{3})/;
let parts = regex.exec(val);
if (parts === null) {
return 0;
}
for (let i = 1; i < 5; i++) {
parts[i] = parseInt(parts[i], 10);
if (isNaN(parts[i])) parts[i] = 0;
}
// hours + minutes + seconds + ms
return parts[1] * 3600000 + parts[2] * 60000 + parts[3] * 1000 + parts[4];
};
/**
* From Srt parser
*
* @param {String} data srt data
* @param {Boolean} ms true = use miliseconds
* @return {Object} items [{{String} id,
* {String} startTime,
* {String} endTime,
* {String} text }]
*
*/
const fromSrt = function (data, ms) {
let useMs = ms ? true : false;
data = data.replace(/\r/g, '');
const regex = /(\d+)\n(\d{2}:\d{2}:\d{2},\d{3}) --> (\d{2}:\d{2}:\d{2},\d{3})/g;
data = data.split(regex);
data.shift();
let items = [];
for (let i = 0; i < data.length; i += 4) {
items.push({
id: data[i].trim(), // {String}
startTime: useMs ? timeMs(data[i + 1].trim()) : data[i + 1].trim(), // {String}
endTime: useMs ? timeMs(data[i + 2].trim()) : data[i + 2].trim(), // {String}
text: data[i + 3].trim() // {String}
});
}
return items;
};
// RUN
// this.subs = {};
if (srt) {
// var items = fromSrt(srt, true);
this.subs = fromSrt(srt, true);
this.setCurrentSubtitle();
}
}
setCurrentSubtitle() {
for (let i = 0; i < this.subs.length; i++) {
// this.subs[items[i].startTime] = items[i];
if (this.subs[i].startTime > Math.trunc(this.Player.videoElement.currentTime)) {
this.currentSubIndex = i;
this.currentSub = this.subs[i];
break;
}
}
}
/**
* Internal player timer
* @private
*/
tick() {
if (this.Player.playerInfo.subtitleEnabled && this.Player.playerInfo.currentState === "Playing") {
if(typeof this.currentSub !== 'undefined') {
if(Math.trunc(this.Player.videoElement.currentTime * 1000) > this.currentSub.startTime && Math.trunc(this.Player.videoElement.currentTime * 1000) < this.currentSub.endTime) {
Logger.addLog('Subtitle TEXT', 'info', this.currentSub.text);
this.target.innerText = this.currentSub.text;
} else if (Math.trunc(this.Player.videoElement.currentTime * 1000) > this.currentSub.endTime) {
this.currentSubIndex += 1;
this.currentSub = this.subs[this.currentSubIndex];
this.target.innerText = '';
Logger.addLog('Subtitle TEXT', 'info', 'EMPTY SUB')
}
}
}
}
}
export default Subtitle;