374 lines
11 KiB
JavaScript
374 lines
11 KiB
JavaScript
/*! @name videojs-contrib-quality-levels @version 2.0.7 @license Apache-2.0 */
|
|
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('video.js'), require('global/document')) :
|
|
typeof define === 'function' && define.amd ? define(['video.js', 'global/document'], factory) :
|
|
(global.videojsContribQualityLevels = factory(global.videojs,global.document));
|
|
}(this, (function (videojs,document) { 'use strict';
|
|
|
|
videojs = videojs && videojs.hasOwnProperty('default') ? videojs['default'] : videojs;
|
|
document = document && document.hasOwnProperty('default') ? document['default'] : document;
|
|
|
|
var classCallCheck = function (instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
};
|
|
|
|
var inherits = function (subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
|
|
}
|
|
|
|
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
constructor: {
|
|
value: subClass,
|
|
enumerable: false,
|
|
writable: true,
|
|
configurable: true
|
|
}
|
|
});
|
|
if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
|
};
|
|
|
|
var possibleConstructorReturn = function (self, call) {
|
|
if (!self) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}
|
|
|
|
return call && (typeof call === "object" || typeof call === "function") ? call : self;
|
|
};
|
|
|
|
/**
|
|
* A single QualityLevel.
|
|
*
|
|
* interface QualityLevel {
|
|
* readonly attribute DOMString id;
|
|
* attribute DOMString label;
|
|
* readonly attribute long width;
|
|
* readonly attribute long height;
|
|
* readonly attribute long bitrate;
|
|
* attribute boolean enabled;
|
|
* };
|
|
*
|
|
* @class QualityLevel
|
|
*/
|
|
|
|
var QualityLevel =
|
|
|
|
/**
|
|
* Creates a QualityLevel
|
|
*
|
|
* @param {Representation|Object} representation The representation of the quality level
|
|
* @param {string} representation.id Unique id of the QualityLevel
|
|
* @param {number=} representation.width Resolution width of the QualityLevel
|
|
* @param {number=} representation.height Resolution height of the QualityLevel
|
|
* @param {number} representation.bandwidth Bitrate of the QualityLevel
|
|
* @param {Function} representation.enabled Callback to enable/disable QualityLevel
|
|
*/
|
|
function QualityLevel(representation) {
|
|
classCallCheck(this, QualityLevel);
|
|
|
|
|
|
var level = this; // eslint-disable-line
|
|
|
|
if (videojs.browser.IS_IE8) {
|
|
level = document.createElement('custom');
|
|
for (var prop in QualityLevel.prototype) {
|
|
if (prop !== 'constructor') {
|
|
level[prop] = QualityLevel.prototype[prop];
|
|
}
|
|
}
|
|
}
|
|
|
|
level.id = representation.id;
|
|
level.label = level.id;
|
|
level.width = representation.width;
|
|
level.height = representation.height;
|
|
level.bitrate = representation.bandwidth;
|
|
level.enabled_ = representation.enabled;
|
|
|
|
Object.defineProperty(level, 'enabled', {
|
|
/**
|
|
* Get whether the QualityLevel is enabled.
|
|
*
|
|
* @return {boolean} True if the QualityLevel is enabled.
|
|
*/
|
|
get: function get$$1() {
|
|
return level.enabled_();
|
|
},
|
|
|
|
|
|
/**
|
|
* Enable or disable the QualityLevel.
|
|
*
|
|
* @param {boolean} enable true to enable QualityLevel, false to disable.
|
|
*/
|
|
set: function set$$1(enable) {
|
|
level.enabled_(enable);
|
|
}
|
|
});
|
|
|
|
return level;
|
|
};
|
|
|
|
/**
|
|
* A list of QualityLevels.
|
|
*
|
|
* interface QualityLevelList : EventTarget {
|
|
* getter QualityLevel (unsigned long index);
|
|
* readonly attribute unsigned long length;
|
|
* readonly attribute long selectedIndex;
|
|
*
|
|
* void addQualityLevel(QualityLevel qualityLevel)
|
|
* void removeQualityLevel(QualityLevel remove)
|
|
* QualityLevel? getQualityLevelById(DOMString id);
|
|
*
|
|
* attribute EventHandler onchange;
|
|
* attribute EventHandler onaddqualitylevel;
|
|
* attribute EventHandler onremovequalitylevel;
|
|
* };
|
|
*
|
|
* @extends videojs.EventTarget
|
|
* @class QualityLevelList
|
|
*/
|
|
|
|
var QualityLevelList = function (_videojs$EventTarget) {
|
|
inherits(QualityLevelList, _videojs$EventTarget);
|
|
|
|
function QualityLevelList() {
|
|
var _ret;
|
|
|
|
classCallCheck(this, QualityLevelList);
|
|
|
|
var _this = possibleConstructorReturn(this, _videojs$EventTarget.call(this));
|
|
|
|
var list = _this; // eslint-disable-line
|
|
|
|
if (videojs.browser.IS_IE8) {
|
|
list = document.createElement('custom');
|
|
for (var prop in QualityLevelList.prototype) {
|
|
if (prop !== 'constructor') {
|
|
list[prop] = QualityLevelList.prototype[prop];
|
|
}
|
|
}
|
|
}
|
|
|
|
list.levels_ = [];
|
|
list.selectedIndex_ = -1;
|
|
|
|
/**
|
|
* Get the index of the currently selected QualityLevel.
|
|
*
|
|
* @returns {number} The index of the selected QualityLevel. -1 if none selected.
|
|
* @readonly
|
|
*/
|
|
Object.defineProperty(list, 'selectedIndex', {
|
|
get: function get$$1() {
|
|
return list.selectedIndex_;
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Get the length of the list of QualityLevels.
|
|
*
|
|
* @returns {number} The length of the list.
|
|
* @readonly
|
|
*/
|
|
Object.defineProperty(list, 'length', {
|
|
get: function get$$1() {
|
|
return list.levels_.length;
|
|
}
|
|
});
|
|
|
|
return _ret = list, possibleConstructorReturn(_this, _ret);
|
|
}
|
|
|
|
/**
|
|
* Adds a quality level to the list.
|
|
*
|
|
* @param {Representation|Object} representation The representation of the quality level
|
|
* @param {string} representation.id Unique id of the QualityLevel
|
|
* @param {number=} representation.width Resolution width of the QualityLevel
|
|
* @param {number=} representation.height Resolution height of the QualityLevel
|
|
* @param {number} representation.bandwidth Bitrate of the QualityLevel
|
|
* @param {Function} representation.enabled Callback to enable/disable QualityLevel
|
|
* @return {QualityLevel} the QualityLevel added to the list
|
|
* @method addQualityLevel
|
|
*/
|
|
|
|
|
|
QualityLevelList.prototype.addQualityLevel = function addQualityLevel(representation) {
|
|
var qualityLevel = this.getQualityLevelById(representation.id);
|
|
|
|
// Do not add duplicate quality levels
|
|
if (qualityLevel) {
|
|
return qualityLevel;
|
|
}
|
|
|
|
var index = this.levels_.length;
|
|
|
|
qualityLevel = new QualityLevel(representation);
|
|
|
|
if (!('' + index in this)) {
|
|
Object.defineProperty(this, index, {
|
|
get: function get$$1() {
|
|
return this.levels_[index];
|
|
}
|
|
});
|
|
}
|
|
|
|
this.levels_.push(qualityLevel);
|
|
|
|
this.trigger({
|
|
qualityLevel: qualityLevel,
|
|
type: 'addqualitylevel'
|
|
});
|
|
|
|
return qualityLevel;
|
|
};
|
|
|
|
/**
|
|
* Removes a quality level from the list.
|
|
*
|
|
* @param {QualityLevel} remove QualityLevel to remove to the list.
|
|
* @return {QualityLevel|null} the QualityLevel removed or null if nothing removed
|
|
* @method removeQualityLevel
|
|
*/
|
|
|
|
|
|
QualityLevelList.prototype.removeQualityLevel = function removeQualityLevel(qualityLevel) {
|
|
var removed = null;
|
|
|
|
for (var i = 0, l = this.length; i < l; i++) {
|
|
if (this[i] === qualityLevel) {
|
|
removed = this.levels_.splice(i, 1)[0];
|
|
|
|
if (this.selectedIndex_ === i) {
|
|
this.selectedIndex_ = -1;
|
|
} else if (this.selectedIndex_ > i) {
|
|
this.selectedIndex_--;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (removed) {
|
|
this.trigger({
|
|
qualityLevel: qualityLevel,
|
|
type: 'removequalitylevel'
|
|
});
|
|
}
|
|
|
|
return removed;
|
|
};
|
|
|
|
/**
|
|
* Searches for a QualityLevel with the given id.
|
|
*
|
|
* @param {string} id The id of the QualityLevel to find.
|
|
* @return {QualityLevel|null} The QualityLevel with id, or null if not found.
|
|
* @method getQualityLevelById
|
|
*/
|
|
|
|
|
|
QualityLevelList.prototype.getQualityLevelById = function getQualityLevelById(id) {
|
|
for (var i = 0, l = this.length; i < l; i++) {
|
|
var level = this[i];
|
|
|
|
if (level.id === id) {
|
|
return level;
|
|
}
|
|
}
|
|
return null;
|
|
};
|
|
|
|
/**
|
|
* Resets the list of QualityLevels to empty
|
|
*
|
|
* @method dispose
|
|
*/
|
|
|
|
|
|
QualityLevelList.prototype.dispose = function dispose() {
|
|
this.selectedIndex_ = -1;
|
|
this.levels_.length = 0;
|
|
};
|
|
|
|
return QualityLevelList;
|
|
}(videojs.EventTarget);
|
|
|
|
/**
|
|
* change - The selected QualityLevel has changed.
|
|
* addqualitylevel - A QualityLevel has been added to the QualityLevelList.
|
|
* removequalitylevel - A QualityLevel has been removed from the QualityLevelList.
|
|
*/
|
|
|
|
|
|
QualityLevelList.prototype.allowedEvents_ = {
|
|
change: 'change',
|
|
addqualitylevel: 'addqualitylevel',
|
|
removequalitylevel: 'removequalitylevel'
|
|
};
|
|
|
|
// emulate attribute EventHandler support to allow for feature detection
|
|
for (var event in QualityLevelList.prototype.allowedEvents_) {
|
|
QualityLevelList.prototype['on' + event] = null;
|
|
}
|
|
|
|
// vjs 5/6 support
|
|
var registerPlugin = videojs.registerPlugin || videojs.plugin;
|
|
|
|
/**
|
|
* Initialization function for the qualityLevels plugin. Sets up the QualityLevelList and
|
|
* event handlers.
|
|
*
|
|
* @param {Player} player Player object.
|
|
* @param {Object} options Plugin options object.
|
|
* @function initPlugin
|
|
*/
|
|
var initPlugin = function initPlugin(player, options) {
|
|
var originalPluginFn = player.qualityLevels;
|
|
|
|
var qualityLevelList = new QualityLevelList();
|
|
|
|
var disposeHandler = function disposeHandler() {
|
|
qualityLevelList.dispose();
|
|
player.qualityLevels = originalPluginFn;
|
|
player.off('dispose', disposeHandler);
|
|
};
|
|
|
|
player.on('dispose', disposeHandler);
|
|
|
|
player.qualityLevels = function () {
|
|
return qualityLevelList;
|
|
};
|
|
player.qualityLevels.VERSION = '__VERSION__';
|
|
|
|
return qualityLevelList;
|
|
};
|
|
|
|
/**
|
|
* A video.js plugin.
|
|
*
|
|
* In the plugin function, the value of `this` is a video.js `Player`
|
|
* instance. You cannot rely on the player being in a "ready" state here,
|
|
* depending on how the plugin is invoked. This may or may not be important
|
|
* to you; if not, remove the wait for "ready"!
|
|
*
|
|
* @param {Object} options Plugin options object
|
|
* @function qualityLevels
|
|
*/
|
|
var qualityLevels = function qualityLevels(options) {
|
|
return initPlugin(this, videojs.mergeOptions({}, options));
|
|
};
|
|
|
|
// Register the plugin with video.js.
|
|
registerPlugin('qualityLevels', qualityLevels);
|
|
|
|
// Include the version number.
|
|
qualityLevels.VERSION = '__VERSION__';
|
|
|
|
return qualityLevels;
|
|
|
|
})));
|