UNPKG

bitmovin-player-ui

Version:
85 lines (68 loc) 2.77 kB
import { SelectBox } from './SelectBox'; import { ListSelectorConfig } from '../lists/ListSelector'; import { UIInstanceManager } from '../../UIManager'; import { PlayerAPI } from 'bitmovin-player'; import { i18n } from '../../localization/i18n'; /** * A select box providing a selection between 'auto' and the available video qualities. * * @category Components */ export class VideoQualitySelectBox extends SelectBox { private hasAuto: boolean; constructor(config: ListSelectorConfig = {}) { super(config); this.config = this.mergeConfig( config, { cssClasses: ['ui-videoqualityselectbox'], }, this.config, ); } configure(player: PlayerAPI, uimanager: UIInstanceManager): void { super.configure(player, uimanager); const selectCurrentVideoQuality = () => { this.selectItem(player.getVideoQuality().id); }; const updateVideoQualities = () => { const videoQualities = player.getAvailableVideoQualities(); this.clearItems(); // Progressive streams do not support automatic quality selection this.hasAuto = player.getStreamType() !== 'progressive'; if (this.hasAuto) { // Add entry for automatic quality switching (default setting) this.addItem('auto', i18n.getLocalizer('auto')); } // Add video qualities for (const videoQuality of videoQualities) { this.addItem(videoQuality.id, videoQuality.label); } // Select initial quality selectCurrentVideoQuality(); }; this.onItemSelectionChanged.subscribe((sender: VideoQualitySelectBox, value: string) => { player.setVideoQuality(value); }); // Update qualities when source goes away player.on(player.exports.PlayerEvent.SourceUnloaded, updateVideoQualities); // Update qualities when the period within a source changes player.on(player.exports.PlayerEvent.PeriodSwitched, updateVideoQualities); // Update quality selection when quality is changed (from outside) player.on(player.exports.PlayerEvent.VideoQualityChanged, selectCurrentVideoQuality); if ((player.exports.PlayerEvent as any).VideoQualityAdded) { // Update qualities when their availability changed // TODO: remove any cast after next player release player.on((player.exports.PlayerEvent as any).VideoQualityAdded, updateVideoQualities); player.on((player.exports.PlayerEvent as any).VideoQualityRemoved, updateVideoQualities); } uimanager.getConfig().events.onUpdated.subscribe(updateVideoQualities); } /** * Returns true if the select box contains an 'auto' item for automatic quality selection mode. * @return {boolean} */ hasAutoItem(): boolean { return this.hasAuto; } }