UNPKG

7.32 kBJavaScriptView Raw
1/*! @name videojs-max-quality-selector @version 0.9.1 @license MIT */
2!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("video.js")):"function"==typeof define&&define.amd?define(["video.js"],t):(e=e||self).videojsMaxQualitySelector=t(e.videojs)}(this,function(e){"use strict";function t(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function i(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}var n=(e=e&&e.hasOwnProperty("default")?e.default:e).getComponent("MenuButton"),s=e.getComponent("MenuItem"),a=e.getComponent("Menu"),r=e.dom,o={parent:null},u=function(i){function n(t,n){var s;return(s=i.call(this,t,n)||this).options=e.mergeOptions(o,n),s.parent=s.options.parent,s.items=[],s.addClass("vjs-max-quality-selector-button"),s}t(n,i);var u=n.prototype;return u.handleMenuItemClick=function(e){var t=parseInt(e.currentTarget.dataset.id,10);this.parent.changeLevel(t)},u.handleSubmenuKeyPress=function(e){if(void 0!==e.currentTarget.dataset.id){var t=parseInt(e.currentTarget.dataset.id,10);this.parent.changeLevel(t)}},u.createButton=function(e,t,i,n){var a=r.createEl("li",{className:t,innerHTML:i,tabIndex:-1},{"data-id":n}),o=new s(this.player_,{el:a});o.on("click",this.handleMenuItemClick.bind(this)),e.addItem(o)},u.createMenu=function(){var e=new a(this.player_,{menuButton:this}),t=[],i=[];if(this.items){this.parent.autoMode||this.parent.options.disableAuto||this.createButton(e,"vjs-menu-item",this.parent.options.autoLabel,-1);for(var n=0;n<this.items.length;n++){var s=this.items[n];if((!this.parent.options.filterDuplicates||!t.includes(s.uniqueId))&&(t.push(s.uniqueId),!this.parent.options.filterDuplicateHeights||!i.includes(s.height))){i.push(s.height);var r="vjs-menu-item";r+=s.isCurrent?" vjs-selected":"",this.createButton(e,r,this.parent.getQualityDisplayString(s),s.id)}}if(!this.parent.options.showSingleItemMenu&&1===e.children_.length)return new a(this.player_,{menuButton:this})}return e},n}(n);e.registerComponent("MaxQualityButton",u);var l=e.getPlugin("plugin"),h={index:-1,autoLabel:"Auto",defaultQuality:0,displayMode:0,minHeight:0,maxHeight:0,labels:[],disableAuto:!1,filterDuplicates:!0,filterDuplicateHeights:!0,showSingleItemMenu:!1,showBitrates:!1,sortEnabled:!0,sort:0},d=function(n){function s(t,s){var a;if((a=n.call(this,t)||this).defaults=h,a.options=e.mergeOptions(h,s),a.log=e.log.createLogger("MaxQualitySelector"),a.autoMode=!0,a.qualityLevels=[],a.player.on("loadstart",a.handleMediaChange.bind(i(a))),void 0!==a.player.qualityLevels){a.qlInternal=a.player.qualityLevels(),a.qlInternal.on("addqualitylevel",a.handleQualityLevel.bind(i(a))),a.qlInternal.on("change",a.handleChange.bind(i(a)));var r=a.options.index<0?t.controlBar.children().length+a.options.index:a.options.index;a.button=t.controlBar.addChild("MaxQualityButton",{parent:i(a)},r)}return a.player.ready(function(){a.player.addClass("vjs-max-quality-selector")}),a}t(s,n);var a=s.prototype;return a.update=function(){var e=this,t=[];this.qualityLevels.forEach(function(i,n){i.isCurrent=!1,e.qlInternal.levels_[i.id].enabled&&t.push(i.id)}),this.autoMode=t.length===this.qualityLevels.length;var i=this.qualityLevels.find(function(t){return t.id===e.selectedIndex});if(void 0!==i){this.autoMode&&this.options.disableAuto&&(this.autoMode=!1,this.changeLevel(i.id)),i.isCurrent=!0,this.options.filterDuplicates&&this.qualityLevels.forEach(function(e,t){e.uniqueId===i.uniqueId&&(e.isCurrent=!0)}),this.options.filterDuplicateHeights&&this.qualityLevels.forEach(function(e,t){e.height===i.height&&(e.isCurrent=!0)}),this.button.$(".vjs-icon-placeholder").innerHTML=this.getQualityDisplayString(i),this.button.show();var n=this.qualityLevels;n=this.options.sortEnabled?0===this.options.sort?this.qualityLevels.sort(function(e,t){return t.uniqueId-e.uniqueId}):this.qualityLevels.sort(function(e,t){return e.uniqueId-t.uniqueId}):this.qualityLevels.sort(function(e,t){return e.id-t.id}),this.button.items=n,this.button.update()}else this.button.hide()},a.changeLevel=function(e){var t=this;if(e<0)return this.qlInternal.levels_.forEach(function(e,i){0!==t.options.minHeight&&e.height>=t.options.minHeight||0!==t.options.maxHeight&&(e.height,t.options.maxHeight),e.enabled=!0}),void this.update();var i=this.qualityLevels.find(function(t){return t.id===e});this.qlInternal.levels_.forEach(function(n,s){var a=t.qualityLevels.find(function(e){return e.id===s});void 0!==a&&(n.enabled=s===e||t.options.filterDuplicates&&a.uniqueId===i.uniqueId||t.options.filterDuplicateHeights&&a.height===i.height)}),this.autoMode&&this.update()},a.handleMediaChange=function(e){this.log.debug("Handling media change:",this.player.src(),this.player.currentType()),this.qualityLevels=[],this.update(),0!==this.options.defaultQuality&&(this.firstRun=!0)},a.handleChange=function(e){if(this.log.debug("Handling quality change: "+e.selectedIndex),this.firstRun&&0!==this.options.defaultQuality)if(this.firstRun=!1,1===this.options.defaultQuality){var t=this.qualityLevels.reduce(function(e,t){return t.uniqueId<e.uniqueId?t:e});this.selectedIndex=t.id,this.changeLevel(t.id),this.update()}else{var i=this.qualityLevels.reduce(function(e,t){return t.uniqueId>e.uniqueId?t:e});this.selectedIndex=i.id,this.changeLevel(i.id),this.update()}else this.selectedIndex=e.selectedIndex,this.update()},a.handleQualityLevel=function(e){var t=e.qualityLevel;if(void 0!==t.width&&void 0!==t.height&&void 0!==t.bitrate)if(0!==this.options.minHeight&&t.height<this.options.minHeight||0!==this.options.maxHeight&&t.height>this.options.maxHeight)t.enabled=!1;else{var i=t.width+t.height+t.bitrate,n={id:this.qlInternal.levels_.indexOf(t),uniqueId:i,width:t.width,height:t.height,dimension:t.width+"x"+t.height,dimensionEnglishName:this.getDimensionEnglishName(t.width,t.height),dimensionMarketingName:this.getDimensionMarketingName(t.width,t.height),bitrate:t.bitrate,bitrateName:this.getReadableBitrateString(t.bitrate),isCurrent:!1};this.qualityLevels.push(n)}},a.getLevelNames=function(){var e=this,t=[];return this.qualityLevels.forEach(function(i){t.push(e.getQualityDisplayString(i))}),t},a.getLevelName=function(e,t){var i=this.options.labels;return void 0!==i[e]?i[e].toString():t},a.getDimensionEnglishName=function(e,t){switch(t){case 108:case 180:case 144:case 234:case 240:case 252:return"VLQ";case 360:return"LQ";case 480:case 486:case 540:return"SD";case 720:return"HD";case 1080:return"FHD";case 1440:return"QHD";case 2160:case 2304:return"UHD"}return"N/A"},a.getDimensionMarketingName=function(e,t){switch(t){case 2160:return"4k";case 2304:return"True 4k"}return t+"p"},a.getReadableBitrateString=function(e){var t=-1;do{e/=1024,t++}while(e>1024);return Math.max(e,.1).toFixed(1)+[" Kbps"," Mbps"," Gbps"][t]},a.getQualityDisplayString=function(e){if(!e)return"";var t="";return t=1===this.options.displayMode?e.dimensionMarketingName:2===this.options.displayMode?e.dimensionEnglishName:e.dimensionMarketingName+"<sup>"+e.dimensionEnglishName+"</sup>",this.autoMode&&e.isCurrent&&(t=this.options.autoLabel+"("+t+")"),this.options.showBitrates&&(t+=" ("+e.bitrateName+")"),this.getLevelName(e.id,t)},s}(l);return d.defaultState={},d.VERSION="0.9.1",e.registerPlugin("maxQualitySelector",d),d});