diff options
Diffstat (limited to '')
7 files changed, 1340 insertions, 0 deletions
| diff --git a/assets/netcut/lib/videojs-wavesurfer/css/videojs.wavesurfer.css b/assets/netcut/lib/videojs-wavesurfer/css/videojs.wavesurfer.css new file mode 100644 index 0000000..8e09c6b --- /dev/null +++ b/assets/netcut/lib/videojs-wavesurfer/css/videojs.wavesurfer.css @@ -0,0 +1,47 @@ +/*! +Default styles for videojs-wavesurfer 2.5.1 +*/ +/* Position fullscreen control on right side of the player. +-------------------------------------------------------------------------------- +*/ +.video-js.vjs-wavesurfer .vjs-control.vjs-fullscreen-control { +  position: absolute; +  right: 0; } + +/* Ensure custom controls are always visible because +   the plugin hides and replace the video.js native mobile +   controls. +-------------------------------------------------------------------------------- +*/ +.vjs-wavesurfer .vjs-using-native-controls .vjs-control-bar { +  display: flex !important; } + +/* Ensure playToggle has pointer cursor. +-------------------------------------------------------------------------------- +*/ +.vjs-wavesurfer button.vjs-play-control.vjs-control.vjs-button { +  cursor: pointer; } + +/* Ensure that vjs menus and interfaces can be interacted with (such as the +   closed captions button). +-------------------------------------------------------------------------------- +*/ +.vjs-wavesurfer .vjs-menu-content { +  z-index: 4; } + +.vjs-wavesurfer .vjs-modal-dialog, .vjs-text-track-display { +  z-index: 4; } + +/* Handle responsive / fluid view. +-------------------------------------------------------------------------------- +*/ +.vjs-wavesurfer.vjs-fluid wave.vjs-wavedisplay { +  top: 0; +  position: absolute !important; +  width: 100%; +  min-width: 100%; +  max-width: 100%; +  height: 100%; } + + +/*# sourceMappingURL=videojs.wavesurfer.css.map*/
\ No newline at end of file diff --git a/assets/netcut/lib/videojs-wavesurfer/css/videojs.wavesurfer.css.map b/assets/netcut/lib/videojs-wavesurfer/css/videojs.wavesurfer.css.map new file mode 100644 index 0000000..c055733 --- /dev/null +++ b/assets/netcut/lib/videojs-wavesurfer/css/videojs.wavesurfer.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://VideojsWavesurfer/./src/css/videojs.wavesurfer.scss"],"names":[],"mappings":";;;AAAA;AACA;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;;AAE3B;AACA;AACA;AACA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe","file":"css/videojs.wavesurfer.css","sourcesContent":["/* Position fullscreen control on right side of the player.\n--------------------------------------------------------------------------------\n*/\n.video-js.vjs-wavesurfer .vjs-control.vjs-fullscreen-control {\n  position: absolute;\n  right: 0; }\n\n/* Ensure custom controls are always visible because\n   the plugin hides and replace the video.js native mobile\n   controls.\n--------------------------------------------------------------------------------\n*/\n.vjs-wavesurfer .vjs-using-native-controls .vjs-control-bar {\n  display: flex !important; }\n\n/* Ensure playToggle has pointer cursor.\n--------------------------------------------------------------------------------\n*/\n.vjs-wavesurfer button.vjs-play-control.vjs-control.vjs-button {\n  cursor: pointer; }\n\n/* Ensure that vjs menus and interfaces can be interacted with (such as the\n   closed captions button).\n--------------------------------------------------------------------------------\n*/\n.vjs-wavesurfer .vjs-menu-content {\n  z-index: 4; }\n\n.vjs-wavesurfer .vjs-modal-dialog, .vjs-text-track-display {\n  z-index: 4; }\n\n/* Handle responsive / fluid view.\n--------------------------------------------------------------------------------\n*/\n.vjs-wavesurfer.vjs-fluid wave.vjs-wavedisplay {\n  top: 0;\n  position: absolute !important;\n  width: 100%;\n  min-width: 100%;\n  max-width: 100%;\n  height: 100%; }\n"],"sourceRoot":""}
\ No newline at end of file diff --git a/assets/netcut/lib/videojs-wavesurfer/css/videojs.wavesurfer.min.css b/assets/netcut/lib/videojs-wavesurfer/css/videojs.wavesurfer.min.css new file mode 100644 index 0000000..2b7f774 --- /dev/null +++ b/assets/netcut/lib/videojs-wavesurfer/css/videojs.wavesurfer.min.css @@ -0,0 +1,3 @@ +/*! +Default styles for videojs-wavesurfer 2.5.1 +*/.video-js.vjs-wavesurfer .vjs-control.vjs-fullscreen-control{position:absolute;right:0}.vjs-wavesurfer .vjs-using-native-controls .vjs-control-bar{display:flex!important}.vjs-wavesurfer button.vjs-play-control.vjs-control.vjs-button{cursor:pointer}.vjs-text-track-display,.vjs-wavesurfer .vjs-menu-content,.vjs-wavesurfer .vjs-modal-dialog{z-index:4}.vjs-wavesurfer.vjs-fluid wave.vjs-wavedisplay{height:100%;max-width:100%;min-width:100%;position:absolute!important;top:0;width:100%}
\ No newline at end of file diff --git a/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.js b/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.js new file mode 100644 index 0000000..4c1b566 --- /dev/null +++ b/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.js @@ -0,0 +1,1278 @@ +/*! + * videojs-wavesurfer + * @version 2.5.1 + * @see https://github.com/collab-project/videojs-wavesurfer + * @copyright 2014-2018 Collab + * @license MIT + */ +(function webpackUniversalModuleDefinition(root, factory) { +	if(typeof exports === 'object' && typeof module === 'object') +		module.exports = factory(require("videojs"), require("WaveSurfer")); +	else if(typeof define === 'function' && define.amd) +		define("VideojsWavesurfer", ["videojs", "WaveSurfer"], factory); +	else if(typeof exports === 'object') +		exports["VideojsWavesurfer"] = factory(require("videojs"), require("WaveSurfer")); +	else +		root["VideojsWavesurfer"] = factory(root["videojs"], root["WaveSurfer"]); +})(window, function(__WEBPACK_EXTERNAL_MODULE_video_js__, __WEBPACK_EXTERNAL_MODULE_wavesurfer_js__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ 	// The module cache +/******/ 	var installedModules = {}; +/******/ +/******/ 	// The require function +/******/ 	function __webpack_require__(moduleId) { +/******/ +/******/ 		// Check if module is in cache +/******/ 		if(installedModules[moduleId]) { +/******/ 			return installedModules[moduleId].exports; +/******/ 		} +/******/ 		// Create a new module (and put it into the cache) +/******/ 		var module = installedModules[moduleId] = { +/******/ 			i: moduleId, +/******/ 			l: false, +/******/ 			exports: {} +/******/ 		}; +/******/ +/******/ 		// Execute the module function +/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ 		// Flag the module as loaded +/******/ 		module.l = true; +/******/ +/******/ 		// Return the exports of the module +/******/ 		return module.exports; +/******/ 	} +/******/ +/******/ +/******/ 	// expose the modules object (__webpack_modules__) +/******/ 	__webpack_require__.m = modules; +/******/ +/******/ 	// expose the module cache +/******/ 	__webpack_require__.c = installedModules; +/******/ +/******/ 	// define getter function for harmony exports +/******/ 	__webpack_require__.d = function(exports, name, getter) { +/******/ 		if(!__webpack_require__.o(exports, name)) { +/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ 		} +/******/ 	}; +/******/ +/******/ 	// define __esModule on exports +/******/ 	__webpack_require__.r = function(exports) { +/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ 		} +/******/ 		Object.defineProperty(exports, '__esModule', { value: true }); +/******/ 	}; +/******/ +/******/ 	// create a fake namespace object +/******/ 	// mode & 1: value is a module id, require it +/******/ 	// mode & 2: merge all properties of value into the ns +/******/ 	// mode & 4: return value when already ns object +/******/ 	// mode & 8|1: behave like require +/******/ 	__webpack_require__.t = function(value, mode) { +/******/ 		if(mode & 1) value = __webpack_require__(value); +/******/ 		if(mode & 8) return value; +/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ 		var ns = Object.create(null); +/******/ 		__webpack_require__.r(ns); +/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ 		return ns; +/******/ 	}; +/******/ +/******/ 	// getDefaultExport function for compatibility with non-harmony modules +/******/ 	__webpack_require__.n = function(module) { +/******/ 		var getter = module && module.__esModule ? +/******/ 			function getDefault() { return module['default']; } : +/******/ 			function getModuleExports() { return module; }; +/******/ 		__webpack_require__.d(getter, 'a', getter); +/******/ 		return getter; +/******/ 	}; +/******/ +/******/ 	// Object.prototype.hasOwnProperty.call +/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ 	// __webpack_public_path__ +/******/ 	__webpack_require__.p = ""; +/******/ +/******/ +/******/ 	// Load entry module and return exports +/******/ 	return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/global/window.js": +/*!***************************************!*\ +  !*** ./node_modules/global/window.js ***! +  \***************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(global) {var win; + +if (typeof window !== "undefined") { +    win = window; +} else if (typeof global !== "undefined") { +    win = global; +} else if (typeof self !== "undefined"){ +    win = self; +} else { +    win = {}; +} + +module.exports = win; + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) + +/***/ }), + +/***/ "./node_modules/webpack/buildin/global.js": +/*!***********************************!*\ +  !*** (webpack)/buildin/global.js ***! +  \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { +	return this; +})(); + +try { +	// This works if eval is allowed (see CSP) +	g = g || Function("return this")() || (1, eval)("this"); +} catch (e) { +	// This works if the window reference is available +	if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }), + +/***/ "./src/css/videojs.wavesurfer.scss": +/*!*****************************************!*\ +  !*** ./src/css/videojs.wavesurfer.scss ***! +  \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// extracted by mini-css-extract-plugin + +/***/ }), + +/***/ "./src/js/defaults.js": +/*!****************************!*\ +  !*** ./src/js/defaults.js ***! +  \****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { +    value: true +}); +/** + * @file defaults.js + * @since 2.0.0 + */ + +// plugin defaults +var pluginDefaultOptions = { +    // Display console log messages. +    debug: false, +    // msDisplayMax indicates the number of seconds that is +    // considered the boundary value for displaying milliseconds +    // in the time controls. An audio clip with a total length of +    // 2 seconds and a msDisplayMax of 3 will use the format +    // M:SS:MMM. Clips longer than msDisplayMax will be displayed +    // as M:SS or HH:MM:SS. +    msDisplayMax: 3 +}; + +exports.default = pluginDefaultOptions; +module.exports = exports["default"]; + +/***/ }), + +/***/ "./src/js/utils/format-time.js": +/*!*************************************!*\ +  !*** ./src/js/utils/format-time.js ***! +  \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { +    value: true +}); +/** + * @file format-time.js + * @since 2.0.0 + */ + +/** + * Format seconds as a time string, H:MM:SS, M:SS or M:SS:MMM. + * + * Supplying a guide (in seconds) will force a number of leading zeros + * to cover the length of the guide. + * + * @param {number} seconds - Number of seconds to be turned into a + *     string. + * @param {number} guide - Number (in seconds) to model the string + *     after. + * @param {number} msDisplayMax - Number (in milliseconds) to model the string + *     after. + * @return {string} Time formatted as H:MM:SS, M:SS or M:SS:MMM, e.g. + *     0:00:12. + * @private + */ +var formatTime = function formatTime(seconds, guide, msDisplayMax) { +    // Default to using seconds as guide +    seconds = seconds < 0 ? 0 : seconds; +    guide = guide || seconds; +    var s = Math.floor(seconds % 60), +        m = Math.floor(seconds / 60 % 60), +        h = Math.floor(seconds / 3600), +        gm = Math.floor(guide / 60 % 60), +        gh = Math.floor(guide / 3600), +        ms = Math.floor((seconds - s) * 1000); + +    // handle invalid times +    if (isNaN(seconds) || seconds === Infinity) { +        // '-' is false for all relational operators (e.g. <, >=) so this +        // setting will add the minimum number of fields specified by the +        // guide +        h = m = s = ms = '-'; +    } + +    // Check if we need to show milliseconds +    if (guide > 0 && guide < msDisplayMax) { +        if (ms < 100) { +            if (ms < 10) { +                ms = '00' + ms; +            } else { +                ms = '0' + ms; +            } +        } +        ms = ':' + ms; +    } else { +        ms = ''; +    } + +    // Check if we need to show hours +    h = h > 0 || gh > 0 ? h + ':' : ''; + +    // If hours are showing, we may need to add a leading zero. +    // Always show at least one digit of minutes. +    m = ((h || gm >= 10) && m < 10 ? '0' + m : m) + ':'; + +    // Check if leading zero is need for seconds +    s = s < 10 ? '0' + s : s; + +    return h + m + s + ms; +}; + +exports.default = formatTime; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/js/utils/log.js": +/*!*****************************!*\ +  !*** ./src/js/utils/log.js ***! +  \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { +    value: true +}); +/** + * @file log.js + * @since 2.0.0 + */ + +var ERROR = 'error'; +var WARN = 'warn'; + +/** + * Log message (if the debug option is enabled). + */ +var log = function log(args, logType, debug) { +    if (debug === true) { +        if (logType === ERROR) { +            videojs.log.error(args); +        } else if (logType === WARN) { +            videojs.log.warn(args); +        } else { +            videojs.log(args); +        } +    } +}; + +exports.default = log; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/js/videojs.wavesurfer.js": +/*!**************************************!*\ +  !*** ./src/js/videojs.wavesurfer.js ***! +  \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _log2 = __webpack_require__(/*! ./utils/log */ "./src/js/utils/log.js"); + +var _log3 = _interopRequireDefault(_log2); + +var _formatTime = __webpack_require__(/*! ./utils/format-time */ "./src/js/utils/format-time.js"); + +var _formatTime2 = _interopRequireDefault(_formatTime); + +var _defaults = __webpack_require__(/*! ./defaults */ "./src/js/defaults.js"); + +var _defaults2 = _interopRequireDefault(_defaults); + +var _window = __webpack_require__(/*! global/window */ "./node_modules/global/window.js"); + +var _window2 = _interopRequireDefault(_window); + +var _video = __webpack_require__(/*! video.js */ "video.js"); + +var _video2 = _interopRequireDefault(_video); + +var _wavesurfer = __webpack_require__(/*! wavesurfer.js */ "wavesurfer.js"); + +var _wavesurfer2 = _interopRequireDefault(_wavesurfer); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(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; } + +function _inherits(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; } /** +                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * @file videojs.wavesurfer.js +                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * +                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * The main file for the videojs-wavesurfer project. +                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * MIT license: https://github.com/collab-project/videojs-wavesurfer/blob/master/LICENSE +                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                */ + +var Plugin = _video2.default.getPlugin('plugin'); + +var wavesurferClassName = 'vjs-wavedisplay'; + +/** + * Draw a waveform for audio and video files in a video.js player. + * + * @class Wavesurfer + * @extends videojs.Plugin + */ + +var Wavesurfer = function (_Plugin) { +    _inherits(Wavesurfer, _Plugin); + +    /** +     * The constructor function for the class. +     * +     * @param {(videojs.Player|Object)} player +     * @param {Object} options - Player options. +     */ +    function Wavesurfer(player, options) { +        _classCallCheck(this, Wavesurfer); + +        // add plugin style +        var _this = _possibleConstructorReturn(this, (Wavesurfer.__proto__ || Object.getPrototypeOf(Wavesurfer)).call(this, player, options)); + +        player.addClass('vjs-wavesurfer'); + +        // parse options +        options = _video2.default.mergeOptions(_defaults2.default, options); +        _this.waveReady = false; +        _this.waveFinished = false; +        _this.liveMode = false; +        _this.debug = options.debug.toString() === 'true'; +        _this.msDisplayMax = parseFloat(options.msDisplayMax); +        _this.textTracksEnabled = _this.player.options_.tracks.length > 0; + +        // microphone plugin +        if (options.src === 'live') { +            // check if the wavesurfer.js microphone plugin can be enabled +            if (_wavesurfer2.default.microphone !== undefined) { +                // enable audio input from a microphone +                _this.liveMode = true; +                _this.waveReady = true; +            } else { +                _this.onWaveError('Could not find wavesurfer.js ' + 'microphone plugin!'); +                return _possibleConstructorReturn(_this); +            } +        } + +        // wait until player ui is ready +        _this.player.one('ready', _this.initialize.bind(_this)); +        return _this; +    } + +    /** +     * Player UI is ready: customize controls. +     */ + + +    _createClass(Wavesurfer, [{ +        key: 'initialize', +        value: function initialize() { +            // hide big play button +            this.player.bigPlayButton.hide(); + +            // the native controls don't work for this UI so disable +            // them no matter what +            if (this.player.usingNativeControls_ === true) { +                if (this.player.tech_.el_ !== undefined) { +                    this.player.tech_.el_.controls = false; +                } +            } + +            // controls +            if (this.player.options_.controls === true) { +                // make sure controlBar is showing +                this.player.controlBar.show(); +                this.player.controlBar.el_.style.display = 'flex'; + +                // progress control isn't used by this plugin +                this.player.controlBar.progressControl.hide(); + +                // make sure time displays are visible +                var uiElements = [this.player.controlBar.currentTimeDisplay, this.player.controlBar.timeDivider, this.player.controlBar.durationDisplay]; +                uiElements.forEach(function (element) { +                    // ignore and show when essential elements have been disabled +                    // by user +                    if (element !== undefined) { +                        element.el_.style.display = 'block'; +                        element.show(); +                    } +                }); +                if (this.player.controlBar.remainingTimeDisplay !== undefined) { +                    this.player.controlBar.remainingTimeDisplay.hide(); +                } + +                // handle play toggle interaction +                this.player.controlBar.playToggle.on(['tap', 'click'], this.onPlayToggle.bind(this)); + +                // disable play button until waveform is ready +                // (except when in live mode) +                if (!this.liveMode) { +                    this.player.controlBar.playToggle.hide(); +                } +            } + +            // wavesurfer.js setup +            var mergedOptions = this.parseOptions(this.player.options_.plugins.wavesurfer); +            this.surfer = _wavesurfer2.default.create(mergedOptions); +            this.surfer.on('error', this.onWaveError.bind(this)); +            this.surfer.on('finish', this.onWaveFinish.bind(this)); +            if (this.liveMode === true) { +                // listen for wavesurfer.js microphone plugin events +                this.surfer.microphone.on('deviceError', this.onWaveError.bind(this)); +            } +            this.surferReady = this.onWaveReady.bind(this); +            this.surferProgress = this.onWaveProgress.bind(this); +            this.surferSeek = this.onWaveSeek.bind(this); + +            // only listen to these wavesurfer.js playback events when not +            // in live mode +            if (!this.liveMode) { +                this.setupPlaybackEvents(true); +            } + +            // video.js player events +            this.player.on('volumechange', this.onVolumeChange.bind(this)); +            this.player.on('fullscreenchange', this.onScreenChange.bind(this)); + +            // make sure volume is muted when requested +            if (this.player.muted()) { +                this.setVolume(0); +            } + +            // video.js fluid option +            if (this.player.options_.fluid === true) { +                // give wave element a classname so it can be styled +                this.surfer.drawer.wrapper.className = wavesurferClassName; +                // listen for window resize events +                this.responsiveWave = _wavesurfer2.default.util.debounce(this.onResizeChange.bind(this), 150); +                _window2.default.addEventListener('resize', this.responsiveWave); +            } + +            // text tracks +            if (this.textTracksEnabled) { +                // disable timeupdates +                this.player.controlBar.currentTimeDisplay.off(this.player, 'timeupdate', this.player.controlBar.currentTimeDisplay.throttledUpdateContent); + +                // sets up an interval function to track current time +                // and trigger timeupdate every 250 milliseconds. +                // needed for text tracks +                this.player.tech_.trackCurrentTime(); +            } + +            // kick things off +            this.startPlayers(); +        } + +        /** +         * Initializes the waveform options. +         * +         * @param {Object} surferOpts - Plugin options. +         * @private +         */ + +    }, { +        key: 'parseOptions', +        value: function parseOptions(surferOpts) { +            var rect = this.player.el_.getBoundingClientRect(); +            this.originalWidth = this.player.options_.width || rect.width; +            this.originalHeight = this.player.options_.height || rect.height; + +            // controlbar +            var controlBarHeight = this.player.controlBar.height(); +            if (this.player.options_.controls === true && controlBarHeight === 0) { +                // the dimensions of the controlbar are not known yet, but we +                // need it now, so we can calculate the height of the waveform. +                // The default height is 30px, so use that instead. +                controlBarHeight = 30; +            } + +            // set waveform element and dimensions +            // Set the container to player's container if "container" option is +            // not provided. If a waveform needs to be appended to your custom +            // element, then use below option. For example: +            // container: document.querySelector("#vjs-waveform") +            if (surferOpts.container === undefined) { +                surferOpts.container = this.player.el_; +            } + +            // set the height of generated waveform if user has provided height +            // from options. If height of waveform need to be customized then use +            // option below. For example: waveformHeight: 30 +            if (surferOpts.waveformHeight === undefined) { +                var playerHeight = rect.height; +                surferOpts.height = playerHeight - controlBarHeight; +            } else { +                surferOpts.height = opts.waveformHeight; +            } + +            // split channels +            if (surferOpts.splitChannels && surferOpts.splitChannels === true) { +                surferOpts.height /= 2; +            } + +            // enable wavesurfer.js microphone plugin +            if (this.liveMode === true) { +                surferOpts.plugins = [_wavesurfer2.default.microphone.create(surferOpts)]; +                this.log('wavesurfer.js microphone plugin enabled.'); +            } + +            return surferOpts; +        } + +        /** +         * Start the players. +         * @private +         */ + +    }, { +        key: 'startPlayers', +        value: function startPlayers() { +            var options = this.player.options_.plugins.wavesurfer; +            if (options.src !== undefined) { +                if (this.surfer.microphone === undefined) { +                    // show loading spinner +                    this.player.loadingSpinner.show(); + +                    // start loading file +                    this.load(options.src, options.peaks); +                } else { +                    // hide loading spinner +                    this.player.loadingSpinner.hide(); + +                    // connect microphone input to our waveform +                    options.wavesurfer = this.surfer; +                } +            } else { +                // no valid src found, hide loading spinner +                this.player.loadingSpinner.hide(); +            } +        } + +        /** +         * Starts or stops listening to events related to audio-playback. +         * +         * @param {boolean} enable - Start or stop listening to playback +         *     related events. +         * @private +         */ + +    }, { +        key: 'setupPlaybackEvents', +        value: function setupPlaybackEvents(enable) { +            if (enable === false) { +                this.surfer.un('ready', this.surferReady); +                this.surfer.un('audioprocess', this.surferProgress); +                this.surfer.un('seek', this.surferSeek); +            } else if (enable === true) { +                this.surfer.on('ready', this.surferReady); +                this.surfer.on('audioprocess', this.surferProgress); +                this.surfer.on('seek', this.surferSeek); +            } +        } + +        /** +         * Start loading waveform data. +         * +         * @param {string|blob|file} url - Either the URL of the audio file, +         *     a Blob or a File object. +         * @param {string|?number[]|number[][]} peaks - Either the URL of peaks +         *     data for the audio file, or an array with peaks data. +         */ + +    }, { +        key: 'load', +        value: function load(url, peaks) { +            var _this2 = this; + +            if (url instanceof Blob || url instanceof File) { +                this.log('Loading object: ' + JSON.stringify(url)); +                this.surfer.loadBlob(url); +            } else { +                // load peak data from file +                if (peaks !== undefined) { +                    if (Array.isArray(peaks)) { +                        // use supplied peaks data +                        this.log('Loading URL: ' + url); +                        this.surfer.load(url, peaks); +                    } else { +                        // load peak data from file +                        var ajaxOptions = { +                            url: peaks, +                            responseType: 'json' +                        }; +                        // supply xhr options, if any +                        if (this.player.options_.plugins.wavesurfer.xhr !== undefined) { +                            ajaxOptions.xhr = this.player.options_.plugins.wavesurfer.xhr; +                        } +                        var ajax = _wavesurfer2.default.util.ajax(ajaxOptions); + +                        ajax.on('success', function (data, e) { +                            _this2.log('Loaded Peak Data URL: ' + peaks); +                            _this2.surfer.load(url, data.data); +                        }); +                        ajax.on('error', function (e) { +                            _this2.log('Unable to retrieve peak data from ' + peaks + '. Status code: ' + e.target.status, 'warn'); +                            _this2.log('Loading URL: ' + url); +                            _this2.surfer.load(url); +                        }); +                    } +                } else { +                    // no peaks +                    this.log('Loading URL: ' + url); +                    this.surfer.load(url); +                } +            } +        } + +        /** +         * Start/resume playback or microphone. +         */ + +    }, { +        key: 'play', +        value: function play() { +            // show pause button +            this.player.controlBar.playToggle.handlePlay(); + +            if (this.liveMode) { +                // start/resume microphone visualization +                if (!this.surfer.microphone.active) { +                    this.log('Start microphone'); +                    this.surfer.microphone.start(); +                } else { +                    // toggle paused +                    var paused = !this.surfer.microphone.paused; + +                    if (paused) { +                        this.pause(); +                    } else { +                        this.log('Resume microphone'); +                        this.surfer.microphone.play(); +                    } +                } +            } else { +                this.log('Start playback'); + +                // put video.js player UI in playback mode +                this.player.play(); + +                // start surfer playback +                this.surfer.play(); +            } +        } + +        /** +         * Pauses playback or microphone visualization. +         */ + +    }, { +        key: 'pause', +        value: function pause() { +            // show play button +            if (this.player.controlBar.playToggle.contentEl()) { +                this.player.controlBar.playToggle.handlePause(); +            } + +            if (this.liveMode) { +                // pause microphone visualization +                this.log('Pause microphone'); +                this.surfer.microphone.pause(); +            } else { +                // pause playback +                this.log('Pause playback'); + +                if (!this.waveFinished) { +                    // pause wavesurfer playback +                    this.surfer.pause(); +                } else { +                    this.waveFinished = false; +                } + +                this.setCurrentTime(); +            } +        } + +        /** +         * @private +         */ + +    }, { +        key: 'dispose', +        value: function dispose() { +            if (this.surfer) { +                if (this.liveMode && this.surfer.microphone) { +                    // destroy microphone plugin +                    this.surfer.microphone.destroy(); +                    this.log('Destroyed microphone plugin'); +                } +                // destroy wavesurfer instance +                this.surfer.destroy(); +            } +            if (this.textTracksEnabled) { +                this.player.tech_.stopTrackingCurrentTime(); +            } +            this.log('Destroyed plugin'); +        } + +        /** +         * Indicates whether the plugin is destroyed or not. +         * +         * @return {boolean} Plugin destroyed or not. +         */ + +    }, { +        key: 'isDestroyed', +        value: function isDestroyed() { +            return this.player && this.player.children() === null; +        } + +        /** +         * Remove the player and waveform. +         */ + +    }, { +        key: 'destroy', +        value: function destroy() { +            this.player.dispose(); +        } + +        /** +         * Set the volume level. +         * +         * @param {number} volume - The new volume level. +         */ + +    }, { +        key: 'setVolume', +        value: function setVolume(volume) { +            if (volume !== undefined) { +                this.log('Changing volume to: ' + volume); + +                // update player volume +                this.player.volume(volume); +            } +        } + +        /** +         * Save waveform image as data URI. +         * +         * The default format is 'image/png'. Other supported types are +         * 'image/jpeg' and 'image/webp'. +         * +         * @param {string} [format=image/png] - String indicating the image format. +         * @param {number} [quality=1] - Number between 0 and 1 indicating image +         *     quality if the requested type is 'image/jpeg' or 'image/webp'. +         * @returns {string} The data URI of the image data. +         */ + +    }, { +        key: 'exportImage', +        value: function exportImage(format, quality) { +            return this.surfer.exportImage(format, quality); +        } + +        /** +         * Change the audio output device. +         * +         * @param {string} sinkId - Id of audio output device. +         */ + +    }, { +        key: 'setAudioOutput', +        value: function setAudioOutput(deviceId) { +            var _this3 = this; + +            if (deviceId) { +                this.surfer.setSinkId(deviceId).then(function (result) { +                    // notify listeners +                    _this3.player.trigger('audioOutputReady'); +                }).catch(function (err) { +                    // notify listeners +                    _this3.player.trigger('error', err); + +                    _this3.log(err, 'error'); +                }); +            } +        } + +        /** +         * Get the current time (in seconds) of the stream during playback. +         * +         * Returns 0 if no stream is available (yet). +         */ + +    }, { +        key: 'getCurrentTime', +        value: function getCurrentTime() { +            var currentTime = this.surfer.getCurrentTime(); +            currentTime = isNaN(currentTime) ? 0 : currentTime; + +            return currentTime; +        } + +        /** +         * Updates the player's element displaying the current time. +         * +         * @param {number} [currentTime] - Current position of the playhead +         *     (in seconds). +         * @param {number} [duration] - Duration of the waveform (in seconds). +         * @private +         */ + +    }, { +        key: 'setCurrentTime', +        value: function setCurrentTime(currentTime, duration) { +            if (currentTime === undefined) { +                currentTime = this.surfer.getCurrentTime(); +            } + +            if (duration === undefined) { +                duration = this.surfer.getDuration(); +            } + +            currentTime = isNaN(currentTime) ? 0 : currentTime; +            duration = isNaN(duration) ? 0 : duration; +            var time = Math.min(currentTime, duration); + +            // update current time display component +            if (this.player.controlBar.currentTimeDisplay.contentEl()) { +                this.player.controlBar.currentTimeDisplay.formattedTime_ = this.player.controlBar.currentTimeDisplay.contentEl().lastChild.textContent = (0, _formatTime2.default)(time, duration, this.msDisplayMax); +            } + +            if (this.textTracksEnabled) { +                // only needed for text tracks +                this.player.tech_.setCurrentTime(currentTime); +            } +        } + +        /** +         * Get the duration of the stream in seconds. +         * +         * Returns 0 if no stream is available (yet). +         */ + +    }, { +        key: 'getDuration', +        value: function getDuration() { +            var duration = this.surfer.getDuration(); +            duration = isNaN(duration) ? 0 : duration; + +            return duration; +        } + +        /** +         * Updates the player's element displaying the duration time. +         * +         * @param {number} [duration] - Duration of the waveform (in seconds). +         * @private +         */ + +    }, { +        key: 'setDuration', +        value: function setDuration(duration) { +            if (duration === undefined) { +                duration = this.surfer.getDuration(); +            } +            duration = isNaN(duration) ? 0 : duration; + +            // update duration display component +            if (this.player.controlBar.durationDisplay.contentEl()) { +                this.player.controlBar.durationDisplay.formattedTime_ = this.player.controlBar.durationDisplay.contentEl().lastChild.textContent = (0, _formatTime2.default)(duration, duration, this.msDisplayMax); +            } +        } + +        /** +         * Audio is loaded, decoded and the waveform is drawn. +         * +         * @fires waveReady +         * @private +         */ + +    }, { +        key: 'onWaveReady', +        value: function onWaveReady() { +            this.waveReady = true; +            this.waveFinished = false; +            this.liveMode = false; + +            this.log('Waveform is ready'); +            this.player.trigger('waveReady'); + +            // update time display +            this.setCurrentTime(); +            this.setDuration(); + +            // enable and show play button +            if (this.player.controlBar.playToggle.contentEl()) { +                this.player.controlBar.playToggle.show(); +            } + +            // hide loading spinner +            if (this.player.loadingSpinner.contentEl()) { +                this.player.loadingSpinner.hide(); +            } + +            // auto-play when ready (if enabled) +            if (this.player.options_.autoplay === true) { +                this.play(); +            } +        } + +        /** +         * Fires when audio playback completed. +         * +         * @fires playbackFinish +         * @private +         */ + +    }, { +        key: 'onWaveFinish', +        value: function onWaveFinish() { +            var _this4 = this; + +            this.log('Finished playback'); + +            // notify listeners +            this.player.trigger('playbackFinish'); + +            // check if loop is enabled +            if (this.player.options_.loop === true) { +                // reset waveform +                this.surfer.stop(); +                this.play(); +            } else { +                // finished +                this.waveFinished = true; + +                // pause player +                this.pause(); + +                // show the replay state of play toggle +                this.player.trigger('ended'); + +                // this gets called once after the clip has ended and the user +                // seeks so that we can change the replay button back to a play +                // button +                this.surfer.once('seek', function () { +                    _this4.player.controlBar.playToggle.removeClass('vjs-ended'); +                    _this4.player.trigger('pause'); +                }); +            } +        } + +        /** +         * Fires continuously during audio playback. +         * +         * @param {number} time - Current time/location of the playhead. +         * @private +         */ + +    }, { +        key: 'onWaveProgress', +        value: function onWaveProgress(time) { +            this.setCurrentTime(); +        } + +        /** +         * Fires during seeking of the waveform. +         * @private +         */ + +    }, { +        key: 'onWaveSeek', +        value: function onWaveSeek() { +            this.setCurrentTime(); +        } + +        /** +         * Waveform error. +         * +         * @param {string} error - The wavesurfer error. +         * @private +         */ + +    }, { +        key: 'onWaveError', +        value: function onWaveError(error) { +            // notify listeners +            this.player.trigger('error', error); + +            this.log(error, 'error'); +        } + +        /** +         * Fired when the play toggle is clicked. +         * @private +         */ + +    }, { +        key: 'onPlayToggle', +        value: function onPlayToggle() { +            // workaround for video.js 6.3.1 and newer +            if (this.player.controlBar.playToggle.hasClass('vjs-ended')) { +                this.player.controlBar.playToggle.removeClass('vjs-ended'); +            } +            if (this.surfer.isPlaying()) { +                this.pause(); +            } else { +                this.play(); +            } +        } + +        /** +         * Fired when the volume in the video.js player changes. +         * @private +         */ + +    }, { +        key: 'onVolumeChange', +        value: function onVolumeChange() { +            var volume = this.player.volume(); +            if (this.player.muted()) { +                // muted volume +                volume = 0; +            } + +            // update wavesurfer.js volume +            this.surfer.setVolume(volume); +        } + +        /** +         * Fired when the video.js player switches in or out of fullscreen mode. +         * @private +         */ + +    }, { +        key: 'onScreenChange', +        value: function onScreenChange() { +            var _this5 = this; + +            // execute with tiny delay so the player element completes +            // rendering and correct dimensions are reported +            var fullscreenDelay = this.player.setInterval(function () { +                var isFullscreen = _this5.player.isFullscreen(); +                var newWidth = void 0, +                    newHeight = void 0; +                if (!isFullscreen) { +                    // restore original dimensions +                    newWidth = _this5.originalWidth; +                    newHeight = _this5.originalHeight; +                } + +                if (_this5.waveReady) { +                    if (_this5.liveMode && !_this5.surfer.microphone.active) { +                        // we're in live mode but the microphone hasn't been +                        // started yet +                        return; +                    } +                    // redraw +                    _this5.redrawWaveform(newWidth, newHeight); +                } + +                // stop fullscreenDelay interval +                _this5.player.clearInterval(fullscreenDelay); +            }, 100); +        } + +        /** +         * Fired when the video.js player is resized. +         * +         * @private +         */ + +    }, { +        key: 'onResizeChange', +        value: function onResizeChange() { +            if (this.surfer !== undefined) { +                // redraw waveform +                this.redrawWaveform(); +            } +        } + +        /** +         * Redraw waveform. +         * +         * @param {number} [newWidth] - New width for the waveform. +         * @param {number} [newHeight] - New height for the waveform. +         * @private +         */ + +    }, { +        key: 'redrawWaveform', +        value: function redrawWaveform(newWidth, newHeight) { +            if (!this.isDestroyed()) { +                if (this.player.el_) { +                    var rect = this.player.el_.getBoundingClientRect(); +                    if (newWidth === undefined) { +                        // get player width +                        newWidth = rect.width; +                    } +                    if (newHeight === undefined) { +                        // get player height +                        newHeight = rect.height; +                    } +                } + +                // destroy old drawing +                this.surfer.drawer.destroy(); + +                // set new dimensions +                this.surfer.params.width = newWidth; +                this.surfer.params.height = newHeight - this.player.controlBar.height(); + +                // redraw waveform +                this.surfer.createDrawer(); +                this.surfer.drawer.wrapper.className = wavesurferClassName; +                this.surfer.drawBuffer(); + +                // make sure playhead is restored at right position +                this.surfer.drawer.progress(this.surfer.backend.getPlayedPercents()); +            } +        } + +        /** +         * @private +         */ + +    }, { +        key: 'log', +        value: function log(args, logType) { +            (0, _log3.default)(args, logType, this.debug); +        } +    }]); + +    return Wavesurfer; +}(Plugin); + +// version nr is injected during build + + +Wavesurfer.VERSION = "2.5.1"; + +// register plugin once +_video2.default.Wavesurfer = Wavesurfer; +if (_video2.default.getPlugin('wavesurfer') === undefined) { +    _video2.default.registerPlugin('wavesurfer', Wavesurfer); +} + +module.exports = { +    Wavesurfer: Wavesurfer +}; + +/***/ }), + +/***/ 0: +/*!******************************************************************************!*\ +  !*** multi ./src/js/videojs.wavesurfer.js ./src/css/videojs.wavesurfer.scss ***! +  \******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! /Users/thijstriemstra/projects/videojs-wavesurfer/src/js/videojs.wavesurfer.js */"./src/js/videojs.wavesurfer.js"); +module.exports = __webpack_require__(/*! /Users/thijstriemstra/projects/videojs-wavesurfer/src/css/videojs.wavesurfer.scss */"./src/css/videojs.wavesurfer.scss"); + + +/***/ }), + +/***/ "video.js": +/*!**************************!*\ +  !*** external "videojs" ***! +  \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE_video_js__; + +/***/ }), + +/***/ "wavesurfer.js": +/*!*****************************!*\ +  !*** external "WaveSurfer" ***! +  \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE_wavesurfer_js__; + +/***/ }) + +/******/ }); +}); +//# sourceMappingURL=videojs.wavesurfer.js.map
\ No newline at end of file diff --git a/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.js.map b/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.js.map new file mode 100644 index 0000000..6494f22 --- /dev/null +++ b/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://VideojsWavesurfer/webpack/universalModuleDefinition","webpack://VideojsWavesurfer/webpack/bootstrap","webpack://VideojsWavesurfer/./node_modules/global/window.js","webpack://VideojsWavesurfer/(webpack)/buildin/global.js","webpack://VideojsWavesurfer/./src/css/videojs.wavesurfer.scss?3ee4","webpack://VideojsWavesurfer/./src/js/defaults.js","webpack://VideojsWavesurfer/./src/js/utils/format-time.js","webpack://VideojsWavesurfer/./src/js/utils/log.js","webpack://VideojsWavesurfer/./src/js/videojs.wavesurfer.js","webpack://VideojsWavesurfer/external \"videojs\"","webpack://VideojsWavesurfer/external \"WaveSurfer\""],"names":["pluginDefaultOptions","debug","msDisplayMax","formatTime","seconds","guide","s","Math","floor","m","h","gm","gh","ms","isNaN","Infinity","ERROR","WARN","log","args","logType","videojs","error","warn","Plugin","getPlugin","wavesurferClassName","Wavesurfer","player","options","addClass","mergeOptions","waveReady","waveFinished","liveMode","toString","parseFloat","textTracksEnabled","options_","tracks","length","src","microphone","undefined","onWaveError","one","initialize","bind","bigPlayButton","hide","usingNativeControls_","tech_","el_","controls","controlBar","show","style","display","progressControl","uiElements","currentTimeDisplay","timeDivider","durationDisplay","forEach","element","remainingTimeDisplay","playToggle","on","onPlayToggle","mergedOptions","parseOptions","plugins","wavesurfer","surfer","create","onWaveFinish","surferReady","onWaveReady","surferProgress","onWaveProgress","surferSeek","onWaveSeek","setupPlaybackEvents","onVolumeChange","onScreenChange","muted","setVolume","fluid","drawer","wrapper","className","responsiveWave","util","debounce","onResizeChange","addEventListener","off","throttledUpdateContent","trackCurrentTime","startPlayers","surferOpts","rect","getBoundingClientRect","originalWidth","width","originalHeight","height","controlBarHeight","container","waveformHeight","playerHeight","opts","splitChannels","loadingSpinner","load","peaks","enable","un","url","Blob","File","JSON","stringify","loadBlob","Array","isArray","ajaxOptions","responseType","xhr","ajax","data","e","target","status","handlePlay","active","start","paused","pause","play","contentEl","handlePause","setCurrentTime","destroy","stopTrackingCurrentTime","children","dispose","volume","format","quality","exportImage","deviceId","setSinkId","then","result","trigger","catch","err","currentTime","getCurrentTime","duration","getDuration","time","min","formattedTime_","lastChild","textContent","setDuration","autoplay","loop","stop","once","removeClass","hasClass","isPlaying","fullscreenDelay","setInterval","isFullscreen","newWidth","newHeight","redrawWaveform","clearInterval","isDestroyed","params","createDrawer","drawBuffer","progress","backend","getPlayedPercents","VERSION","registerPlugin","module","exports"],"mappings":"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","file":"videojs.wavesurfer.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"videojs\"), require(\"WaveSurfer\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"VideojsWavesurfer\", [\"videojs\", \"WaveSurfer\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VideojsWavesurfer\"] = factory(require(\"videojs\"), require(\"WaveSurfer\"));\n\telse\n\t\troot[\"VideojsWavesurfer\"] = factory(root[\"videojs\"], root[\"WaveSurfer\"]);\n})(window, function(__WEBPACK_EXTERNAL_MODULE_video_js__, __WEBPACK_EXTERNAL_MODULE_wavesurfer_js__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","var win;\n\nif (typeof window !== \"undefined\") {\n    win = window;\n} else if (typeof global !== \"undefined\") {\n    win = global;\n} else if (typeof self !== \"undefined\"){\n    win = self;\n} else {\n    win = {};\n}\n\nmodule.exports = win;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","// extracted by mini-css-extract-plugin","/**\n * @file defaults.js\n * @since 2.0.0\n */\n\n// plugin defaults\nconst pluginDefaultOptions = {\n    // Display console log messages.\n    debug: false,\n    // msDisplayMax indicates the number of seconds that is\n    // considered the boundary value for displaying milliseconds\n    // in the time controls. An audio clip with a total length of\n    // 2 seconds and a msDisplayMax of 3 will use the format\n    // M:SS:MMM. Clips longer than msDisplayMax will be displayed\n    // as M:SS or HH:MM:SS.\n    msDisplayMax: 3\n};\n\nexport default pluginDefaultOptions;\n","/**\n * @file format-time.js\n * @since 2.0.0\n */\n\n/**\n * Format seconds as a time string, H:MM:SS, M:SS or M:SS:MMM.\n *\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide.\n *\n * @param {number} seconds - Number of seconds to be turned into a\n *     string.\n * @param {number} guide - Number (in seconds) to model the string\n *     after.\n * @param {number} msDisplayMax - Number (in milliseconds) to model the string\n *     after.\n * @return {string} Time formatted as H:MM:SS, M:SS or M:SS:MMM, e.g.\n *     0:00:12.\n * @private\n */\nconst formatTime = function(seconds, guide, msDisplayMax) {\n    // Default to using seconds as guide\n    seconds = seconds < 0 ? 0 : seconds;\n    guide = guide || seconds;\n    let s = Math.floor(seconds % 60),\n        m = Math.floor(seconds / 60 % 60),\n        h = Math.floor(seconds / 3600),\n        gm = Math.floor(guide / 60 % 60),\n        gh = Math.floor(guide / 3600),\n        ms = Math.floor((seconds - s) * 1000);\n\n    // handle invalid times\n    if (isNaN(seconds) || seconds === Infinity) {\n        // '-' is false for all relational operators (e.g. <, >=) so this\n        // setting will add the minimum number of fields specified by the\n        // guide\n        h = m = s = ms = '-';\n    }\n\n    // Check if we need to show milliseconds\n    if (guide > 0 && guide < msDisplayMax) {\n        if (ms < 100) {\n            if (ms < 10) {\n                ms = '00' + ms;\n            } else {\n                ms = '0' + ms;\n            }\n        }\n        ms = ':' + ms;\n    } else {\n        ms = '';\n    }\n\n    // Check if we need to show hours\n    h = (h > 0 || gh > 0) ? h + ':' : '';\n\n    // If hours are showing, we may need to add a leading zero.\n    // Always show at least one digit of minutes.\n    m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':';\n\n    // Check if leading zero is need for seconds\n    s = ((s < 10) ? '0' + s : s);\n\n    return h + m + s + ms;\n};\n\nexport default formatTime;\n","/**\n * @file log.js\n * @since 2.0.0\n */\n\nconst ERROR = 'error';\nconst WARN = 'warn';\n\n/**\n * Log message (if the debug option is enabled).\n */\nconst log = function(args, logType, debug)\n{\n    if (debug === true) {\n        if (logType === ERROR) {\n            videojs.log.error(args);\n        } else if (logType === WARN) {\n            videojs.log.warn(args);\n        } else {\n            videojs.log(args);\n        }\n    }\n};\n\nexport default log;\n","/**\n * @file videojs.wavesurfer.js\n *\n * The main file for the videojs-wavesurfer project.\n * MIT license: https://github.com/collab-project/videojs-wavesurfer/blob/master/LICENSE\n */\n\nimport log from './utils/log';\nimport formatTime from './utils/format-time';\nimport pluginDefaultOptions from './defaults';\nimport window from 'global/window';\n\nimport videojs from 'video.js';\nimport WaveSurfer from 'wavesurfer.js';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nconst wavesurferClassName = 'vjs-wavedisplay';\n\n/**\n * Draw a waveform for audio and video files in a video.js player.\n *\n * @class Wavesurfer\n * @extends videojs.Plugin\n */\nclass Wavesurfer extends Plugin {\n    /**\n     * The constructor function for the class.\n     *\n     * @param {(videojs.Player|Object)} player\n     * @param {Object} options - Player options.\n     */\n    constructor(player, options) {\n        super(player, options);\n\n        // add plugin style\n        player.addClass('vjs-wavesurfer');\n\n        // parse options\n        options = videojs.mergeOptions(pluginDefaultOptions, options);\n        this.waveReady = false;\n        this.waveFinished = false;\n        this.liveMode = false;\n        this.debug = (options.debug.toString() === 'true');\n        this.msDisplayMax = parseFloat(options.msDisplayMax);\n        this.textTracksEnabled = (this.player.options_.tracks.length > 0);\n\n        // microphone plugin\n        if (options.src === 'live') {\n            // check if the wavesurfer.js microphone plugin can be enabled\n            if (WaveSurfer.microphone !== undefined) {\n                // enable audio input from a microphone\n                this.liveMode = true;\n                this.waveReady = true;\n            } else {\n                this.onWaveError('Could not find wavesurfer.js ' +\n                    'microphone plugin!');\n                return;\n            }\n        }\n\n        // wait until player ui is ready\n        this.player.one('ready', this.initialize.bind(this));\n    }\n\n    /**\n     * Player UI is ready: customize controls.\n     */\n    initialize() {\n        // hide big play button\n        this.player.bigPlayButton.hide();\n\n        // the native controls don't work for this UI so disable\n        // them no matter what\n        if (this.player.usingNativeControls_ === true) {\n            if (this.player.tech_.el_ !== undefined) {\n                this.player.tech_.el_.controls = false;\n            }\n        }\n\n        // controls\n        if (this.player.options_.controls === true) {\n            // make sure controlBar is showing\n            this.player.controlBar.show();\n            this.player.controlBar.el_.style.display = 'flex';\n\n            // progress control isn't used by this plugin\n            this.player.controlBar.progressControl.hide();\n\n            // make sure time displays are visible\n            let uiElements = [\n                this.player.controlBar.currentTimeDisplay,\n                this.player.controlBar.timeDivider,\n                this.player.controlBar.durationDisplay\n            ];\n            uiElements.forEach((element) => {\n                // ignore and show when essential elements have been disabled\n                // by user\n                if (element !== undefined) {\n                    element.el_.style.display = 'block';\n                    element.show();\n                }\n            });\n            if (this.player.controlBar.remainingTimeDisplay !== undefined) {\n                this.player.controlBar.remainingTimeDisplay.hide();\n            }\n\n            // handle play toggle interaction\n            this.player.controlBar.playToggle.on(['tap', 'click'],\n                this.onPlayToggle.bind(this));\n\n            // disable play button until waveform is ready\n            // (except when in live mode)\n            if (!this.liveMode) {\n                this.player.controlBar.playToggle.hide();\n            }\n        }\n\n        // wavesurfer.js setup\n        let mergedOptions = this.parseOptions(this.player.options_.plugins.wavesurfer);\n        this.surfer = WaveSurfer.create(mergedOptions);\n        this.surfer.on('error', this.onWaveError.bind(this));\n        this.surfer.on('finish', this.onWaveFinish.bind(this));\n        if (this.liveMode === true) {\n            // listen for wavesurfer.js microphone plugin events\n            this.surfer.microphone.on('deviceError', this.onWaveError.bind(this));\n        }\n        this.surferReady = this.onWaveReady.bind(this);\n        this.surferProgress = this.onWaveProgress.bind(this);\n        this.surferSeek = this.onWaveSeek.bind(this);\n\n        // only listen to these wavesurfer.js playback events when not\n        // in live mode\n        if (!this.liveMode) {\n            this.setupPlaybackEvents(true);\n        }\n\n        // video.js player events\n        this.player.on('volumechange', this.onVolumeChange.bind(this));\n        this.player.on('fullscreenchange', this.onScreenChange.bind(this));\n\n        // make sure volume is muted when requested\n        if (this.player.muted()) {\n            this.setVolume(0);\n        }\n\n        // video.js fluid option\n        if (this.player.options_.fluid === true) {\n            // give wave element a classname so it can be styled\n            this.surfer.drawer.wrapper.className = wavesurferClassName;\n            // listen for window resize events\n            this.responsiveWave = WaveSurfer.util.debounce(\n                this.onResizeChange.bind(this), 150);\n            window.addEventListener('resize', this.responsiveWave);\n        }\n\n        // text tracks\n        if (this.textTracksEnabled) {\n            // disable timeupdates\n            this.player.controlBar.currentTimeDisplay.off(this.player, 'timeupdate',\n                this.player.controlBar.currentTimeDisplay.throttledUpdateContent);\n\n            // sets up an interval function to track current time\n            // and trigger timeupdate every 250 milliseconds.\n            // needed for text tracks\n            this.player.tech_.trackCurrentTime();\n        }\n\n        // kick things off\n        this.startPlayers();\n    }\n\n    /**\n     * Initializes the waveform options.\n     *\n     * @param {Object} surferOpts - Plugin options.\n     * @private\n     */\n    parseOptions(surferOpts) {\n        let rect = this.player.el_.getBoundingClientRect();\n        this.originalWidth = this.player.options_.width || rect.width;\n        this.originalHeight = this.player.options_.height || rect.height;\n\n        // controlbar\n        let controlBarHeight = this.player.controlBar.height();\n        if (this.player.options_.controls === true && controlBarHeight === 0) {\n            // the dimensions of the controlbar are not known yet, but we\n            // need it now, so we can calculate the height of the waveform.\n            // The default height is 30px, so use that instead.\n            controlBarHeight = 30;\n        }\n\n        // set waveform element and dimensions\n        // Set the container to player's container if \"container\" option is\n        // not provided. If a waveform needs to be appended to your custom\n        // element, then use below option. For example:\n        // container: document.querySelector(\"#vjs-waveform\")\n        if (surferOpts.container === undefined) {\n            surferOpts.container = this.player.el_;\n        }\n\n        // set the height of generated waveform if user has provided height\n        // from options. If height of waveform need to be customized then use\n        // option below. For example: waveformHeight: 30\n        if (surferOpts.waveformHeight === undefined) {\n            let playerHeight = rect.height;\n            surferOpts.height = playerHeight - controlBarHeight;\n        } else {\n            surferOpts.height = opts.waveformHeight;\n        }\n\n        // split channels\n        if (surferOpts.splitChannels && surferOpts.splitChannels === true) {\n            surferOpts.height /= 2;\n        }\n\n        // enable wavesurfer.js microphone plugin\n        if (this.liveMode === true) {\n            surferOpts.plugins = [\n                WaveSurfer.microphone.create(surferOpts)\n            ];\n            this.log('wavesurfer.js microphone plugin enabled.');\n        }\n\n        return surferOpts;\n    }\n\n    /**\n     * Start the players.\n     * @private\n     */\n    startPlayers() {\n        let options = this.player.options_.plugins.wavesurfer;\n        if (options.src !== undefined) {\n            if (this.surfer.microphone === undefined) {\n                // show loading spinner\n                this.player.loadingSpinner.show();\n\n                // start loading file\n                this.load(options.src, options.peaks);\n            } else {\n                // hide loading spinner\n                this.player.loadingSpinner.hide();\n\n                // connect microphone input to our waveform\n                options.wavesurfer = this.surfer;\n            }\n        } else {\n            // no valid src found, hide loading spinner\n            this.player.loadingSpinner.hide();\n        }\n    }\n\n    /**\n     * Starts or stops listening to events related to audio-playback.\n     *\n     * @param {boolean} enable - Start or stop listening to playback\n     *     related events.\n     * @private\n     */\n    setupPlaybackEvents(enable) {\n        if (enable === false) {\n            this.surfer.un('ready', this.surferReady);\n            this.surfer.un('audioprocess', this.surferProgress);\n            this.surfer.un('seek', this.surferSeek);\n        } else if (enable === true) {\n            this.surfer.on('ready', this.surferReady);\n            this.surfer.on('audioprocess', this.surferProgress);\n            this.surfer.on('seek', this.surferSeek);\n        }\n    }\n\n    /**\n     * Start loading waveform data.\n     *\n     * @param {string|blob|file} url - Either the URL of the audio file,\n     *     a Blob or a File object.\n     * @param {string|?number[]|number[][]} peaks - Either the URL of peaks\n     *     data for the audio file, or an array with peaks data.\n     */\n    load(url, peaks) {\n        if (url instanceof Blob || url instanceof File) {\n            this.log('Loading object: ' + JSON.stringify(url));\n            this.surfer.loadBlob(url);\n        } else {\n            // load peak data from file\n            if (peaks !== undefined) {\n                if (Array.isArray(peaks)) {\n                    // use supplied peaks data\n                    this.log('Loading URL: ' + url);\n                    this.surfer.load(url, peaks);\n                } else {\n                    // load peak data from file\n                    let ajaxOptions = {\n                        url: peaks,\n                        responseType: 'json'\n                    };\n                    // supply xhr options, if any\n                    if (this.player.options_.plugins.wavesurfer.xhr !== undefined) {\n                        ajaxOptions.xhr = this.player.options_.plugins.wavesurfer.xhr;\n                    }\n                    let ajax = WaveSurfer.util.ajax(ajaxOptions);\n\n                    ajax.on('success', (data, e) => {\n                        this.log('Loaded Peak Data URL: ' + peaks);\n                        this.surfer.load(url, data.data);\n                    });\n                    ajax.on('error', (e) => {\n                        this.log('Unable to retrieve peak data from ' + peaks +\n                            '. Status code: ' + e.target.status, 'warn');\n                        this.log('Loading URL: ' + url);\n                        this.surfer.load(url);\n                    });\n                }\n            } else {\n                // no peaks\n                this.log('Loading URL: ' + url);\n                this.surfer.load(url);\n            }\n        }\n    }\n\n    /**\n     * Start/resume playback or microphone.\n     */\n    play() {\n        // show pause button\n        this.player.controlBar.playToggle.handlePlay();\n\n        if (this.liveMode) {\n            // start/resume microphone visualization\n            if (!this.surfer.microphone.active)\n            {\n                this.log('Start microphone');\n                this.surfer.microphone.start();\n            } else {\n                // toggle paused\n                let paused = !this.surfer.microphone.paused;\n\n                if (paused) {\n                    this.pause();\n                } else {\n                    this.log('Resume microphone');\n                    this.surfer.microphone.play();\n                }\n            }\n        } else {\n            this.log('Start playback');\n\n            // put video.js player UI in playback mode\n            this.player.play();\n\n            // start surfer playback\n            this.surfer.play();\n        }\n    }\n\n    /**\n     * Pauses playback or microphone visualization.\n     */\n    pause() {\n        // show play button\n        if (this.player.controlBar.playToggle.contentEl()) {\n            this.player.controlBar.playToggle.handlePause();\n        }\n\n        if (this.liveMode) {\n            // pause microphone visualization\n            this.log('Pause microphone');\n            this.surfer.microphone.pause();\n        } else {\n            // pause playback\n            this.log('Pause playback');\n\n            if (!this.waveFinished) {\n                // pause wavesurfer playback\n                this.surfer.pause();\n            } else {\n                this.waveFinished = false;\n            }\n\n            this.setCurrentTime();\n        }\n    }\n\n    /**\n     * @private\n     */\n    dispose() {\n        if (this.surfer) {\n            if (this.liveMode && this.surfer.microphone) {\n                // destroy microphone plugin\n                this.surfer.microphone.destroy();\n                this.log('Destroyed microphone plugin');\n            }\n            // destroy wavesurfer instance\n            this.surfer.destroy();\n        }\n        if (this.textTracksEnabled) {\n            this.player.tech_.stopTrackingCurrentTime();\n        }\n        this.log('Destroyed plugin');\n    }\n\n    /**\n     * Indicates whether the plugin is destroyed or not.\n     *\n     * @return {boolean} Plugin destroyed or not.\n     */\n    isDestroyed() {\n        return this.player && (this.player.children() === null);\n    }\n\n    /**\n     * Remove the player and waveform.\n     */\n    destroy() {\n        this.player.dispose();\n    }\n\n    /**\n     * Set the volume level.\n     *\n     * @param {number} volume - The new volume level.\n     */\n    setVolume(volume) {\n        if (volume !== undefined) {\n            this.log('Changing volume to: ' + volume);\n\n            // update player volume\n            this.player.volume(volume);\n        }\n    }\n\n    /**\n     * Save waveform image as data URI.\n     *\n     * The default format is 'image/png'. Other supported types are\n     * 'image/jpeg' and 'image/webp'.\n     *\n     * @param {string} [format=image/png] - String indicating the image format.\n     * @param {number} [quality=1] - Number between 0 and 1 indicating image\n     *     quality if the requested type is 'image/jpeg' or 'image/webp'.\n     * @returns {string} The data URI of the image data.\n     */\n    exportImage(format, quality) {\n        return this.surfer.exportImage(format, quality);\n    }\n\n    /**\n     * Change the audio output device.\n     *\n     * @param {string} sinkId - Id of audio output device.\n     */\n    setAudioOutput(deviceId) {\n        if (deviceId) {\n            this.surfer.setSinkId(deviceId).then((result) => {\n                // notify listeners\n                this.player.trigger('audioOutputReady');\n            }).catch((err) => {\n                // notify listeners\n                this.player.trigger('error', err);\n\n                this.log(err, 'error');\n            });\n        }\n    }\n\n    /**\n     * Get the current time (in seconds) of the stream during playback.\n     *\n     * Returns 0 if no stream is available (yet).\n     */\n    getCurrentTime() {\n        let currentTime = this.surfer.getCurrentTime();\n        currentTime = isNaN(currentTime) ? 0 : currentTime;\n\n        return currentTime;\n    }\n\n    /**\n     * Updates the player's element displaying the current time.\n     *\n     * @param {number} [currentTime] - Current position of the playhead\n     *     (in seconds).\n     * @param {number} [duration] - Duration of the waveform (in seconds).\n     * @private\n     */\n    setCurrentTime(currentTime, duration) {\n        if (currentTime === undefined) {\n            currentTime = this.surfer.getCurrentTime();\n        }\n\n        if (duration === undefined) {\n            duration = this.surfer.getDuration();\n        }\n\n        currentTime = isNaN(currentTime) ? 0 : currentTime;\n        duration = isNaN(duration) ? 0 : duration;\n        let time = Math.min(currentTime, duration);\n\n        // update current time display component\n        if (this.player.controlBar.currentTimeDisplay.contentEl()) {\n            this.player.controlBar.currentTimeDisplay.formattedTime_ =\n                this.player.controlBar.currentTimeDisplay.contentEl().lastChild.textContent =\n                    formatTime(time, duration, this.msDisplayMax);\n        }\n\n        if (this.textTracksEnabled) {\n            // only needed for text tracks\n            this.player.tech_.setCurrentTime(currentTime);\n        }\n    }\n\n    /**\n     * Get the duration of the stream in seconds.\n     *\n     * Returns 0 if no stream is available (yet).\n     */\n    getDuration() {\n        let duration = this.surfer.getDuration();\n        duration = isNaN(duration) ? 0 : duration;\n\n        return duration;\n    }\n\n    /**\n     * Updates the player's element displaying the duration time.\n     *\n     * @param {number} [duration] - Duration of the waveform (in seconds).\n     * @private\n     */\n    setDuration(duration) {\n        if (duration === undefined) {\n            duration = this.surfer.getDuration();\n        }\n        duration = isNaN(duration) ? 0 : duration;\n\n        // update duration display component\n        if (this.player.controlBar.durationDisplay.contentEl()) {\n            this.player.controlBar.durationDisplay.formattedTime_ =\n                this.player.controlBar.durationDisplay.contentEl().lastChild.textContent =\n                    formatTime(duration, duration, this.msDisplayMax);\n        }\n    }\n\n    /**\n     * Audio is loaded, decoded and the waveform is drawn.\n     *\n     * @fires waveReady\n     * @private\n     */\n    onWaveReady() {\n        this.waveReady = true;\n        this.waveFinished = false;\n        this.liveMode = false;\n\n        this.log('Waveform is ready');\n        this.player.trigger('waveReady');\n\n        // update time display\n        this.setCurrentTime();\n        this.setDuration();\n\n        // enable and show play button\n        if (this.player.controlBar.playToggle.contentEl()) {\n            this.player.controlBar.playToggle.show();\n        }\n\n        // hide loading spinner\n        if (this.player.loadingSpinner.contentEl()) {\n            this.player.loadingSpinner.hide();\n        }\n\n        // auto-play when ready (if enabled)\n        if (this.player.options_.autoplay === true) {\n            this.play();\n        }\n    }\n\n    /**\n     * Fires when audio playback completed.\n     *\n     * @fires playbackFinish\n     * @private\n     */\n    onWaveFinish() {\n        this.log('Finished playback');\n\n        // notify listeners\n        this.player.trigger('playbackFinish');\n\n        // check if loop is enabled\n        if (this.player.options_.loop === true) {\n            // reset waveform\n            this.surfer.stop();\n            this.play();\n        } else {\n            // finished\n            this.waveFinished = true;\n\n            // pause player\n            this.pause();\n\n            // show the replay state of play toggle\n            this.player.trigger('ended');\n\n            // this gets called once after the clip has ended and the user\n            // seeks so that we can change the replay button back to a play\n            // button\n            this.surfer.once('seek', () => {\n                this.player.controlBar.playToggle.removeClass('vjs-ended');\n                this.player.trigger('pause');\n            });\n        }\n    }\n\n    /**\n     * Fires continuously during audio playback.\n     *\n     * @param {number} time - Current time/location of the playhead.\n     * @private\n     */\n    onWaveProgress(time) {\n        this.setCurrentTime();\n    }\n\n    /**\n     * Fires during seeking of the waveform.\n     * @private\n     */\n    onWaveSeek() {\n        this.setCurrentTime();\n    }\n\n    /**\n     * Waveform error.\n     *\n     * @param {string} error - The wavesurfer error.\n     * @private\n     */\n    onWaveError(error) {\n        // notify listeners\n        this.player.trigger('error', error);\n\n        this.log(error, 'error');\n    }\n\n    /**\n     * Fired when the play toggle is clicked.\n     * @private\n     */\n    onPlayToggle() {\n        // workaround for video.js 6.3.1 and newer\n        if (this.player.controlBar.playToggle.hasClass('vjs-ended')) {\n            this.player.controlBar.playToggle.removeClass('vjs-ended');\n        }\n        if (this.surfer.isPlaying()) {\n            this.pause();\n        } else {\n            this.play();\n        }\n    }\n\n    /**\n     * Fired when the volume in the video.js player changes.\n     * @private\n     */\n    onVolumeChange() {\n        let volume = this.player.volume();\n        if (this.player.muted()) {\n            // muted volume\n            volume = 0;\n        }\n\n        // update wavesurfer.js volume\n        this.surfer.setVolume(volume);\n    }\n\n    /**\n     * Fired when the video.js player switches in or out of fullscreen mode.\n     * @private\n     */\n    onScreenChange() {\n        // execute with tiny delay so the player element completes\n        // rendering and correct dimensions are reported\n        var fullscreenDelay = this.player.setInterval(() => {\n            let isFullscreen = this.player.isFullscreen();\n            let newWidth, newHeight;\n            if (!isFullscreen) {\n                // restore original dimensions\n                newWidth = this.originalWidth;\n                newHeight = this.originalHeight;\n            }\n\n            if (this.waveReady) {\n                if (this.liveMode && !this.surfer.microphone.active) {\n                    // we're in live mode but the microphone hasn't been\n                    // started yet\n                    return;\n                }\n                // redraw\n                this.redrawWaveform(newWidth, newHeight);\n            }\n\n            // stop fullscreenDelay interval\n            this.player.clearInterval(fullscreenDelay);\n\n        }, 100);\n    }\n\n    /**\n     * Fired when the video.js player is resized.\n     *\n     * @private\n     */\n    onResizeChange() {\n        if (this.surfer !== undefined) {\n            // redraw waveform\n            this.redrawWaveform();\n        }\n    }\n\n    /**\n     * Redraw waveform.\n     *\n     * @param {number} [newWidth] - New width for the waveform.\n     * @param {number} [newHeight] - New height for the waveform.\n     * @private\n     */\n    redrawWaveform(newWidth, newHeight) {\n        if (!this.isDestroyed()) {\n            if (this.player.el_) {\n                let rect = this.player.el_.getBoundingClientRect();\n                if (newWidth === undefined) {\n                    // get player width\n                    newWidth = rect.width;\n                }\n                if (newHeight === undefined) {\n                    // get player height\n                    newHeight = rect.height;\n                }\n            }\n\n            // destroy old drawing\n            this.surfer.drawer.destroy();\n\n            // set new dimensions\n            this.surfer.params.width = newWidth;\n            this.surfer.params.height = newHeight - this.player.controlBar.height();\n\n            // redraw waveform\n            this.surfer.createDrawer();\n            this.surfer.drawer.wrapper.className = wavesurferClassName;\n            this.surfer.drawBuffer();\n\n            // make sure playhead is restored at right position\n            this.surfer.drawer.progress(this.surfer.backend.getPlayedPercents());\n        }\n    }\n\n    /**\n     * @private\n     */\n    log(args, logType) {\n        log(args, logType, this.debug);\n    }\n}\n\n// version nr is injected during build\nWavesurfer.VERSION = __VERSION__;\n\n// register plugin once\nvideojs.Wavesurfer = Wavesurfer;\nif (videojs.getPlugin('wavesurfer') === undefined) {\n    videojs.registerPlugin('wavesurfer', Wavesurfer);\n}\n\nmodule.exports = {\n    Wavesurfer\n};\n","module.exports = __WEBPACK_EXTERNAL_MODULE_video_js__;","module.exports = __WEBPACK_EXTERNAL_MODULE_wavesurfer_js__;"],"sourceRoot":""}
\ No newline at end of file diff --git a/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.min.js b/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.min.js new file mode 100644 index 0000000..fb97f62 --- /dev/null +++ b/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.min.js @@ -0,0 +1,9 @@ +/*! + * videojs-wavesurfer + * @version 2.5.1 + * @see https://github.com/collab-project/videojs-wavesurfer + * @copyright 2014-2018 Collab + * @license MIT + */ +!function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r(require("videojs"),require("WaveSurfer")):"function"==typeof define&&define.amd?define("VideojsWavesurfer",["videojs","WaveSurfer"],r):"object"==typeof exports?exports.VideojsWavesurfer=r(require("videojs"),require("WaveSurfer")):e.VideojsWavesurfer=r(e.videojs,e.WaveSurfer)}(window,function(e,r){return function(e){var r={};function t(i){if(r[i])return r[i].exports;var s=r[i]={i:i,l:!1,exports:{}};return e[i].call(s.exports,s,s.exports,t),s.l=!0,s.exports}return t.m=e,t.c=r,t.d=function(e,r,i){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:i})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var s in e)t.d(i,s,function(r){return e[r]}.bind(null,s));return i},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=0)}([function(e,r,t){t(1),e.exports=t(9)},function(e,r,t){"use strict";var i=function(){function e(e,r){for(var t=0;t<r.length;t++){var i=r[t];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(r,t,i){return t&&e(r.prototype,t),i&&e(r,i),r}}(),s=h(t(2)),o=h(t(3)),a=h(t(4)),n=h(t(5)),l=h(t(7)),u=h(t(8));function h(e){return e&&e.__esModule?e:{default:e}}function p(e,r){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!r||"object"!=typeof r&&"function"!=typeof r?e:r}var f=l.default.getPlugin("plugin"),d=function(e){function r(e,t){!function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}(this,r);var i=p(this,(r.__proto__||Object.getPrototypeOf(r)).call(this,e,t));if(e.addClass("vjs-wavesurfer"),t=l.default.mergeOptions(a.default,t),i.waveReady=!1,i.waveFinished=!1,i.liveMode=!1,i.debug="true"===t.debug.toString(),i.msDisplayMax=parseFloat(t.msDisplayMax),i.textTracksEnabled=i.player.options_.tracks.length>0,"live"===t.src){if(void 0===u.default.microphone)return i.onWaveError("Could not find wavesurfer.js microphone plugin!"),p(i);i.liveMode=!0,i.waveReady=!0}return i.player.one("ready",i.initialize.bind(i)),i}return function(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Super expression must either be null or a function, not "+typeof r);e.prototype=Object.create(r&&r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),r&&(Object.setPrototypeOf?Object.setPrototypeOf(e,r):e.__proto__=r)}(r,f),i(r,[{key:"initialize",value:function(){(this.player.bigPlayButton.hide(),!0===this.player.usingNativeControls_&&void 0!==this.player.tech_.el_&&(this.player.tech_.el_.controls=!1),!0===this.player.options_.controls)&&(this.player.controlBar.show(),this.player.controlBar.el_.style.display="flex",this.player.controlBar.progressControl.hide(),[this.player.controlBar.currentTimeDisplay,this.player.controlBar.timeDivider,this.player.controlBar.durationDisplay].forEach(function(e){void 0!==e&&(e.el_.style.display="block",e.show())}),void 0!==this.player.controlBar.remainingTimeDisplay&&this.player.controlBar.remainingTimeDisplay.hide(),this.player.controlBar.playToggle.on(["tap","click"],this.onPlayToggle.bind(this)),this.liveMode||this.player.controlBar.playToggle.hide());var e=this.parseOptions(this.player.options_.plugins.wavesurfer);this.surfer=u.default.create(e),this.surfer.on("error",this.onWaveError.bind(this)),this.surfer.on("finish",this.onWaveFinish.bind(this)),!0===this.liveMode&&this.surfer.microphone.on("deviceError",this.onWaveError.bind(this)),this.surferReady=this.onWaveReady.bind(this),this.surferProgress=this.onWaveProgress.bind(this),this.surferSeek=this.onWaveSeek.bind(this),this.liveMode||this.setupPlaybackEvents(!0),this.player.on("volumechange",this.onVolumeChange.bind(this)),this.player.on("fullscreenchange",this.onScreenChange.bind(this)),this.player.muted()&&this.setVolume(0),!0===this.player.options_.fluid&&(this.surfer.drawer.wrapper.className="vjs-wavedisplay",this.responsiveWave=u.default.util.debounce(this.onResizeChange.bind(this),150),n.default.addEventListener("resize",this.responsiveWave)),this.textTracksEnabled&&(this.player.controlBar.currentTimeDisplay.off(this.player,"timeupdate",this.player.controlBar.currentTimeDisplay.throttledUpdateContent),this.player.tech_.trackCurrentTime()),this.startPlayers()}},{key:"parseOptions",value:function(e){var r=this.player.el_.getBoundingClientRect();this.originalWidth=this.player.options_.width||r.width,this.originalHeight=this.player.options_.height||r.height;var t=this.player.controlBar.height();if(!0===this.player.options_.controls&&0===t&&(t=30),void 0===e.container&&(e.container=this.player.el_),void 0===e.waveformHeight){var i=r.height;e.height=i-t}else e.height=opts.waveformHeight;return e.splitChannels&&!0===e.splitChannels&&(e.height/=2),!0===this.liveMode&&(e.plugins=[u.default.microphone.create(e)],this.log("wavesurfer.js microphone plugin enabled.")),e}},{key:"startPlayers",value:function(){var e=this.player.options_.plugins.wavesurfer;void 0!==e.src?void 0===this.surfer.microphone?(this.player.loadingSpinner.show(),this.load(e.src,e.peaks)):(this.player.loadingSpinner.hide(),e.wavesurfer=this.surfer):this.player.loadingSpinner.hide()}},{key:"setupPlaybackEvents",value:function(e){!1===e?(this.surfer.un("ready",this.surferReady),this.surfer.un("audioprocess",this.surferProgress),this.surfer.un("seek",this.surferSeek)):!0===e&&(this.surfer.on("ready",this.surferReady),this.surfer.on("audioprocess",this.surferProgress),this.surfer.on("seek",this.surferSeek))}},{key:"load",value:function(e,r){var t=this;if(e instanceof Blob||e instanceof File)this.log("Loading object: "+JSON.stringify(e)),this.surfer.loadBlob(e);else if(void 0!==r)if(Array.isArray(r))this.log("Loading URL: "+e),this.surfer.load(e,r);else{var i={url:r,responseType:"json"};void 0!==this.player.options_.plugins.wavesurfer.xhr&&(i.xhr=this.player.options_.plugins.wavesurfer.xhr);var s=u.default.util.ajax(i);s.on("success",function(i,s){t.log("Loaded Peak Data URL: "+r),t.surfer.load(e,i.data)}),s.on("error",function(i){t.log("Unable to retrieve peak data from "+r+". Status code: "+i.target.status,"warn"),t.log("Loading URL: "+e),t.surfer.load(e)})}else this.log("Loading URL: "+e),this.surfer.load(e)}},{key:"play",value:function(){(this.player.controlBar.playToggle.handlePlay(),this.liveMode)?this.surfer.microphone.active?!this.surfer.microphone.paused?this.pause():(this.log("Resume microphone"),this.surfer.microphone.play()):(this.log("Start microphone"),this.surfer.microphone.start()):(this.log("Start playback"),this.player.play(),this.surfer.play())}},{key:"pause",value:function(){this.player.controlBar.playToggle.contentEl()&&this.player.controlBar.playToggle.handlePause(),this.liveMode?(this.log("Pause microphone"),this.surfer.microphone.pause()):(this.log("Pause playback"),this.waveFinished?this.waveFinished=!1:this.surfer.pause(),this.setCurrentTime())}},{key:"dispose",value:function(){this.surfer&&(this.liveMode&&this.surfer.microphone&&(this.surfer.microphone.destroy(),this.log("Destroyed microphone plugin")),this.surfer.destroy()),this.textTracksEnabled&&this.player.tech_.stopTrackingCurrentTime(),this.log("Destroyed plugin")}},{key:"isDestroyed",value:function(){return this.player&&null===this.player.children()}},{key:"destroy",value:function(){this.player.dispose()}},{key:"setVolume",value:function(e){void 0!==e&&(this.log("Changing volume to: "+e),this.player.volume(e))}},{key:"exportImage",value:function(e,r){return this.surfer.exportImage(e,r)}},{key:"setAudioOutput",value:function(e){var r=this;e&&this.surfer.setSinkId(e).then(function(e){r.player.trigger("audioOutputReady")}).catch(function(e){r.player.trigger("error",e),r.log(e,"error")})}},{key:"getCurrentTime",value:function(){var e=this.surfer.getCurrentTime();return e=isNaN(e)?0:e}},{key:"setCurrentTime",value:function(e,r){void 0===e&&(e=this.surfer.getCurrentTime()),void 0===r&&(r=this.surfer.getDuration()),e=isNaN(e)?0:e,r=isNaN(r)?0:r;var t=Math.min(e,r);this.player.controlBar.currentTimeDisplay.contentEl()&&(this.player.controlBar.currentTimeDisplay.formattedTime_=this.player.controlBar.currentTimeDisplay.contentEl().lastChild.textContent=(0,o.default)(t,r,this.msDisplayMax)),this.textTracksEnabled&&this.player.tech_.setCurrentTime(e)}},{key:"getDuration",value:function(){var e=this.surfer.getDuration();return e=isNaN(e)?0:e}},{key:"setDuration",value:function(e){void 0===e&&(e=this.surfer.getDuration()),e=isNaN(e)?0:e,this.player.controlBar.durationDisplay.contentEl()&&(this.player.controlBar.durationDisplay.formattedTime_=this.player.controlBar.durationDisplay.contentEl().lastChild.textContent=(0,o.default)(e,e,this.msDisplayMax))}},{key:"onWaveReady",value:function(){this.waveReady=!0,this.waveFinished=!1,this.liveMode=!1,this.log("Waveform is ready"),this.player.trigger("waveReady"),this.setCurrentTime(),this.setDuration(),this.player.controlBar.playToggle.contentEl()&&this.player.controlBar.playToggle.show(),this.player.loadingSpinner.contentEl()&&this.player.loadingSpinner.hide(),!0===this.player.options_.autoplay&&this.play()}},{key:"onWaveFinish",value:function(){var e=this;this.log("Finished playback"),this.player.trigger("playbackFinish"),!0===this.player.options_.loop?(this.surfer.stop(),this.play()):(this.waveFinished=!0,this.pause(),this.player.trigger("ended"),this.surfer.once("seek",function(){e.player.controlBar.playToggle.removeClass("vjs-ended"),e.player.trigger("pause")}))}},{key:"onWaveProgress",value:function(e){this.setCurrentTime()}},{key:"onWaveSeek",value:function(){this.setCurrentTime()}},{key:"onWaveError",value:function(e){this.player.trigger("error",e),this.log(e,"error")}},{key:"onPlayToggle",value:function(){this.player.controlBar.playToggle.hasClass("vjs-ended")&&this.player.controlBar.playToggle.removeClass("vjs-ended"),this.surfer.isPlaying()?this.pause():this.play()}},{key:"onVolumeChange",value:function(){var e=this.player.volume();this.player.muted()&&(e=0),this.surfer.setVolume(e)}},{key:"onScreenChange",value:function(){var e=this,r=this.player.setInterval(function(){var t=void 0,i=void 0;if(e.player.isFullscreen()||(t=e.originalWidth,i=e.originalHeight),e.waveReady){if(e.liveMode&&!e.surfer.microphone.active)return;e.redrawWaveform(t,i)}e.player.clearInterval(r)},100)}},{key:"onResizeChange",value:function(){void 0!==this.surfer&&this.redrawWaveform()}},{key:"redrawWaveform",value:function(e,r){if(!this.isDestroyed()){if(this.player.el_){var t=this.player.el_.getBoundingClientRect();void 0===e&&(e=t.width),void 0===r&&(r=t.height)}this.surfer.drawer.destroy(),this.surfer.params.width=e,this.surfer.params.height=r-this.player.controlBar.height(),this.surfer.createDrawer(),this.surfer.drawer.wrapper.className="vjs-wavedisplay",this.surfer.drawBuffer(),this.surfer.drawer.progress(this.surfer.backend.getPlayedPercents())}}},{key:"log",value:function(e,r){(0,s.default)(e,r,this.debug)}}]),r}();d.VERSION="2.5.1",l.default.Wavesurfer=d,void 0===l.default.getPlugin("wavesurfer")&&l.default.registerPlugin("wavesurfer",d),e.exports={Wavesurfer:d}},function(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.default=function(e,r,t){!0===t&&("error"===r?videojs.log.error(e):"warn"===r?videojs.log.warn(e):videojs.log(e))},e.exports=r.default},function(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.default=function(e,r,t){e=e<0?0:e,r=r||e;var i=Math.floor(e%60),s=Math.floor(e/60%60),o=Math.floor(e/3600),a=Math.floor(r/60%60),n=Math.floor(r/3600),l=Math.floor(1e3*(e-i));return(isNaN(e)||e===1/0)&&(o=s=i=l="-"),r>0&&r<t?(l<100&&(l=l<10?"00"+l:"0"+l),l=":"+l):l="",(o=o>0||n>0?o+":":"")+(s=((o||a>=10)&&s<10?"0"+s:s)+":")+(i=i<10?"0"+i:i)+l},e.exports=r.default},function(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.default={debug:!1,msDisplayMax:3},e.exports=r.default},function(e,r,t){(function(r){var t;t="undefined"!=typeof window?window:void 0!==r?r:"undefined"!=typeof self?self:{},e.exports=t}).call(this,t(6))},function(e,r){var t;t=function(){return this}();try{t=t||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(t=window)}e.exports=t},function(r,t){r.exports=e},function(e,t){e.exports=r},function(e,r,t){}])}); +//# sourceMappingURL=videojs.wavesurfer.min.js.map
\ No newline at end of file diff --git a/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.min.js.map b/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.min.js.map new file mode 100644 index 0000000..f5219af --- /dev/null +++ b/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://VideojsWavesurfer/webpack/universalModuleDefinition","webpack://VideojsWavesurfer/webpack/bootstrap","webpack://VideojsWavesurfer/./src/js/videojs.wavesurfer.js","webpack://VideojsWavesurfer/./src/js/utils/log.js","webpack://VideojsWavesurfer/./src/js/utils/format-time.js","webpack://VideojsWavesurfer/./src/js/defaults.js","webpack://VideojsWavesurfer/./node_modules/global/window.js","webpack://VideojsWavesurfer/(webpack)/buildin/global.js","webpack://VideojsWavesurfer/external \"videojs\"","webpack://VideojsWavesurfer/external \"WaveSurfer\""],"names":["root","factory","exports","module","require","define","amd","window","__WEBPACK_EXTERNAL_MODULE__7__","__WEBPACK_EXTERNAL_MODULE__8__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Plugin","_video2","default","getPlugin","Wavesurfer","player","options","_classCallCheck","this","_this","_possibleConstructorReturn","__proto__","getPrototypeOf","addClass","mergeOptions","_defaults2","waveReady","waveFinished","liveMode","debug","toString","msDisplayMax","parseFloat","textTracksEnabled","options_","tracks","length","src","undefined","_wavesurfer2","microphone","onWaveError","one","initialize","bigPlayButton","hide","usingNativeControls_","tech_","el_","controls","controlBar","show","style","display","progressControl","currentTimeDisplay","timeDivider","durationDisplay","forEach","element","remainingTimeDisplay","playToggle","on","onPlayToggle","mergedOptions","parseOptions","plugins","wavesurfer","surfer","onWaveFinish","surferReady","onWaveReady","surferProgress","onWaveProgress","surferSeek","onWaveSeek","setupPlaybackEvents","onVolumeChange","onScreenChange","muted","setVolume","fluid","drawer","wrapper","className","responsiveWave","util","debounce","onResizeChange","_window2","addEventListener","off","throttledUpdateContent","trackCurrentTime","startPlayers","surferOpts","rect","getBoundingClientRect","originalWidth","width","originalHeight","height","controlBarHeight","container","waveformHeight","playerHeight","opts","splitChannels","log","loadingSpinner","load","peaks","enable","un","url","_this2","Blob","File","JSON","stringify","loadBlob","Array","isArray","ajaxOptions","responseType","xhr","ajax","data","e","target","status","handlePlay","active","paused","pause","play","start","contentEl","handlePause","setCurrentTime","destroy","stopTrackingCurrentTime","children","dispose","volume","format","quality","exportImage","deviceId","_this3","setSinkId","then","result","trigger","catch","err","currentTime","getCurrentTime","isNaN","duration","getDuration","time","Math","min","formattedTime_","lastChild","textContent","_formatTime2","setDuration","autoplay","_this4","loop","stop","once","removeClass","error","hasClass","isPlaying","_this5","fullscreenDelay","setInterval","newWidth","newHeight","isFullscreen","redrawWaveform","clearInterval","isDestroyed","params","createDrawer","drawBuffer","progress","backend","getPlayedPercents","args","logType","_log3","VERSION","registerPlugin","videojs","warn","seconds","guide","floor","h","gm","gh","ms","Infinity","global","win","self","g","Function","eval"],"mappings":"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","file":"videojs.wavesurfer.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"videojs\"), require(\"WaveSurfer\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"VideojsWavesurfer\", [\"videojs\", \"WaveSurfer\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VideojsWavesurfer\"] = factory(require(\"videojs\"), require(\"WaveSurfer\"));\n\telse\n\t\troot[\"VideojsWavesurfer\"] = factory(root[\"videojs\"], root[\"WaveSurfer\"]);\n})(window, function(__WEBPACK_EXTERNAL_MODULE__7__, __WEBPACK_EXTERNAL_MODULE__8__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/**\n * @file videojs.wavesurfer.js\n *\n * The main file for the videojs-wavesurfer project.\n * MIT license: https://github.com/collab-project/videojs-wavesurfer/blob/master/LICENSE\n */\n\nimport log from './utils/log';\nimport formatTime from './utils/format-time';\nimport pluginDefaultOptions from './defaults';\nimport window from 'global/window';\n\nimport videojs from 'video.js';\nimport WaveSurfer from 'wavesurfer.js';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nconst wavesurferClassName = 'vjs-wavedisplay';\n\n/**\n * Draw a waveform for audio and video files in a video.js player.\n *\n * @class Wavesurfer\n * @extends videojs.Plugin\n */\nclass Wavesurfer extends Plugin {\n    /**\n     * The constructor function for the class.\n     *\n     * @param {(videojs.Player|Object)} player\n     * @param {Object} options - Player options.\n     */\n    constructor(player, options) {\n        super(player, options);\n\n        // add plugin style\n        player.addClass('vjs-wavesurfer');\n\n        // parse options\n        options = videojs.mergeOptions(pluginDefaultOptions, options);\n        this.waveReady = false;\n        this.waveFinished = false;\n        this.liveMode = false;\n        this.debug = (options.debug.toString() === 'true');\n        this.msDisplayMax = parseFloat(options.msDisplayMax);\n        this.textTracksEnabled = (this.player.options_.tracks.length > 0);\n\n        // microphone plugin\n        if (options.src === 'live') {\n            // check if the wavesurfer.js microphone plugin can be enabled\n            if (WaveSurfer.microphone !== undefined) {\n                // enable audio input from a microphone\n                this.liveMode = true;\n                this.waveReady = true;\n            } else {\n                this.onWaveError('Could not find wavesurfer.js ' +\n                    'microphone plugin!');\n                return;\n            }\n        }\n\n        // wait until player ui is ready\n        this.player.one('ready', this.initialize.bind(this));\n    }\n\n    /**\n     * Player UI is ready: customize controls.\n     */\n    initialize() {\n        // hide big play button\n        this.player.bigPlayButton.hide();\n\n        // the native controls don't work for this UI so disable\n        // them no matter what\n        if (this.player.usingNativeControls_ === true) {\n            if (this.player.tech_.el_ !== undefined) {\n                this.player.tech_.el_.controls = false;\n            }\n        }\n\n        // controls\n        if (this.player.options_.controls === true) {\n            // make sure controlBar is showing\n            this.player.controlBar.show();\n            this.player.controlBar.el_.style.display = 'flex';\n\n            // progress control isn't used by this plugin\n            this.player.controlBar.progressControl.hide();\n\n            // make sure time displays are visible\n            let uiElements = [\n                this.player.controlBar.currentTimeDisplay,\n                this.player.controlBar.timeDivider,\n                this.player.controlBar.durationDisplay\n            ];\n            uiElements.forEach((element) => {\n                // ignore and show when essential elements have been disabled\n                // by user\n                if (element !== undefined) {\n                    element.el_.style.display = 'block';\n                    element.show();\n                }\n            });\n            if (this.player.controlBar.remainingTimeDisplay !== undefined) {\n                this.player.controlBar.remainingTimeDisplay.hide();\n            }\n\n            // handle play toggle interaction\n            this.player.controlBar.playToggle.on(['tap', 'click'],\n                this.onPlayToggle.bind(this));\n\n            // disable play button until waveform is ready\n            // (except when in live mode)\n            if (!this.liveMode) {\n                this.player.controlBar.playToggle.hide();\n            }\n        }\n\n        // wavesurfer.js setup\n        let mergedOptions = this.parseOptions(this.player.options_.plugins.wavesurfer);\n        this.surfer = WaveSurfer.create(mergedOptions);\n        this.surfer.on('error', this.onWaveError.bind(this));\n        this.surfer.on('finish', this.onWaveFinish.bind(this));\n        if (this.liveMode === true) {\n            // listen for wavesurfer.js microphone plugin events\n            this.surfer.microphone.on('deviceError', this.onWaveError.bind(this));\n        }\n        this.surferReady = this.onWaveReady.bind(this);\n        this.surferProgress = this.onWaveProgress.bind(this);\n        this.surferSeek = this.onWaveSeek.bind(this);\n\n        // only listen to these wavesurfer.js playback events when not\n        // in live mode\n        if (!this.liveMode) {\n            this.setupPlaybackEvents(true);\n        }\n\n        // video.js player events\n        this.player.on('volumechange', this.onVolumeChange.bind(this));\n        this.player.on('fullscreenchange', this.onScreenChange.bind(this));\n\n        // make sure volume is muted when requested\n        if (this.player.muted()) {\n            this.setVolume(0);\n        }\n\n        // video.js fluid option\n        if (this.player.options_.fluid === true) {\n            // give wave element a classname so it can be styled\n            this.surfer.drawer.wrapper.className = wavesurferClassName;\n            // listen for window resize events\n            this.responsiveWave = WaveSurfer.util.debounce(\n                this.onResizeChange.bind(this), 150);\n            window.addEventListener('resize', this.responsiveWave);\n        }\n\n        // text tracks\n        if (this.textTracksEnabled) {\n            // disable timeupdates\n            this.player.controlBar.currentTimeDisplay.off(this.player, 'timeupdate',\n                this.player.controlBar.currentTimeDisplay.throttledUpdateContent);\n\n            // sets up an interval function to track current time\n            // and trigger timeupdate every 250 milliseconds.\n            // needed for text tracks\n            this.player.tech_.trackCurrentTime();\n        }\n\n        // kick things off\n        this.startPlayers();\n    }\n\n    /**\n     * Initializes the waveform options.\n     *\n     * @param {Object} surferOpts - Plugin options.\n     * @private\n     */\n    parseOptions(surferOpts) {\n        let rect = this.player.el_.getBoundingClientRect();\n        this.originalWidth = this.player.options_.width || rect.width;\n        this.originalHeight = this.player.options_.height || rect.height;\n\n        // controlbar\n        let controlBarHeight = this.player.controlBar.height();\n        if (this.player.options_.controls === true && controlBarHeight === 0) {\n            // the dimensions of the controlbar are not known yet, but we\n            // need it now, so we can calculate the height of the waveform.\n            // The default height is 30px, so use that instead.\n            controlBarHeight = 30;\n        }\n\n        // set waveform element and dimensions\n        // Set the container to player's container if \"container\" option is\n        // not provided. If a waveform needs to be appended to your custom\n        // element, then use below option. For example:\n        // container: document.querySelector(\"#vjs-waveform\")\n        if (surferOpts.container === undefined) {\n            surferOpts.container = this.player.el_;\n        }\n\n        // set the height of generated waveform if user has provided height\n        // from options. If height of waveform need to be customized then use\n        // option below. For example: waveformHeight: 30\n        if (surferOpts.waveformHeight === undefined) {\n            let playerHeight = rect.height;\n            surferOpts.height = playerHeight - controlBarHeight;\n        } else {\n            surferOpts.height = opts.waveformHeight;\n        }\n\n        // split channels\n        if (surferOpts.splitChannels && surferOpts.splitChannels === true) {\n            surferOpts.height /= 2;\n        }\n\n        // enable wavesurfer.js microphone plugin\n        if (this.liveMode === true) {\n            surferOpts.plugins = [\n                WaveSurfer.microphone.create(surferOpts)\n            ];\n            this.log('wavesurfer.js microphone plugin enabled.');\n        }\n\n        return surferOpts;\n    }\n\n    /**\n     * Start the players.\n     * @private\n     */\n    startPlayers() {\n        let options = this.player.options_.plugins.wavesurfer;\n        if (options.src !== undefined) {\n            if (this.surfer.microphone === undefined) {\n                // show loading spinner\n                this.player.loadingSpinner.show();\n\n                // start loading file\n                this.load(options.src, options.peaks);\n            } else {\n                // hide loading spinner\n                this.player.loadingSpinner.hide();\n\n                // connect microphone input to our waveform\n                options.wavesurfer = this.surfer;\n            }\n        } else {\n            // no valid src found, hide loading spinner\n            this.player.loadingSpinner.hide();\n        }\n    }\n\n    /**\n     * Starts or stops listening to events related to audio-playback.\n     *\n     * @param {boolean} enable - Start or stop listening to playback\n     *     related events.\n     * @private\n     */\n    setupPlaybackEvents(enable) {\n        if (enable === false) {\n            this.surfer.un('ready', this.surferReady);\n            this.surfer.un('audioprocess', this.surferProgress);\n            this.surfer.un('seek', this.surferSeek);\n        } else if (enable === true) {\n            this.surfer.on('ready', this.surferReady);\n            this.surfer.on('audioprocess', this.surferProgress);\n            this.surfer.on('seek', this.surferSeek);\n        }\n    }\n\n    /**\n     * Start loading waveform data.\n     *\n     * @param {string|blob|file} url - Either the URL of the audio file,\n     *     a Blob or a File object.\n     * @param {string|?number[]|number[][]} peaks - Either the URL of peaks\n     *     data for the audio file, or an array with peaks data.\n     */\n    load(url, peaks) {\n        if (url instanceof Blob || url instanceof File) {\n            this.log('Loading object: ' + JSON.stringify(url));\n            this.surfer.loadBlob(url);\n        } else {\n            // load peak data from file\n            if (peaks !== undefined) {\n                if (Array.isArray(peaks)) {\n                    // use supplied peaks data\n                    this.log('Loading URL: ' + url);\n                    this.surfer.load(url, peaks);\n                } else {\n                    // load peak data from file\n                    let ajaxOptions = {\n                        url: peaks,\n                        responseType: 'json'\n                    };\n                    // supply xhr options, if any\n                    if (this.player.options_.plugins.wavesurfer.xhr !== undefined) {\n                        ajaxOptions.xhr = this.player.options_.plugins.wavesurfer.xhr;\n                    }\n                    let ajax = WaveSurfer.util.ajax(ajaxOptions);\n\n                    ajax.on('success', (data, e) => {\n                        this.log('Loaded Peak Data URL: ' + peaks);\n                        this.surfer.load(url, data.data);\n                    });\n                    ajax.on('error', (e) => {\n                        this.log('Unable to retrieve peak data from ' + peaks +\n                            '. Status code: ' + e.target.status, 'warn');\n                        this.log('Loading URL: ' + url);\n                        this.surfer.load(url);\n                    });\n                }\n            } else {\n                // no peaks\n                this.log('Loading URL: ' + url);\n                this.surfer.load(url);\n            }\n        }\n    }\n\n    /**\n     * Start/resume playback or microphone.\n     */\n    play() {\n        // show pause button\n        this.player.controlBar.playToggle.handlePlay();\n\n        if (this.liveMode) {\n            // start/resume microphone visualization\n            if (!this.surfer.microphone.active)\n            {\n                this.log('Start microphone');\n                this.surfer.microphone.start();\n            } else {\n                // toggle paused\n                let paused = !this.surfer.microphone.paused;\n\n                if (paused) {\n                    this.pause();\n                } else {\n                    this.log('Resume microphone');\n                    this.surfer.microphone.play();\n                }\n            }\n        } else {\n            this.log('Start playback');\n\n            // put video.js player UI in playback mode\n            this.player.play();\n\n            // start surfer playback\n            this.surfer.play();\n        }\n    }\n\n    /**\n     * Pauses playback or microphone visualization.\n     */\n    pause() {\n        // show play button\n        if (this.player.controlBar.playToggle.contentEl()) {\n            this.player.controlBar.playToggle.handlePause();\n        }\n\n        if (this.liveMode) {\n            // pause microphone visualization\n            this.log('Pause microphone');\n            this.surfer.microphone.pause();\n        } else {\n            // pause playback\n            this.log('Pause playback');\n\n            if (!this.waveFinished) {\n                // pause wavesurfer playback\n                this.surfer.pause();\n            } else {\n                this.waveFinished = false;\n            }\n\n            this.setCurrentTime();\n        }\n    }\n\n    /**\n     * @private\n     */\n    dispose() {\n        if (this.surfer) {\n            if (this.liveMode && this.surfer.microphone) {\n                // destroy microphone plugin\n                this.surfer.microphone.destroy();\n                this.log('Destroyed microphone plugin');\n            }\n            // destroy wavesurfer instance\n            this.surfer.destroy();\n        }\n        if (this.textTracksEnabled) {\n            this.player.tech_.stopTrackingCurrentTime();\n        }\n        this.log('Destroyed plugin');\n    }\n\n    /**\n     * Indicates whether the plugin is destroyed or not.\n     *\n     * @return {boolean} Plugin destroyed or not.\n     */\n    isDestroyed() {\n        return this.player && (this.player.children() === null);\n    }\n\n    /**\n     * Remove the player and waveform.\n     */\n    destroy() {\n        this.player.dispose();\n    }\n\n    /**\n     * Set the volume level.\n     *\n     * @param {number} volume - The new volume level.\n     */\n    setVolume(volume) {\n        if (volume !== undefined) {\n            this.log('Changing volume to: ' + volume);\n\n            // update player volume\n            this.player.volume(volume);\n        }\n    }\n\n    /**\n     * Save waveform image as data URI.\n     *\n     * The default format is 'image/png'. Other supported types are\n     * 'image/jpeg' and 'image/webp'.\n     *\n     * @param {string} [format=image/png] - String indicating the image format.\n     * @param {number} [quality=1] - Number between 0 and 1 indicating image\n     *     quality if the requested type is 'image/jpeg' or 'image/webp'.\n     * @returns {string} The data URI of the image data.\n     */\n    exportImage(format, quality) {\n        return this.surfer.exportImage(format, quality);\n    }\n\n    /**\n     * Change the audio output device.\n     *\n     * @param {string} sinkId - Id of audio output device.\n     */\n    setAudioOutput(deviceId) {\n        if (deviceId) {\n            this.surfer.setSinkId(deviceId).then((result) => {\n                // notify listeners\n                this.player.trigger('audioOutputReady');\n            }).catch((err) => {\n                // notify listeners\n                this.player.trigger('error', err);\n\n                this.log(err, 'error');\n            });\n        }\n    }\n\n    /**\n     * Get the current time (in seconds) of the stream during playback.\n     *\n     * Returns 0 if no stream is available (yet).\n     */\n    getCurrentTime() {\n        let currentTime = this.surfer.getCurrentTime();\n        currentTime = isNaN(currentTime) ? 0 : currentTime;\n\n        return currentTime;\n    }\n\n    /**\n     * Updates the player's element displaying the current time.\n     *\n     * @param {number} [currentTime] - Current position of the playhead\n     *     (in seconds).\n     * @param {number} [duration] - Duration of the waveform (in seconds).\n     * @private\n     */\n    setCurrentTime(currentTime, duration) {\n        if (currentTime === undefined) {\n            currentTime = this.surfer.getCurrentTime();\n        }\n\n        if (duration === undefined) {\n            duration = this.surfer.getDuration();\n        }\n\n        currentTime = isNaN(currentTime) ? 0 : currentTime;\n        duration = isNaN(duration) ? 0 : duration;\n        let time = Math.min(currentTime, duration);\n\n        // update current time display component\n        if (this.player.controlBar.currentTimeDisplay.contentEl()) {\n            this.player.controlBar.currentTimeDisplay.formattedTime_ =\n                this.player.controlBar.currentTimeDisplay.contentEl().lastChild.textContent =\n                    formatTime(time, duration, this.msDisplayMax);\n        }\n\n        if (this.textTracksEnabled) {\n            // only needed for text tracks\n            this.player.tech_.setCurrentTime(currentTime);\n        }\n    }\n\n    /**\n     * Get the duration of the stream in seconds.\n     *\n     * Returns 0 if no stream is available (yet).\n     */\n    getDuration() {\n        let duration = this.surfer.getDuration();\n        duration = isNaN(duration) ? 0 : duration;\n\n        return duration;\n    }\n\n    /**\n     * Updates the player's element displaying the duration time.\n     *\n     * @param {number} [duration] - Duration of the waveform (in seconds).\n     * @private\n     */\n    setDuration(duration) {\n        if (duration === undefined) {\n            duration = this.surfer.getDuration();\n        }\n        duration = isNaN(duration) ? 0 : duration;\n\n        // update duration display component\n        if (this.player.controlBar.durationDisplay.contentEl()) {\n            this.player.controlBar.durationDisplay.formattedTime_ =\n                this.player.controlBar.durationDisplay.contentEl().lastChild.textContent =\n                    formatTime(duration, duration, this.msDisplayMax);\n        }\n    }\n\n    /**\n     * Audio is loaded, decoded and the waveform is drawn.\n     *\n     * @fires waveReady\n     * @private\n     */\n    onWaveReady() {\n        this.waveReady = true;\n        this.waveFinished = false;\n        this.liveMode = false;\n\n        this.log('Waveform is ready');\n        this.player.trigger('waveReady');\n\n        // update time display\n        this.setCurrentTime();\n        this.setDuration();\n\n        // enable and show play button\n        if (this.player.controlBar.playToggle.contentEl()) {\n            this.player.controlBar.playToggle.show();\n        }\n\n        // hide loading spinner\n        if (this.player.loadingSpinner.contentEl()) {\n            this.player.loadingSpinner.hide();\n        }\n\n        // auto-play when ready (if enabled)\n        if (this.player.options_.autoplay === true) {\n            this.play();\n        }\n    }\n\n    /**\n     * Fires when audio playback completed.\n     *\n     * @fires playbackFinish\n     * @private\n     */\n    onWaveFinish() {\n        this.log('Finished playback');\n\n        // notify listeners\n        this.player.trigger('playbackFinish');\n\n        // check if loop is enabled\n        if (this.player.options_.loop === true) {\n            // reset waveform\n            this.surfer.stop();\n            this.play();\n        } else {\n            // finished\n            this.waveFinished = true;\n\n            // pause player\n            this.pause();\n\n            // show the replay state of play toggle\n            this.player.trigger('ended');\n\n            // this gets called once after the clip has ended and the user\n            // seeks so that we can change the replay button back to a play\n            // button\n            this.surfer.once('seek', () => {\n                this.player.controlBar.playToggle.removeClass('vjs-ended');\n                this.player.trigger('pause');\n            });\n        }\n    }\n\n    /**\n     * Fires continuously during audio playback.\n     *\n     * @param {number} time - Current time/location of the playhead.\n     * @private\n     */\n    onWaveProgress(time) {\n        this.setCurrentTime();\n    }\n\n    /**\n     * Fires during seeking of the waveform.\n     * @private\n     */\n    onWaveSeek() {\n        this.setCurrentTime();\n    }\n\n    /**\n     * Waveform error.\n     *\n     * @param {string} error - The wavesurfer error.\n     * @private\n     */\n    onWaveError(error) {\n        // notify listeners\n        this.player.trigger('error', error);\n\n        this.log(error, 'error');\n    }\n\n    /**\n     * Fired when the play toggle is clicked.\n     * @private\n     */\n    onPlayToggle() {\n        // workaround for video.js 6.3.1 and newer\n        if (this.player.controlBar.playToggle.hasClass('vjs-ended')) {\n            this.player.controlBar.playToggle.removeClass('vjs-ended');\n        }\n        if (this.surfer.isPlaying()) {\n            this.pause();\n        } else {\n            this.play();\n        }\n    }\n\n    /**\n     * Fired when the volume in the video.js player changes.\n     * @private\n     */\n    onVolumeChange() {\n        let volume = this.player.volume();\n        if (this.player.muted()) {\n            // muted volume\n            volume = 0;\n        }\n\n        // update wavesurfer.js volume\n        this.surfer.setVolume(volume);\n    }\n\n    /**\n     * Fired when the video.js player switches in or out of fullscreen mode.\n     * @private\n     */\n    onScreenChange() {\n        // execute with tiny delay so the player element completes\n        // rendering and correct dimensions are reported\n        var fullscreenDelay = this.player.setInterval(() => {\n            let isFullscreen = this.player.isFullscreen();\n            let newWidth, newHeight;\n            if (!isFullscreen) {\n                // restore original dimensions\n                newWidth = this.originalWidth;\n                newHeight = this.originalHeight;\n            }\n\n            if (this.waveReady) {\n                if (this.liveMode && !this.surfer.microphone.active) {\n                    // we're in live mode but the microphone hasn't been\n                    // started yet\n                    return;\n                }\n                // redraw\n                this.redrawWaveform(newWidth, newHeight);\n            }\n\n            // stop fullscreenDelay interval\n            this.player.clearInterval(fullscreenDelay);\n\n        }, 100);\n    }\n\n    /**\n     * Fired when the video.js player is resized.\n     *\n     * @private\n     */\n    onResizeChange() {\n        if (this.surfer !== undefined) {\n            // redraw waveform\n            this.redrawWaveform();\n        }\n    }\n\n    /**\n     * Redraw waveform.\n     *\n     * @param {number} [newWidth] - New width for the waveform.\n     * @param {number} [newHeight] - New height for the waveform.\n     * @private\n     */\n    redrawWaveform(newWidth, newHeight) {\n        if (!this.isDestroyed()) {\n            if (this.player.el_) {\n                let rect = this.player.el_.getBoundingClientRect();\n                if (newWidth === undefined) {\n                    // get player width\n                    newWidth = rect.width;\n                }\n                if (newHeight === undefined) {\n                    // get player height\n                    newHeight = rect.height;\n                }\n            }\n\n            // destroy old drawing\n            this.surfer.drawer.destroy();\n\n            // set new dimensions\n            this.surfer.params.width = newWidth;\n            this.surfer.params.height = newHeight - this.player.controlBar.height();\n\n            // redraw waveform\n            this.surfer.createDrawer();\n            this.surfer.drawer.wrapper.className = wavesurferClassName;\n            this.surfer.drawBuffer();\n\n            // make sure playhead is restored at right position\n            this.surfer.drawer.progress(this.surfer.backend.getPlayedPercents());\n        }\n    }\n\n    /**\n     * @private\n     */\n    log(args, logType) {\n        log(args, logType, this.debug);\n    }\n}\n\n// version nr is injected during build\nWavesurfer.VERSION = __VERSION__;\n\n// register plugin once\nvideojs.Wavesurfer = Wavesurfer;\nif (videojs.getPlugin('wavesurfer') === undefined) {\n    videojs.registerPlugin('wavesurfer', Wavesurfer);\n}\n\nmodule.exports = {\n    Wavesurfer\n};\n","/**\n * @file log.js\n * @since 2.0.0\n */\n\nconst ERROR = 'error';\nconst WARN = 'warn';\n\n/**\n * Log message (if the debug option is enabled).\n */\nconst log = function(args, logType, debug)\n{\n    if (debug === true) {\n        if (logType === ERROR) {\n            videojs.log.error(args);\n        } else if (logType === WARN) {\n            videojs.log.warn(args);\n        } else {\n            videojs.log(args);\n        }\n    }\n};\n\nexport default log;\n","/**\n * @file format-time.js\n * @since 2.0.0\n */\n\n/**\n * Format seconds as a time string, H:MM:SS, M:SS or M:SS:MMM.\n *\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide.\n *\n * @param {number} seconds - Number of seconds to be turned into a\n *     string.\n * @param {number} guide - Number (in seconds) to model the string\n *     after.\n * @param {number} msDisplayMax - Number (in milliseconds) to model the string\n *     after.\n * @return {string} Time formatted as H:MM:SS, M:SS or M:SS:MMM, e.g.\n *     0:00:12.\n * @private\n */\nconst formatTime = function(seconds, guide, msDisplayMax) {\n    // Default to using seconds as guide\n    seconds = seconds < 0 ? 0 : seconds;\n    guide = guide || seconds;\n    let s = Math.floor(seconds % 60),\n        m = Math.floor(seconds / 60 % 60),\n        h = Math.floor(seconds / 3600),\n        gm = Math.floor(guide / 60 % 60),\n        gh = Math.floor(guide / 3600),\n        ms = Math.floor((seconds - s) * 1000);\n\n    // handle invalid times\n    if (isNaN(seconds) || seconds === Infinity) {\n        // '-' is false for all relational operators (e.g. <, >=) so this\n        // setting will add the minimum number of fields specified by the\n        // guide\n        h = m = s = ms = '-';\n    }\n\n    // Check if we need to show milliseconds\n    if (guide > 0 && guide < msDisplayMax) {\n        if (ms < 100) {\n            if (ms < 10) {\n                ms = '00' + ms;\n            } else {\n                ms = '0' + ms;\n            }\n        }\n        ms = ':' + ms;\n    } else {\n        ms = '';\n    }\n\n    // Check if we need to show hours\n    h = (h > 0 || gh > 0) ? h + ':' : '';\n\n    // If hours are showing, we may need to add a leading zero.\n    // Always show at least one digit of minutes.\n    m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':';\n\n    // Check if leading zero is need for seconds\n    s = ((s < 10) ? '0' + s : s);\n\n    return h + m + s + ms;\n};\n\nexport default formatTime;\n","/**\n * @file defaults.js\n * @since 2.0.0\n */\n\n// plugin defaults\nconst pluginDefaultOptions = {\n    // Display console log messages.\n    debug: false,\n    // msDisplayMax indicates the number of seconds that is\n    // considered the boundary value for displaying milliseconds\n    // in the time controls. An audio clip with a total length of\n    // 2 seconds and a msDisplayMax of 3 will use the format\n    // M:SS:MMM. Clips longer than msDisplayMax will be displayed\n    // as M:SS or HH:MM:SS.\n    msDisplayMax: 3\n};\n\nexport default pluginDefaultOptions;\n","var win;\n\nif (typeof window !== \"undefined\") {\n    win = window;\n} else if (typeof global !== \"undefined\") {\n    win = global;\n} else if (typeof self !== \"undefined\"){\n    win = self;\n} else {\n    win = {};\n}\n\nmodule.exports = win;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","module.exports = __WEBPACK_EXTERNAL_MODULE__7__;","module.exports = __WEBPACK_EXTERNAL_MODULE__8__;"],"sourceRoot":""}
\ No newline at end of file | 
