videojs-contrib-quality-levels.cjs.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. /*! @name videojs-contrib-quality-levels @version 3.0.0 @license Apache-2.0 */
  2. 'use strict';
  3. var videojs = require('video.js');
  4. function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
  5. var videojs__default = /*#__PURE__*/_interopDefaultLegacy(videojs);
  6. /**
  7. * A single QualityLevel.
  8. *
  9. * interface QualityLevel {
  10. * readonly attribute DOMString id;
  11. * attribute DOMString label;
  12. * readonly attribute long width;
  13. * readonly attribute long height;
  14. * readonly attribute long bitrate;
  15. * attribute boolean enabled;
  16. * };
  17. *
  18. * @class QualityLevel
  19. */
  20. class QualityLevel {
  21. /**
  22. * Creates a QualityLevel
  23. *
  24. * @param {Representation|Object} representation The representation of the quality level
  25. * @param {string} representation.id Unique id of the QualityLevel
  26. * @param {number=} representation.width Resolution width of the QualityLevel
  27. * @param {number=} representation.height Resolution height of the QualityLevel
  28. * @param {number} representation.bandwidth Bitrate of the QualityLevel
  29. * @param {number=} representation.frameRate Frame-rate of the QualityLevel
  30. * @param {Function} representation.enabled Callback to enable/disable QualityLevel
  31. */
  32. constructor(representation) {
  33. let level = this; // eslint-disable-line
  34. level.id = representation.id;
  35. level.label = level.id;
  36. level.width = representation.width;
  37. level.height = representation.height;
  38. level.bitrate = representation.bandwidth;
  39. level.frameRate = representation.frameRate;
  40. level.enabled_ = representation.enabled;
  41. Object.defineProperty(level, 'enabled', {
  42. /**
  43. * Get whether the QualityLevel is enabled.
  44. *
  45. * @return {boolean} True if the QualityLevel is enabled.
  46. */
  47. get() {
  48. return level.enabled_();
  49. },
  50. /**
  51. * Enable or disable the QualityLevel.
  52. *
  53. * @param {boolean} enable true to enable QualityLevel, false to disable.
  54. */
  55. set(enable) {
  56. level.enabled_(enable);
  57. }
  58. });
  59. return level;
  60. }
  61. }
  62. /**
  63. * A list of QualityLevels.
  64. *
  65. * interface QualityLevelList : EventTarget {
  66. * getter QualityLevel (unsigned long index);
  67. * readonly attribute unsigned long length;
  68. * readonly attribute long selectedIndex;
  69. *
  70. * void addQualityLevel(QualityLevel qualityLevel)
  71. * void removeQualityLevel(QualityLevel remove)
  72. * QualityLevel? getQualityLevelById(DOMString id);
  73. *
  74. * attribute EventHandler onchange;
  75. * attribute EventHandler onaddqualitylevel;
  76. * attribute EventHandler onremovequalitylevel;
  77. * };
  78. *
  79. * @extends videojs.EventTarget
  80. * @class QualityLevelList
  81. */
  82. class QualityLevelList extends videojs__default['default'].EventTarget {
  83. constructor() {
  84. super();
  85. let list = this; // eslint-disable-line
  86. list.levels_ = [];
  87. list.selectedIndex_ = -1;
  88. /**
  89. * Get the index of the currently selected QualityLevel.
  90. *
  91. * @returns {number} The index of the selected QualityLevel. -1 if none selected.
  92. * @readonly
  93. */
  94. Object.defineProperty(list, 'selectedIndex', {
  95. get() {
  96. return list.selectedIndex_;
  97. }
  98. });
  99. /**
  100. * Get the length of the list of QualityLevels.
  101. *
  102. * @returns {number} The length of the list.
  103. * @readonly
  104. */
  105. Object.defineProperty(list, 'length', {
  106. get() {
  107. return list.levels_.length;
  108. }
  109. });
  110. return list;
  111. }
  112. /**
  113. * Adds a quality level to the list.
  114. *
  115. * @param {Representation|Object} representation The representation of the quality level
  116. * @param {string} representation.id Unique id of the QualityLevel
  117. * @param {number=} representation.width Resolution width of the QualityLevel
  118. * @param {number=} representation.height Resolution height of the QualityLevel
  119. * @param {number} representation.bandwidth Bitrate of the QualityLevel
  120. * @param {number=} representation.frameRate Frame-rate of the QualityLevel
  121. * @param {Function} representation.enabled Callback to enable/disable QualityLevel
  122. * @return {QualityLevel} the QualityLevel added to the list
  123. * @method addQualityLevel
  124. */
  125. addQualityLevel(representation) {
  126. let qualityLevel = this.getQualityLevelById(representation.id); // Do not add duplicate quality levels
  127. if (qualityLevel) {
  128. return qualityLevel;
  129. }
  130. const index = this.levels_.length;
  131. qualityLevel = new QualityLevel(representation);
  132. if (!('' + index in this)) {
  133. Object.defineProperty(this, index, {
  134. get() {
  135. return this.levels_[index];
  136. }
  137. });
  138. }
  139. this.levels_.push(qualityLevel);
  140. this.trigger({
  141. qualityLevel,
  142. type: 'addqualitylevel'
  143. });
  144. return qualityLevel;
  145. }
  146. /**
  147. * Removes a quality level from the list.
  148. *
  149. * @param {QualityLevel} remove QualityLevel to remove to the list.
  150. * @return {QualityLevel|null} the QualityLevel removed or null if nothing removed
  151. * @method removeQualityLevel
  152. */
  153. removeQualityLevel(qualityLevel) {
  154. let removed = null;
  155. for (let i = 0, l = this.length; i < l; i++) {
  156. if (this[i] === qualityLevel) {
  157. removed = this.levels_.splice(i, 1)[0];
  158. if (this.selectedIndex_ === i) {
  159. this.selectedIndex_ = -1;
  160. } else if (this.selectedIndex_ > i) {
  161. this.selectedIndex_--;
  162. }
  163. break;
  164. }
  165. }
  166. if (removed) {
  167. this.trigger({
  168. qualityLevel,
  169. type: 'removequalitylevel'
  170. });
  171. }
  172. return removed;
  173. }
  174. /**
  175. * Searches for a QualityLevel with the given id.
  176. *
  177. * @param {string} id The id of the QualityLevel to find.
  178. * @return {QualityLevel|null} The QualityLevel with id, or null if not found.
  179. * @method getQualityLevelById
  180. */
  181. getQualityLevelById(id) {
  182. for (let i = 0, l = this.length; i < l; i++) {
  183. const level = this[i];
  184. if (level.id === id) {
  185. return level;
  186. }
  187. }
  188. return null;
  189. }
  190. /**
  191. * Resets the list of QualityLevels to empty
  192. *
  193. * @method dispose
  194. */
  195. dispose() {
  196. this.selectedIndex_ = -1;
  197. this.levels_.length = 0;
  198. }
  199. }
  200. /**
  201. * change - The selected QualityLevel has changed.
  202. * addqualitylevel - A QualityLevel has been added to the QualityLevelList.
  203. * removequalitylevel - A QualityLevel has been removed from the QualityLevelList.
  204. */
  205. QualityLevelList.prototype.allowedEvents_ = {
  206. change: 'change',
  207. addqualitylevel: 'addqualitylevel',
  208. removequalitylevel: 'removequalitylevel'
  209. }; // emulate attribute EventHandler support to allow for feature detection
  210. for (const event in QualityLevelList.prototype.allowedEvents_) {
  211. QualityLevelList.prototype['on' + event] = null;
  212. }
  213. var version = "3.0.0";
  214. const registerPlugin = videojs__default['default'].registerPlugin || videojs__default['default'].plugin;
  215. /**
  216. * Initialization function for the qualityLevels plugin. Sets up the QualityLevelList and
  217. * event handlers.
  218. *
  219. * @param {Player} player Player object.
  220. * @param {Object} options Plugin options object.
  221. * @function initPlugin
  222. */
  223. const initPlugin = function (player, options) {
  224. const originalPluginFn = player.qualityLevels;
  225. const qualityLevelList = new QualityLevelList();
  226. const disposeHandler = function () {
  227. qualityLevelList.dispose();
  228. player.qualityLevels = originalPluginFn;
  229. player.off('dispose', disposeHandler);
  230. };
  231. player.on('dispose', disposeHandler);
  232. player.qualityLevels = () => qualityLevelList;
  233. player.qualityLevels.VERSION = version;
  234. return qualityLevelList;
  235. };
  236. /**
  237. * A video.js plugin.
  238. *
  239. * In the plugin function, the value of `this` is a video.js `Player`
  240. * instance. You cannot rely on the player being in a "ready" state here,
  241. * depending on how the plugin is invoked. This may or may not be important
  242. * to you; if not, remove the wait for "ready"!
  243. *
  244. * @param {Object} options Plugin options object
  245. * @function qualityLevels
  246. */
  247. const qualityLevels = function (options) {
  248. return initPlugin(this, videojs__default['default'].mergeOptions({}, options));
  249. }; // Register the plugin with video.js.
  250. registerPlugin('qualityLevels', qualityLevels); // Include the version number.
  251. qualityLevels.VERSION = version;
  252. module.exports = qualityLevels;