aboutsummaryrefslogtreecommitdiff
path: root/assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.js
diff options
context:
space:
mode:
authorAndreas Hubel2020-06-07 21:41:40 +0200
committerAndreas Hubel2020-06-07 21:41:40 +0200
commita66c79184091efdac09ee31a3778c6fc850dbbda (patch)
treed0c8f474548d8699411b7e33ee3fde62029c13da /assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.js
parentd0a9d8b2b0d28dbef209c7cbcbfd56eaeac24d9b (diff)
add netcut assets to repo
submodules are propably to complicated for deployment.... :-)
Diffstat (limited to '')
-rw-r--r--assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.js1278
-rw-r--r--assets/netcut/lib/videojs-wavesurfer/videojs.wavesurfer.js.map1
2 files changed, 1279 insertions, 0 deletions
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