{"version":3,"sources":["jsdelivr-header.js","/npm/@xiaoyexiang/videojs-resolution-switcher-v7@1.1.9/lib/videojs-resolution-switcher-v7.js"],"names":[],"mappings":"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","file":"/npm/@xiaoyexiang/videojs-resolution-switcher-v7@1.1.9/lib/videojs-resolution-switcher-v7.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@xiaoyexiang/videojs-resolution-switcher-v7@1.1.9/lib/videojs-resolution-switcher-v7.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*! videojs-resolution-switcher - 2015-7-26\n * Copyright (c) 2016 Kasper Moskwiak\n * Modified by Pierre Kraft\n * Licensed under the Apache-2.0 license. */\n\n(function() {\n  /* jshint eqnull: true*/\n  /* global require */\n  'use strict';\n  var videojs = null;\n  if(typeof window.videojs === 'undefined' && typeof require === 'function') {\n    videojs = require('video.js');\n  } else {\n    videojs = window.videojs;\n  }\n\n  (function(window, videojs) {\n\n\n  var defaults = {},\n      videoJsResolutionSwitcher,\n      currentResolution = {}, // stores current resolution\n      menuItemsHolder = {}; // stores menuItems\n\n  function setSourcesSanitized(player, sources, label, customSourcePicker) {\n    currentResolution = {\n      label: label,\n      sources: sources\n    };\n    if(typeof customSourcePicker === 'function'){\n      return customSourcePicker(player, sources, label);\n    }\n    player.src(sources.map(function(src) {\n      return {src: src.src, type: src.type, res: src.res};\n    }));\n    return player;\n  }\n\n  /*\n   * Resolution menu item\n   */\n  var MenuItem = videojs.getComponent('MenuItem');\n  var ResolutionMenuItem = videojs.extend(MenuItem, {\n    constructor: function(player, options, onClickListener, label){\n      this.onClickListener = onClickListener;\n      this.label = label;\n      // Sets this.player_, this.options_ and initializes the component\n      MenuItem.call(this, player, options);\n      this.src = options.src;\n\n      this.on('click', this.onClick);\n      this.on('touchstart', this.onClick);\n\n      if (options.initialySelected) {\n        this.showAsLabel();\n        this.selected(true);\n\n        this.addClass('vjs-selected');\n      }\n    },\n    showAsLabel: function() {\n      // Change menu button label to the label of this item if the menu button label is provided\n      if(this.label) {\n        this.label.innerHTML = this.options_.label;\n      }\n    },\n    onClick: function(customSourcePicker){\n      this.onClickListener(this);\n      // Remember player state\n      var currentTime = this.player_.currentTime();\n      var isPaused = this.player_.paused();\n      var playbackRate = this.player_.playbackRate();\n      var posterImageSrc = this.player_.options_.poster;\n      this.showAsLabel();\n      // add .current class\n      this.addClass('vjs-selected');\n\n      // Hide bigPlayButton\n      if(!isPaused){\n        this.player_.bigPlayButton.hide();\n        if (posterImageSrc) {\n          this.player_.posterImage.setSrc('')\n        }\n      } else {\n        this.player_.bigPlayButton.show();\n      }\n      if(typeof customSourcePicker !== 'function' &&\n        typeof this.options_.customSourcePicker === 'function'){\n        customSourcePicker = this.options_.customSourcePicker;\n      }\n      // Change player source and wait for loadeddata event, then play video\n      // loadedmetadata doesn't work right now for flash.\n      // Probably because of https://github.com/videojs/video-js-swf/issues/124\n      // If player preload is 'none' and then loadeddata not fired. So, we need timeupdate event for seek handle (timeupdate doesn't work properly with flash)\n      var handleSeekEvent = 'loadeddata';\n      if(this.player_.techName_ !== 'Youtube' && this.player_.preload() === 'none' && this.player_.techName_ !== 'Flash') {\n        handleSeekEvent = 'timeupdate';\n      }\n      setSourcesSanitized(this.player_, this.src, this.options_.label, customSourcePicker).one(handleSeekEvent, function() {\n        this.player_.currentTime(currentTime);\n        // this.player_.handleTechSeeked_();\n        if(!isPaused){\n          // Start playing and hide loadingSpinner (flash issue ?)\n          this.player_.playbackRate(playbackRate);\n          this.player_.play();\n          this.player_.posterImage.setSrc(posterImageSrc)\n        }\n        this.player_.trigger('resolutionchange');\n        });\n      }\n    });\n\n\n    /*\n     * Resolution menu button\n     */\n     var MenuButton = videojs.getComponent('MenuButton');\n     var ResolutionMenuButton = videojs.extend(MenuButton, {\n       constructor: function(player, options, settings, label){\n        this.sources = options.sources;\n        this.label = label;\n        this.label.innerHTML = options.initialySelectedLabel;\n        // Sets this.player_, this.options_ and initializes the component\n        MenuButton.call(this, player, options, settings);\n        this.controlText('Quality');\n\n        if(settings.dynamicLabel){\n          this.el().appendChild(label);\n        }else{\n          var staticLabel = document.createElement('span');\n          videojs.dom.appendContent(staticLabel, options.initialySelectedLabel);\n\t\t\t\t\tvideojs.dom.addClass(staticLabel, 'vjs-resolution-button-staticlabel');\n          this.el().appendChild(staticLabel);\n        }\n       },\n       createItems: function(){\n         var menuItems = [];\n         var labels = (this.sources && this.sources.label) || {};\n         var onClickUnselectOthers = function(clickedItem) {\n          menuItems.map(function(item) {\n            item.selected(item === clickedItem);\n            item.removeClass('vjs-selected');\n          });\n         };\n\n         for (var key in labels) {\n           if (labels.hasOwnProperty(key)) {\n            menuItems.push(new ResolutionMenuItem(\n              this.player_,\n              {\n                label: key,\n                src: labels[key],\n                initialySelected: key === this.options_.initialySelectedLabel,\n                customSourcePicker: this.options_.customSourcePicker\n              },\n              onClickUnselectOthers,\n              this.label));\n             // Store menu item for API calls\n             menuItemsHolder[key] = menuItems[menuItems.length - 1];\n            }\n         }\n         return menuItems;\n       }\n     });\n\n    /**\n     * Initialize the plugin.\n     * @param {object} [options] configuration for the plugin\n     */\n    videoJsResolutionSwitcher = function(options) {\n      var settings = videojs.mergeOptions(defaults, options),\n          player = this,\n          label = document.createElement('span'),\n          groupedSrc = {};\n\n\t\t\tvideojs.dom.addClass(label, 'vjs-resolution-button-label');\n      this.el().appendChild(label);\n\t\t\t\n      /**\n       * Updates player sources or returns current source URL\n       * @param   {Array}  [src] array of sources [{src: '', type: '', label: '', res: ''}]\n       * @returns {Object|String|Array} videojs player object if used as setter or current source URL, object, or array of sources\n       */\n      player.updateSrc = function(src){\n        //Return current src if src is not given\n        if(!src){ return player.src(); }\n        // Dispose old resolution menu button before adding new sources\n        if(player.controlBar.resolutionSwitcher){\n          player.controlBar.resolutionSwitcher.dispose();\n          delete player.controlBar.resolutionSwitcher;\n        }\n        //Sort sources\n        src = src.sort(compareResolutions);\n        groupedSrc = bucketSources(src);\n        var choosen = chooseSrc(groupedSrc, src);\n        var menuButton = new ResolutionMenuButton(player, { sources: groupedSrc, initialySelectedLabel: choosen.label , initialySelectedRes: choosen.res , customSourcePicker: settings.customSourcePicker}, settings, label);\n\t\t\t\tvideojs.dom.addClass(menuButton.el(), 'vjs-resolution-button');\n        player.controlBar.resolutionSwitcher = player.controlBar.el_.insertBefore(menuButton.el_, player.controlBar.getChild('fullscreenToggle').el_);\n        player.controlBar.resolutionSwitcher.dispose = function(){\n          this.parentNode.removeChild(this);\n        };\n        return setSourcesSanitized(player, choosen.sources, choosen.label);\n      };\n\n      /**\n       * Returns current resolution or sets one when label is specified\n       * @param {String}   [label]         label name\n       * @param {Function} [customSourcePicker] custom function to choose source. Takes 3 arguments: player, sources, label. Must return player object.\n       * @returns {Object}   current resolution object {label: '', sources: []} if used as getter or player object if used as setter\n       */\n      player.currentResolution = function(label, customSourcePicker){\n        console.log('currentResolution: ', label)\n        if(label == null) { return currentResolution; }\n        console.log('currentResolution: ', menuItemsHolder[label])\n        if(menuItemsHolder[label] != null){\n          menuItemsHolder[label].onClick(customSourcePicker);\n        }\n        return player;\n      };\n\n      /**\n       * Returns grouped sources by label, resolution and type\n       * @returns {Object} grouped sources: { label: { key: [] }, res: { key: [] }, type: { key: [] } }\n       */\n      player.getGroupedSrc = function(){\n        return groupedSrc;\n      };\n\n      /**\n       * Method used for sorting list of sources\n       * @param   {Object} a - source object with res property\n       * @param   {Object} b - source object with res property\n       * @returns {Number} result of comparation\n       */\n      function compareResolutions(a, b){\n        if(!a.res || !b.res){ return 0; }\n        return (+b.res)-(+a.res);\n      }\n\n      /**\n       * Group sources by label, resolution and type\n       * @param   {Array}  src Array of sources\n       * @returns {Object} grouped sources: { label: { key: [] }, res: { key: [] }, type: { key: [] } }\n       */\n      function bucketSources(src){\n        var resolutions = {\n          label: {},\n          res: {},\n          type: {}\n        };\n        src.map(function(source) {\n          initResolutionKey(resolutions, 'label', source);\n          initResolutionKey(resolutions, 'res', source);\n          initResolutionKey(resolutions, 'type', source);\n\n          appendSourceToKey(resolutions, 'label', source);\n          appendSourceToKey(resolutions, 'res', source);\n          appendSourceToKey(resolutions, 'type', source);\n        });\n        return resolutions;\n      }\n\n      function initResolutionKey(resolutions, key, source) {\n        if(resolutions[key][source[key]] == null) {\n          resolutions[key][source[key]] = [];\n        }\n      }\n\n      function appendSourceToKey(resolutions, key, source) {\n        resolutions[key][source[key]].push(source);\n      }\n\n      /**\n       * Choose src if option.default is specified\n       * @param   {Object} groupedSrc {res: { key: [] }}\n       * @param   {Array}  src Array of sources sorted by resolution used to find high and low res\n       * @returns {Object} {res: string, sources: []}\n       */\n      function chooseSrc(groupedSrc, src){\n        var selectedRes = settings['default']; // use array access as default is a reserved keyword\n        var selectedLabel = '';\n        if (selectedRes === 'high') {\n          selectedRes = src[0].res;\n          selectedLabel = src[0].label;\n        } else if (selectedRes === 'low' || selectedRes == null || !groupedSrc.res[selectedRes]) {\n          // Select low-res if default is low or not set\n          selectedRes = src[src.length - 1].res;\n          selectedLabel = src[src.length -1].label;\n        } else if (groupedSrc.res[selectedRes]) {\n          selectedLabel = groupedSrc.res[selectedRes][0].label;\n        }\n\t\t\t\t\n        return {res: selectedRes, label: selectedLabel, sources: groupedSrc.res[selectedRes]};\n      }\n\t\t\t\n\t\t\tfunction initResolutionForYt(player){\n\t\t\t\t// Init resolution\n\t\t\t\tplayer.tech_.ytPlayer.setPlaybackQuality('default');\n\t\t\t\t\n\t\t\t\t// Capture events\n\t\t\t\tplayer.tech_.ytPlayer.addEventListener('onPlaybackQualityChange', function(){\n\t\t\t\t\tplayer.trigger('resolutionchange');\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t// We must wait for play event\n\t\t\t\tplayer.one('play', function(){\n\t\t\t\t\tvar qualities = player.tech_.ytPlayer.getAvailableQualityLevels();\n\t\t\t\t\t// Map youtube qualities names\n\t\t\t\t\tvar _yts = {\n\t\t\t\t\t\thighres: {res: 1080, label: '1080', yt: 'highres'},\n\t\t\t\t\t\thd1080: {res: 1080, label: '1080', yt: 'hd1080'}, \n\t\t\t\t\t\thd720: {res: 720, label: '720', yt: 'hd720'}, \n\t\t\t\t\t\tlarge: {res: 480, label: '480', yt: 'large'},\n\t\t\t\t\t\tmedium: {res: 360, label: '360', yt: 'medium'}, \n\t\t\t\t\t\tsmall: {res: 240, label: '240', yt: 'small'},\n\t\t\t\t\t\ttiny: {res: 144, label: '144', yt: 'tiny'},\n\t\t\t\t\t\tauto: {res: 0, label: 'auto', yt: 'default'}\n\t\t\t\t\t};\n\n\t\t\t\t\tvar _sources = [];\n\n\t\t\t\t\tqualities.map(function(q){\n\t\t\t\t\t\t_sources.push({\n\t\t\t\t\t\t\tsrc: player.src().src,\n\t\t\t\t\t\t\ttype: player.src().type,\n\t\t\t\t\t\t\tlabel: _yts[q].label,\n\t\t\t\t\t\t\tres: _yts[q].res,\n\t\t\t\t\t\t\t_yt: _yts[q].yt\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\tgroupedSrc = bucketSources(_sources);\n\n\t\t\t\t\t// Overwrite defualt sourcePicer function\n\t\t\t\t\tvar _customSourcePicker = function(_player, _sources, _label){\n\t\t\t\t\t\tplayer.tech_.ytPlayer.setPlaybackQuality(_sources[0]._yt);\n\t\t\t\t\t\treturn player;\n\t\t\t\t\t};\n\n\t\t\t\t\tvar choosen = {label: 'auto', res: 0, sources: groupedSrc.label.auto};\n\t\t\t\t\tvar menuButton = new ResolutionMenuButton(player, { \n\t\t\t\t\t\tsources: groupedSrc, \n\t\t\t\t\t\tinitialySelectedLabel: choosen.label, \n\t\t\t\t\t\tinitialySelectedRes: choosen.res, \n\t\t\t\t\t\tcustomSourcePicker: _customSourcePicker\n\t\t\t\t\t}, settings, label);\n\n\t\t\t\t\tmenuButton.el().classList.add('vjs-resolution-button');\n\t\t\t\t\tplayer.controlBar.resolutionSwitcher = player.controlBar.addChild(menuButton);\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\tplayer.ready(function(){\n\t\t\t\tif(player.options_.sources.length > 1){\n\t\t\t\t\t// tech: Html5 and Flash\n\t\t\t\t\t// Create resolution switcher for videos form <source> tag inside <video>\n\t\t\t\t\tplayer.updateSrc(player.options_.sources);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(player.techName_ === 'Youtube'){\n\t\t\t\t\t// tech: YouTube\n\t\t\t\t\tinitResolutionForYt(player);\n\t\t\t\t}\n\t\t\t});\n\n    };\n\n    // register the plugin\n    var registerPlugin = videojs.registerPlugin || videojs.plugin;\n    registerPlugin('videoJsResolutionSwitcher', videoJsResolutionSwitcher);\n  })(window, videojs);\n})();\n"]}