bitmovin-player-ui
Version:
Bitmovin Player UI Framework
118 lines (117 loc) • 5.22 kB
JavaScript
"use strict";
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SubtitleSwitchHandler = void 0;
var i18n_1 = require("../localization/i18n");
/**
* Helper class to handle all subtitle related events
*
* This class listens to player events as well as the `ListSelector` event if selection changed
*
* @category Utils
*/
var SubtitleSwitchHandler = /** @class */ (function () {
function SubtitleSwitchHandler(player, element, uimanager) {
var _this = this;
this.onSubtitleEnabled = function (event) {
var _a;
_this.selectCurrentSubtitle();
// Update UI language to match subtitle language
if (i18n_1.i18n.getConfig().adaptLocalizationToSubtitleLanguage) {
var lang = typeof ((_a = event.subtitle) === null || _a === void 0 ? void 0 : _a.lang) === 'string' ? event.subtitle.lang.trim() : '';
if (lang) {
i18n_1.i18n.setLanguage(lang);
}
}
};
this.addSubtitle = function (event) {
var subtitle = event.subtitle;
if (!_this.listElement.hasItem(subtitle.id)) {
_this.listElement.addItem(subtitle.id, subtitle.label);
}
};
this.removeSubtitle = function (event) {
var subtitle = event.subtitle;
if (_this.listElement.hasItem(subtitle.id)) {
_this.listElement.removeItem(subtitle.id);
}
_this.selectCurrentSubtitle();
};
this.selectCurrentSubtitle = function () {
if (!_this.player.subtitles) {
// Subtitles API not available (yet)
return;
}
var currentSubtitle = _this.player.subtitles
.list()
.filter(function (subtitle) { return subtitle.enabled; })
.pop();
_this.listElement.selectItem(currentSubtitle ? currentSubtitle.id : SubtitleSwitchHandler.SUBTITLES_OFF_KEY);
};
this.clearSubtitles = function () {
_this.listElement.clearItems();
};
this.refreshSubtitles = function () {
if (!_this.player.subtitles) {
// Subtitles API not available (yet)
return;
}
var offListItem = {
key: SubtitleSwitchHandler.SUBTITLES_OFF_KEY,
label: i18n_1.i18n.getLocalizer('off'),
};
var subtitles = _this.player.subtitles.list();
var subtitleToListItem = function (subtitle) {
return { key: subtitle.id, label: subtitle.label };
};
_this.listElement.synchronizeItems(__spreadArray([offListItem], subtitles.map(subtitleToListItem), true));
_this.selectCurrentSubtitle();
};
this.player = player;
this.listElement = element;
this.uimanager = uimanager;
this.bindSelectionEvent();
this.bindPlayerEvents();
this.refreshSubtitles();
}
SubtitleSwitchHandler.prototype.bindSelectionEvent = function () {
var _this = this;
this.listElement.onItemSelectionChanged.subscribe(function (_, value) {
// TODO add support for multiple concurrent subtitle selections
if (value === SubtitleSwitchHandler.SUBTITLES_OFF_KEY) {
var currentSubtitle = _this.player.subtitles
.list()
.filter(function (subtitle) { return subtitle.enabled; })
.pop();
if (currentSubtitle) {
_this.player.subtitles.disable(currentSubtitle.id);
}
}
else {
_this.player.subtitles.enable(value, true);
}
});
};
SubtitleSwitchHandler.prototype.bindPlayerEvents = function () {
this.player.on(this.player.exports.PlayerEvent.SubtitleAdded, this.addSubtitle);
this.player.on(this.player.exports.PlayerEvent.SubtitleEnabled, this.onSubtitleEnabled);
this.player.on(this.player.exports.PlayerEvent.SubtitleDisabled, this.selectCurrentSubtitle);
this.player.on(this.player.exports.PlayerEvent.SubtitleRemoved, this.removeSubtitle);
// Update subtitles when source goes away
this.player.on(this.player.exports.PlayerEvent.SourceUnloaded, this.clearSubtitles);
// Update subtitles when the period within a source changes
this.player.on(this.player.exports.PlayerEvent.PeriodSwitched, this.refreshSubtitles);
this.uimanager.getConfig().events.onUpdated.subscribe(this.refreshSubtitles);
};
SubtitleSwitchHandler.SUBTITLES_OFF_KEY = 'null';
return SubtitleSwitchHandler;
}());
exports.SubtitleSwitchHandler = SubtitleSwitchHandler;