diff --git a/.gitignore b/.gitignore
index e199ab42..8af6f995 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@ node_modules
/built
/coverage
/experiments/winamp-skin-museum
+/examples/webpack/bundle.js
diff --git a/examples/webpack/bundle.js b/examples/webpack/bundle.js
deleted file mode 100644
index ba1f7ae4..00000000
--- a/examples/webpack/bundle.js
+++ /dev/null
@@ -1,41936 +0,0 @@
-/******/ (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, {
-/******/ configurable: false,
-/******/ enumerable: true,
-/******/ get: getter
-/******/ });
-/******/ }
-/******/ };
-/******/
-/******/ // 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 = 1);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (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;
-
-
-/***/ }),
-/* 1 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_winamp2_js__ = __webpack_require__(2);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_winamp2_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_winamp2_js__);
-
-new __WEBPACK_IMPORTED_MODULE_0_winamp2_js___default.a({
- initialTracks: [
- {
- metaData: {
- artist: "DJ Mike Llama",
- title: "Llama Whippin' Intro"
- },
- url:
- "https://cdn.rawgit.com/captbaritone/winamp2-js/43434d82/mp3/llama-2.91.mp3"
- }
- ],
- initialSkin: {
- url:
- "https://cdn.rawgit.com/captbaritone/winamp2-js/43434d82/skins/base-2.91.wsz"
- }
-}).renderWhenReady(document.getElementById("app"));
-
-
-/***/ }),
-/* 2 */
-/***/ (function(module, exports, __webpack_require__) {
-
-/* WEBPACK VAR INJECTION */(function(Buffer, global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var require;var require;(function webpackUniversalModuleDefinition(root, factory) {
- if(true)
- module.exports = factory();
- else if(typeof define === 'function' && define.amd)
- define([], factory);
- else if(typeof exports === 'object')
- exports["winamp2js"] = factory();
- else
- root["winamp2js"] = factory();
-})(typeof self !== 'undefined' ? self : this, function() {
-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, {
-/******/ configurable: false,
-/******/ enumerable: true,
-/******/ get: getter
-/******/ });
-/******/ }
-/******/ };
-/******/
-/******/ // 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 = 135);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-if (true) {
- module.exports = __webpack_require__(153);
-} else {
- module.exports = require('./cjs/react.development.js');
-}
-
-
-/***/ }),
-/* 1 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_Provider__ = __webpack_require__(163);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_connectAdvanced__ = __webpack_require__(106);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__connect_connect__ = __webpack_require__(170);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Provider", function() { return __WEBPACK_IMPORTED_MODULE_0__components_Provider__["b"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "createProvider", function() { return __WEBPACK_IMPORTED_MODULE_0__components_Provider__["a"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "connectAdvanced", function() { return __WEBPACK_IMPORTED_MODULE_1__components_connectAdvanced__["a"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "connect", function() { return __WEBPACK_IMPORTED_MODULE_2__connect_connect__["a"]; });
-
-
-
-
-
-
-/***/ }),
-/* 2 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _getIterator2 = __webpack_require__(31);
-
-var _getIterator3 = _interopRequireDefault(_getIterator2);
-
-var _keys = __webpack_require__(24);
-
-var _keys2 = _interopRequireDefault(_keys);
-
-var _from = __webpack_require__(60);
-
-var _from2 = _interopRequireDefault(_from);
-
-var _regenerator = __webpack_require__(25);
-
-var _regenerator2 = _interopRequireDefault(_regenerator);
-
-var _asyncToGenerator2 = __webpack_require__(26);
-
-var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
-
-exports.play = play;
-exports.pause = pause;
-exports.stop = stop;
-exports.nextN = nextN;
-exports.next = next;
-exports.previous = previous;
-exports.seekForward = seekForward;
-exports.seekBackward = seekBackward;
-exports.close = close;
-exports.setVolume = setVolume;
-exports.adjustVolume = adjustVolume;
-exports.scrollVolume = scrollVolume;
-exports.setBalance = setBalance;
-exports.toggleRepeat = toggleRepeat;
-exports.toggleShuffle = toggleShuffle;
-exports.addTracksFromReferences = addTracksFromReferences;
-exports.loadFilesFromReferences = loadFilesFromReferences;
-exports.fetchMediaDuration = fetchMediaDuration;
-exports.loadMediaFiles = loadMediaFiles;
-exports.loadMediaFile = loadMediaFile;
-exports.fetchMediaTags = fetchMediaTags;
-exports.setSkinFromArrayBuffer = setSkinFromArrayBuffer;
-exports.setSkinFromFileReference = setSkinFromFileReference;
-exports.setSkinFromUrl = setSkinFromUrl;
-exports.openEqfFileDialog = openEqfFileDialog;
-exports.openMediaFileDialog = openMediaFileDialog;
-exports.openSkinFileDialog = openSkinFileDialog;
-exports.setEqBand = setEqBand;
-exports.setEqToMax = setEqToMax;
-exports.setEqToMid = setEqToMid;
-exports.setEqToMin = setEqToMin;
-exports.setPreamp = setPreamp;
-exports.toggleEq = toggleEq;
-exports.downloadPreset = downloadPreset;
-exports.toggleDoubleSizeMode = toggleDoubleSizeMode;
-exports.toggleEqualizerShadeMode = toggleEqualizerShadeMode;
-exports.toggleMainWindowShadeMode = toggleMainWindowShadeMode;
-exports.togglePlaylistShadeMode = togglePlaylistShadeMode;
-exports.closeEqualizerWindow = closeEqualizerWindow;
-exports.cropPlaylist = cropPlaylist;
-exports.removeSelectedTracks = removeSelectedTracks;
-exports.removeAllTracks = removeAllTracks;
-exports.reverseList = reverseList;
-exports.randomizeList = randomizeList;
-exports.sortListByTitle = sortListByTitle;
-exports.toggleVisualizerStyle = toggleVisualizerStyle;
-exports.setPlaylistScrollPosition = setPlaylistScrollPosition;
-exports.setPlaylistSize = setPlaylistSize;
-exports.scrollNTracks = scrollNTracks;
-exports.scrollPlaylistByDelta = scrollPlaylistByDelta;
-exports.scrollUpFourTracks = scrollUpFourTracks;
-exports.scrollDownFourTracks = scrollDownFourTracks;
-exports.dragSelected = dragSelected;
-exports.downloadHtmlPlaylist = downloadHtmlPlaylist;
-exports.updateWindowPositions = updateWindowPositions;
-
-var _winampEqf = __webpack_require__(227);
-
-var _fileUtils = __webpack_require__(84);
-
-var _skinParser = __webpack_require__(230);
-
-var _skinParser2 = _interopRequireDefault(_skinParser);
-
-var _constants = __webpack_require__(8);
-
-var _selectors = __webpack_require__(18);
-
-var _utils = __webpack_require__(13);
-
-var _actionTypes = __webpack_require__(3);
-
-var _loadQueue = __webpack_require__(243);
-
-var _loadQueue2 = _interopRequireDefault(_loadQueue);
-
-var _resizeUtils = __webpack_require__(121);
-
-var _snapUtils = __webpack_require__(123);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-// Lower is better
-var DURATION_VISIBLE_PRIORITY = 5;
-var META_DATA_VISIBLE_PRIORITY = 10;
-var DURATION_PRIORITY = 15;
-var META_DATA_PRIORITY = 20;
-
-var loadQueue = new _loadQueue2.default({ threads: 4 });
-
-function playRandomTrack() {
- return function (dispatch, getState) {
- var _getState = getState(),
- _getState$playlist = _getState.playlist,
- trackOrder = _getState$playlist.trackOrder,
- currentTrack = _getState$playlist.currentTrack;
-
- var nextId = void 0;
- do {
- nextId = trackOrder[Math.floor(trackOrder.length * Math.random())];
- } while (nextId === currentTrack && trackOrder.length > 1);
- // TODO: Sigh... Technically, we should detect if we are looping only repeat if we are.
- // I think this would require pre-computing the "random" order of a playlist.
- dispatch({ type: _actionTypes.PLAY_TRACK, id: nextId });
- };
-}
-
-function play() {
- return function (dispatch, getState) {
- var state = getState();
- if (state.media.status === "STOPPED" && state.playlist.curentTrack == null && state.playlist.trackOrder.length === 0) {
- dispatch(openMediaFileDialog());
- } else {
- dispatch({ type: _actionTypes.PLAY });
- }
- };
-}
-
-function pause() {
- return function (dispatch, getState) {
- var status = getState().media.status;
-
- dispatch({ type: status === "PLAYING" ? _actionTypes.PAUSE : _actionTypes.PLAY });
- };
-}
-
-function stop() {
- return { type: _actionTypes.STOP };
-}
-
-function nextN(n) {
- return function (dispatch, getState) {
- var state = getState();
- if (state.media.shuffle) {
- dispatch(playRandomTrack());
- return;
- }
- var nextTrackId = (0, _selectors.nextTrack)(state, n);
- if (nextTrackId == null) {
- return;
- }
- dispatch({ type: _actionTypes.PLAY_TRACK, id: nextTrackId });
- };
-}
-
-function next() {
- return nextN(1);
-}
-
-function previous() {
- return nextN(-1);
-}
-
-function seekForward(seconds) {
- return function (dispatch, getState) {
- var _getState2 = getState(),
- media = _getState2.media;
-
- var timeElapsed = media.timeElapsed,
- length = media.length;
-
- var newTimeElapsed = timeElapsed + seconds;
- var newPercentComplete = newTimeElapsed / length;
- dispatch({ type: _actionTypes.SEEK_TO_PERCENT_COMPLETE, percent: newPercentComplete });
- };
-}
-
-function seekBackward(seconds) {
- return seekForward(-seconds);
-}
-
-function close() {
- return function (dispatch) {
- dispatch({ type: _actionTypes.STOP });
- dispatch({ type: _actionTypes.CLOSE_WINAMP });
- };
-}
-
-function setVolume(volume) {
- return {
- type: _actionTypes.SET_VOLUME,
- volume: (0, _utils.clamp)(volume, 0, 100)
- };
-}
-
-function adjustVolume(volumeDiff) {
- return function (dispatch, getState) {
- var currentVolume = getState().media.volume;
- return dispatch(setVolume(currentVolume + volumeDiff));
- };
-}
-
-function scrollVolume(e) {
- e.preventDefault();
- return function (dispatch, getState) {
- var currentVolume = getState().media.volume;
- // Using pixels as percentage difference here is a bit arbirary, but... oh well.
- return dispatch(setVolume(currentVolume + e.deltaY));
- };
-}
-
-function setBalance(balance) {
- balance = (0, _utils.clamp)(balance, -100, 100);
- // The balance clips to the center
- if (Math.abs(balance) < 25) {
- balance = 0;
- }
- return {
- type: _actionTypes.SET_BALANCE,
- balance: balance
- };
-}
-
-function toggleRepeat() {
- return { type: _actionTypes.TOGGLE_REPEAT };
-}
-
-function toggleShuffle() {
- return { type: _actionTypes.TOGGLE_SHUFFLE };
-}
-
-function setEqFromFileReference(fileReference) {
- var _this = this;
-
- return function () {
- var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(dispatch) {
- var arrayBuffer, eqf, preset;
- return _regenerator2.default.wrap(function _callee$(_context) {
- while (1) {
- switch (_context.prev = _context.next) {
- case 0:
- _context.next = 2;
- return (0, _fileUtils.genArrayBufferFromFileReference)(fileReference);
-
- case 2:
- arrayBuffer = _context.sent;
- eqf = (0, _winampEqf.parser)(arrayBuffer);
- preset = eqf.presets[0];
-
-
- dispatch(setPreamp((0, _utils.normalize)(preset.preamp)));
- _constants.BANDS.forEach(function (band) {
- dispatch(setEqBand(band, (0, _utils.normalize)(preset["hz" + band])));
- });
-
- case 7:
- case "end":
- return _context.stop();
- }
- }
- }, _callee, _this);
- }));
-
- return function (_x) {
- return _ref.apply(this, arguments);
- };
- }();
-}
-
-function addTracksFromReferences(fileReferences, loadStyle, atIndex) {
- var tracks = (0, _from2.default)(fileReferences).map(function (file) {
- return {
- blob: file,
- defaultName: file.name
- };
- });
- return loadMediaFiles(tracks, loadStyle, atIndex);
-}
-
-var SKIN_FILENAME_MATCHER = new RegExp("(wsz|zip)$", "i");
-var EQF_FILENAME_MATCHER = new RegExp("eqf$", "i");
-function loadFilesFromReferences(fileReferences) {
- var loadStyle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _constants.LOAD_STYLE.PLAY;
- var atIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-
- return function (dispatch) {
- if (fileReferences.length < 1) {
- return;
- } else if (fileReferences.length === 1) {
- var fileReference = fileReferences[0];
- if (SKIN_FILENAME_MATCHER.test(fileReference.name)) {
- dispatch(setSkinFromFileReference(fileReference));
- return;
- } else if (EQF_FILENAME_MATCHER.test(fileReference.name)) {
- dispatch(setEqFromFileReference(fileReference));
- return;
- }
- }
- dispatch(addTracksFromReferences(fileReferences, loadStyle, atIndex));
- };
-}
-
-function fetchMediaDuration(url, id) {
- return function (dispatch, getState) {
- loadQueue.push(function () {
- return (0, _fileUtils.genMediaDuration)(url).then(function (duration) {
- return dispatch({ type: _actionTypes.SET_MEDIA_DURATION, duration: duration, id: id });
- }).catch(function () {
- // TODO: Should we update the state to indicate that we don't know the length?
- });
- }, function () {
- var trackIsVisible = (0, _selectors.getTrackIsVisibleFunction)(getState());
- return trackIsVisible(id) ? DURATION_VISIBLE_PRIORITY : DURATION_PRIORITY;
- });
- };
-}
-
-var counter = 0;
-function uniqueId() {
- return counter++;
-}
-
-function loadMediaFiles(tracks) {
- var loadStyle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
- var atIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
-
- return function (dispatch) {
- if (loadStyle === _constants.LOAD_STYLE.PLAY) {
- // I'm the worst. It just so happens that in every case that we autoPlay,
- // we should also clear all tracks.
- dispatch(removeAllTracks());
- }
- tracks.forEach(function (track, i) {
- var priority = i === 0 && loadStyle != null ? loadStyle : null;
- dispatch(loadMediaFile(track, priority, atIndex + i));
- });
- };
-}
-
-function loadMediaFile(track) {
- var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
- var atIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
-
- return function (dispatch) {
- var id = uniqueId();
- var url = track.url,
- blob = track.blob,
- defaultName = track.defaultName,
- metaData = track.metaData,
- duration = track.duration;
-
- var canonicalUrl = url;
- if (canonicalUrl == null) {
- if (blob == null) {
- throw new Error("Expected track to have either a blob or a url");
- }
- canonicalUrl = URL.createObjectURL(track.blob);
- }
- dispatch({
- type: _actionTypes.ADD_TRACK_FROM_URL,
- url: canonicalUrl,
- defaultName: defaultName,
- id: id,
- atIndex: atIndex
- });
- switch (priority) {
- case _constants.LOAD_STYLE.BUFFER:
- dispatch({ type: _actionTypes.BUFFER_TRACK, id: id });
- break;
- case _constants.LOAD_STYLE.PLAY:
- dispatch({ type: _actionTypes.PLAY_TRACK, id: id });
- break;
- default:
- // If we're not going to load this right away,
- // we should set duration on our own
- if (duration != null) {
- dispatch({ type: _actionTypes.SET_MEDIA_DURATION, duration: duration, id: id });
- } else {
- dispatch(fetchMediaDuration(canonicalUrl, id));
- }
- }
-
- if (metaData != null) {
- var artist = metaData.artist,
- title = metaData.title;
-
- dispatch({ type: _actionTypes.SET_MEDIA_TAGS, artist: artist, title: title, id: id });
- } else if (blob != null) {
- // Blobs can be loaded quickly
- dispatch(fetchMediaTags(blob, id));
- } else {
- dispatch(queueFetchingMediaTags(id));
- }
- };
-}
-
-function queueFetchingMediaTags(id) {
- return function (dispatch, getState) {
- var track = (0, _selectors.getTracks)(getState())[id];
- return loadQueue.push(function () {
- return dispatch(fetchMediaTags(track.url, id));
- }, function () {
- var trackIsVisible = (0, _selectors.getTrackIsVisibleFunction)(getState());
- return trackIsVisible(track.id) ? META_DATA_VISIBLE_PRIORITY : META_DATA_PRIORITY;
- });
- };
-}
-
-function fetchMediaTags(file, id) {
- return function (dispatch) {
- dispatch({ type: _actionTypes.MEDIA_TAG_REQUEST_INITIALIZED, id: id });
- return (0, _fileUtils.genMediaTags)(file).then(function (data) {
- var _data$tags = data.tags,
- artist = _data$tags.artist,
- title = _data$tags.title;
- // There's more data here, but we don't have a use for it yet:
- // https://github.com/aadsm/jsmediatags#shortcuts
-
- dispatch({ type: _actionTypes.SET_MEDIA_TAGS, artist: artist, title: title, id: id });
- }).catch(function () {
- dispatch({ type: _actionTypes.MEDIA_TAG_REQUEST_FAILED, id: id });
- });
- };
-}
-
-function setSkinFromArrayBuffer(arrayBuffer) {
- var _this2 = this;
-
- return function () {
- var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(dispatch) {
- var skinData;
- return _regenerator2.default.wrap(function _callee2$(_context2) {
- while (1) {
- switch (_context2.prev = _context2.next) {
- case 0:
- _context2.next = 2;
- return (0, _skinParser2.default)(arrayBuffer);
-
- case 2:
- skinData = _context2.sent;
-
- dispatch({
- type: _actionTypes.SET_SKIN_DATA,
- skinImages: skinData.images,
- skinColors: skinData.colors,
- skinPlaylistStyle: skinData.playlistStyle,
- skinCursors: skinData.cursors,
- skinRegion: skinData.region,
- skinGenLetterWidths: skinData.genLetterWidths
- });
-
- case 4:
- case "end":
- return _context2.stop();
- }
- }
- }, _callee2, _this2);
- }));
-
- return function (_x8) {
- return _ref2.apply(this, arguments);
- };
- }();
-}
-
-function setSkinFromFileReference(skinFileReference) {
- var _this3 = this;
-
- return function () {
- var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(dispatch) {
- var arrayBuffer;
- return _regenerator2.default.wrap(function _callee3$(_context3) {
- while (1) {
- switch (_context3.prev = _context3.next) {
- case 0:
- _context3.next = 2;
- return (0, _fileUtils.genArrayBufferFromFileReference)(skinFileReference);
-
- case 2:
- arrayBuffer = _context3.sent;
-
- dispatch(setSkinFromArrayBuffer(arrayBuffer));
-
- case 4:
- case "end":
- return _context3.stop();
- }
- }
- }, _callee3, _this3);
- }));
-
- return function (_x9) {
- return _ref3.apply(this, arguments);
- };
- }();
-}
-
-function setSkinFromUrl(url) {
- var _this4 = this;
-
- return function () {
- var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(dispatch) {
- var arrayBuffer;
- return _regenerator2.default.wrap(function _callee4$(_context4) {
- while (1) {
- switch (_context4.prev = _context4.next) {
- case 0:
- _context4.next = 2;
- return (0, _fileUtils.genArrayBufferFromUrl)(url);
-
- case 2:
- arrayBuffer = _context4.sent;
-
- dispatch(setSkinFromArrayBuffer(arrayBuffer));
-
- case 4:
- case "end":
- return _context4.stop();
- }
- }
- }, _callee4, _this4);
- }));
-
- return function (_x10) {
- return _ref4.apply(this, arguments);
- };
- }();
-}
-
-// This function is private, since Winamp consumers can provide means for
-// opening files via other methods. Only use the file type specific
-// versions below, since they can defer to the user-defined behavior.
-function _openFileDialog(accept) {
- var _this5 = this;
-
- return function () {
- var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(dispatch) {
- var fileReferences;
- return _regenerator2.default.wrap(function _callee5$(_context5) {
- while (1) {
- switch (_context5.prev = _context5.next) {
- case 0:
- _context5.next = 2;
- return (0, _fileUtils.promptForFileReferences)({ accept: accept });
-
- case 2:
- fileReferences = _context5.sent;
-
- dispatch(loadFilesFromReferences(fileReferences));
-
- case 4:
- case "end":
- return _context5.stop();
- }
- }
- }, _callee5, _this5);
- }));
-
- return function (_x11) {
- return _ref5.apply(this, arguments);
- };
- }();
-}
-
-function openEqfFileDialog() {
- return _openFileDialog(".eqf");
-}
-
-function openMediaFileDialog() {
- return _openFileDialog();
-}
-
-function openSkinFileDialog() {
- return _openFileDialog(".zip, .wsz");
-}
-
-function setEqBand(band, value) {
- return { type: _actionTypes.SET_BAND_VALUE, band: band, value: value };
-}
-
-function _setEqTo(value) {
- return function (dispatch) {
- (0, _keys2.default)(_constants.BANDS).forEach(function (key) {
- var band = _constants.BANDS[key];
- dispatch({
- type: _actionTypes.SET_BAND_VALUE,
- value: value,
- band: band
- });
- });
- };
-}
-
-function setEqToMax() {
- return _setEqTo(100);
-}
-
-function setEqToMid() {
- return _setEqTo(50);
-}
-
-function setEqToMin() {
- return _setEqTo(0);
-}
-
-function setPreamp(value) {
- return {
- type: _actionTypes.SET_BAND_VALUE,
- band: "preamp",
- value: value
- };
-}
-
-function toggleEq() {
- return function (dispatch, getState) {
- var type = getState().equalizer.on ? _actionTypes.SET_EQ_OFF : _actionTypes.SET_EQ_ON;
- dispatch({ type: type });
- };
-}
-
-function downloadPreset() {
- return function (dispatch, getState) {
- var state = getState();
- var data = (0, _selectors.getEqfData)(state);
- var arrayBuffer = (0, _winampEqf.creator)(data);
- var base64 = (0, _utils.base64FromArrayBuffer)(arrayBuffer);
- var dataURI = "data:application/zip;base64," + base64;
- (0, _utils.downloadURI)(dataURI, "entry.eqf");
- };
-}
-
-// Dispatch an action and, if needed rearrange the windows to preserve
-// the existing edge relationship.
-//
-// Works by checking the edges before the action is dispatched. Then,
-// after disatching, calculating what position change would be required
-// to restore those relationships.
-function withWindowGraphIntegrity(action) {
- return function (dispatch, getState) {
- var state = getState();
- var graph = (0, _selectors.getWindowGraph)(state);
- var originalSizes = (0, _selectors.getWindowSizes)(state);
-
- dispatch(action);
-
- var newSizes = (0, _selectors.getWindowSizes)(getState());
- var sizeDiff = {};
- var _iteratorNormalCompletion = true;
- var _didIteratorError = false;
- var _iteratorError = undefined;
-
- try {
- for (var _iterator = (0, _getIterator3.default)((0, _keys2.default)(newSizes)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
- var window = _step.value;
-
- var original = originalSizes[window];
- var current = newSizes[window];
- sizeDiff[window] = {
- height: current.height - original.height,
- width: current.width - original.width
- };
- }
- } catch (err) {
- _didIteratorError = true;
- _iteratorError = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion && _iterator.return) {
- _iterator.return();
- }
- } finally {
- if (_didIteratorError) {
- throw _iteratorError;
- }
- }
- }
-
- var positionDiff = (0, _resizeUtils.getPositionDiff)(graph, sizeDiff);
- var windowPositions = (0, _selectors.getWindowPositions)(state);
-
- var newPositions = {};
- var _iteratorNormalCompletion2 = true;
- var _didIteratorError2 = false;
- var _iteratorError2 = undefined;
-
- try {
- for (var _iterator2 = (0, _getIterator3.default)((0, _keys2.default)(windowPositions)), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
- var key = _step2.value;
-
- newPositions[key] = (0, _snapUtils.applyDiff)(windowPositions[key], positionDiff[key]);
- }
- } catch (err) {
- _didIteratorError2 = true;
- _iteratorError2 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion2 && _iterator2.return) {
- _iterator2.return();
- }
- } finally {
- if (_didIteratorError2) {
- throw _iteratorError2;
- }
- }
- }
-
- dispatch(updateWindowPositions(newPositions));
- };
-}
-
-function toggleDoubleSizeMode() {
- return withWindowGraphIntegrity({ type: _actionTypes.TOGGLE_DOUBLESIZE_MODE });
-}
-
-function toggleEqualizerShadeMode() {
- return withWindowGraphIntegrity({ type: _actionTypes.TOGGLE_EQUALIZER_SHADE_MODE });
-}
-
-function toggleMainWindowShadeMode() {
- return withWindowGraphIntegrity({ type: _actionTypes.TOGGLE_MAIN_SHADE_MODE });
-}
-
-function togglePlaylistShadeMode() {
- return withWindowGraphIntegrity({ type: _actionTypes.TOGGLE_PLAYLIST_SHADE_MODE });
-}
-
-function closeEqualizerWindow() {
- return { type: _actionTypes.CLOSE_EQUALIZER_WINDOW };
-}
-
-function cropPlaylist() {
- return function (dispatch, getState) {
- var state = getState();
- if ((0, _selectors.getSelectedTrackObjects)(state).length === 0) {
- return;
- }
-
- var _getState3 = getState(),
- tracks = _getState3.playlist.tracks;
-
- dispatch({
- type: _actionTypes.REMOVE_TRACKS,
- ids: (0, _keys2.default)(tracks).filter(function (id) {
- return !tracks[id].selected;
- })
- });
- };
-}
-
-function removeSelectedTracks() {
- return function (dispatch, getState) {
- var _getState4 = getState(),
- tracks = _getState4.playlist.tracks;
-
- dispatch({
- type: _actionTypes.REMOVE_TRACKS,
- ids: (0, _keys2.default)(tracks).filter(function (id) {
- return tracks[id].selected;
- })
- });
- };
-}
-
-function removeAllTracks() {
- return { type: _actionTypes.REMOVE_ALL_TRACKS };
-}
-
-function reverseList() {
- return { type: _actionTypes.REVERSE_LIST };
-}
-
-function randomizeList() {
- return { type: _actionTypes.RANDOMIZE_LIST };
-}
-
-function sortListByTitle() {
- return function (dispatch, getState) {
- var state = getState();
- var trackOrder = (0, _utils.sort)(state.playlist.trackOrder, function (i) {
- return ("" + state.playlist.tracks[i].title).toLowerCase();
- });
- return dispatch({ type: _actionTypes.SET_TRACK_ORDER, trackOrder: trackOrder });
- };
-}
-
-function toggleVisualizerStyle() {
- return { type: _actionTypes.TOGGLE_VISUALIZER_STYLE };
-}
-
-function setPlaylistScrollPosition(position) {
- return { type: _actionTypes.SET_PLAYLIST_SCROLL_POSITION, position: position };
-}
-
-function setPlaylistSize(size) {
- return { type: _actionTypes.PLAYLIST_SIZE_CHANGED, size: size };
-}
-
-function scrollNTracks(n) {
- return function (dispatch, getState) {
- var state = getState();
- var overflow = (0, _selectors.getOverflowTrackCount)(state);
- var currentOffset = (0, _selectors.getScrollOffset)(state);
- var position = overflow ? (0, _utils.clamp)((currentOffset + n) / overflow, 0, 1) : 0;
- return dispatch({
- type: _actionTypes.SET_PLAYLIST_SCROLL_POSITION,
- position: position * 100
- });
- };
-}
-
-function scrollPlaylistByDelta(e) {
- e.preventDefault();
- return function (dispatch, getState) {
- var state = getState();
- if ((0, _selectors.getOverflowTrackCount)(state)) {
- e.stopPropagation();
- }
- var totalPixelHeight = state.playlist.trackOrder.length * _constants.TRACK_HEIGHT;
- var percentDelta = e.deltaY / totalPixelHeight * 100;
- dispatch({
- type: _actionTypes.SET_PLAYLIST_SCROLL_POSITION,
- position: (0, _utils.clamp)(state.display.playlistScrollPosition + percentDelta, 0, 100)
- });
- };
-}
-
-function scrollUpFourTracks() {
- return scrollNTracks(-4);
-}
-
-function scrollDownFourTracks() {
- return scrollNTracks(4);
-}
-
-function findLastIndex(arr, cb) {
- for (var i = arr.length - 1; i >= 0; i--) {
- if (cb(arr[i])) {
- return i;
- }
- }
- return -1;
-}
-
-function dragSelected(offset) {
- return function (dispatch, getState) {
- var _getState5 = getState(),
- _getState5$playlist = _getState5.playlist,
- trackOrder = _getState5$playlist.trackOrder,
- tracks = _getState5$playlist.tracks;
-
- var firstSelected = trackOrder.findIndex(function (trackId) {
- return tracks[trackId] && tracks[trackId].selected;
- });
- if (firstSelected === -1) {
- return;
- }
- var lastSelected = findLastIndex(trackOrder, function (trackId) {
- return tracks[trackId] && tracks[trackId].selected;
- });
- if (lastSelected === -1) {
- throw new Error("We found a first selected, but not a last selected.");
- }
- // Ensure we don't try to drag off either end.
- var min = -firstSelected;
- var max = trackOrder.length - 1 - lastSelected;
- var normalizedOffset = (0, _utils.clamp)(offset, min, max);
- if (normalizedOffset !== 0) {
- dispatch({ type: _actionTypes.DRAG_SELECTED, offset: normalizedOffset });
- }
- };
-}
-
-function downloadHtmlPlaylist() {
- return function (dispatch, getState) {
- var uri = (0, _selectors.getPlaylistURL)(getState());
- (0, _utils.downloadURI)(uri, "Winamp Playlist.html");
- };
-}
-
-function updateWindowPositions(positions) {
- return { type: _actionTypes.UPDATE_WINDOW_POSITIONS, positions: positions };
-}
-
-/***/ }),
-/* 3 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-var ADD_TRACK_FROM_URL = exports.ADD_TRACK_FROM_URL = "ADD_TRACK_FROM_URL";
-var CLOSE_WINAMP = exports.CLOSE_WINAMP = "CLOSE_WINAMP";
-var CLOSE_EQUALIZER_WINDOW = exports.CLOSE_EQUALIZER_WINDOW = "CLOSE_EQUALIZER_WINDOW";
-var IS_PLAYING = exports.IS_PLAYING = "IS_PLAYING";
-var IS_STOPPED = exports.IS_STOPPED = "IS_STOPPED";
-var PAUSE = exports.PAUSE = "PAUSE";
-var PLAY = exports.PLAY = "PLAY";
-var SEEK_TO_PERCENT_COMPLETE = exports.SEEK_TO_PERCENT_COMPLETE = "SEEK_TO_PERCENT_COMPLETE";
-var SET_BALANCE = exports.SET_BALANCE = "SET_BALANCE";
-var SET_BAND_VALUE = exports.SET_BAND_VALUE = "SET_BAND_VALUE";
-var SET_FOCUS = exports.SET_FOCUS = "SET_FOCUS";
-var SET_BAND_FOCUS = exports.SET_BAND_FOCUS = "SET_BAND_FOCUS";
-var SET_FOCUSED_WINDOW = exports.SET_FOCUSED_WINDOW = "SET_FOCUSED_WINDOW";
-var SET_MEDIA = exports.SET_MEDIA = "SET_MEDIA";
-var SET_SCRUB_POSITION = exports.SET_SCRUB_POSITION = "SET_SCRUB_POSITION";
-var SET_SKIN_DATA = exports.SET_SKIN_DATA = "SET_SKIN_DATA";
-var SET_VOLUME = exports.SET_VOLUME = "SET_VOLUME";
-var START_WORKING = exports.START_WORKING = "START_WORKING";
-var STEP_MARQUEE = exports.STEP_MARQUEE = "STEP_MARQUEE";
-var STOP = exports.STOP = "STOP";
-var STOP_WORKING = exports.STOP_WORKING = "STOP_WORKING";
-var TOGGLE_DOUBLESIZE_MODE = exports.TOGGLE_DOUBLESIZE_MODE = "TOGGLE_DOUBLESIZE_MODE";
-var TOGGLE_EQUALIZER_WINDOW = exports.TOGGLE_EQUALIZER_WINDOW = "TOGGLE_EQUALIZER_WINDOW";
-var TOGGLE_PLAYLIST_WINDOW = exports.TOGGLE_PLAYLIST_WINDOW = "TOGGLE_PLAYLIST_WINDOW";
-var SET_EQ_AUTO = exports.SET_EQ_AUTO = "SET_EQ_AUTO";
-var SET_EQ_ON = exports.SET_EQ_ON = "SET_EQ_ON";
-var SET_EQ_OFF = exports.SET_EQ_OFF = "SET_EQ_OFF";
-var TOGGLE_LLAMA_MODE = exports.TOGGLE_LLAMA_MODE = "TOGGLE_LLAMA_MODE";
-var TOGGLE_REPEAT = exports.TOGGLE_REPEAT = "TOGGLE_REPEAT";
-var TOGGLE_MAIN_SHADE_MODE = exports.TOGGLE_MAIN_SHADE_MODE = "TOGGLE_MAIN_SHADE_MODE";
-var TOGGLE_EQUALIZER_SHADE_MODE = exports.TOGGLE_EQUALIZER_SHADE_MODE = "TOGGLE_EQUALIZER_SHADE_MODE";
-var TOGGLE_PLAYLIST_SHADE_MODE = exports.TOGGLE_PLAYLIST_SHADE_MODE = "TOGGLE_PLAYLIST_SHADE_MODE";
-var TOGGLE_SHUFFLE = exports.TOGGLE_SHUFFLE = "TOGGLE_SHUFFLE";
-var TOGGLE_TIME_MODE = exports.TOGGLE_TIME_MODE = "TOGGLE_TIME_MODE";
-var TOGGLE_VISUALIZER_STYLE = exports.TOGGLE_VISUALIZER_STYLE = "TOGGLE_VISUALIZER_STYLE";
-var UNSET_FOCUS = exports.UNSET_FOCUS = "UNSET_FOCUS";
-var UPDATE_TIME_ELAPSED = exports.UPDATE_TIME_ELAPSED = "UPDATE_TIME_ELAPSED";
-var SET_USER_MESSAGE = exports.SET_USER_MESSAGE = "SET_USER_MESSAGE";
-var UNSET_USER_MESSAGE = exports.UNSET_USER_MESSAGE = "UNSET_USER_MESSAGE";
-var SET_PLAYLIST_SCROLL_POSITION = exports.SET_PLAYLIST_SCROLL_POSITION = "SET_PLAYLIST_SCROLL_POSITION";
-var CLICKED_TRACK = exports.CLICKED_TRACK = "CLICKED_TRACK";
-var CTRL_CLICKED_TRACK = exports.CTRL_CLICKED_TRACK = "CTRL_CLICKED_TRACK";
-var SHIFT_CLICKED_TRACK = exports.SHIFT_CLICKED_TRACK = "SHIFT_CLICKED_TRACK";
-var SELECT_ALL = exports.SELECT_ALL = "SELECT_ALL";
-var SELECT_ZERO = exports.SELECT_ZERO = "SELECT_ZERO";
-var INVERT_SELECTION = exports.INVERT_SELECTION = "INVERT_SELECTION";
-var PLAYLIST_SIZE_CHANGED = exports.PLAYLIST_SIZE_CHANGED = "PLAYLIST_SIZE_CHANGED";
-var REMOVE_ALL_TRACKS = exports.REMOVE_ALL_TRACKS = "REMOVE_ALL_TRACKS";
-var CROP_TRACKS = exports.CROP_TRACKS = "CROP_TRACKS";
-var FILE_INFO = exports.FILE_INFO = "FILE_INFO";
-var REMOVE_TRACKS = exports.REMOVE_TRACKS = "REMOVE_TRACKS";
-var SET_AVALIABLE_SKINS = exports.SET_AVALIABLE_SKINS = "SET_AVALIABLE_SKINS";
-var REVERSE_LIST = exports.REVERSE_LIST = "REVERSE_LIST";
-var RANDOMIZE_LIST = exports.RANDOMIZE_LIST = "RANDOMIZE_LIST";
-var SET_TRACK_ORDER = exports.SET_TRACK_ORDER = "SET_TRACK_ORDER";
-var PLAY_TRACK = exports.PLAY_TRACK = "PLAY_TRACK";
-var BUFFER_TRACK = exports.BUFFER_TRACK = "BUFFER_TRACK";
-var DRAG_SELECTED = exports.DRAG_SELECTED = "DRAG_SELECTED";
-var SET_MEDIA_TAGS = exports.SET_MEDIA_TAGS = "SET_MEDIA_TAGS";
-var SET_MEDIA_DURATION = exports.SET_MEDIA_DURATION = "SET_MEDIA_DURATION";
-var OPEN_GEN_WINDOW = exports.OPEN_GEN_WINDOW = "OPEN_GEN_WINDOW";
-var CLOSE_GEN_WINDOW = exports.CLOSE_GEN_WINDOW = "CLOSE_GEN_WINDOW";
-var MEDIA_TAG_REQUEST_INITIALIZED = exports.MEDIA_TAG_REQUEST_INITIALIZED = "MEDIA_TAG_REQUEST_INITIALIZED";
-var MEDIA_TAG_REQUEST_FAILED = exports.MEDIA_TAG_REQUEST_FAILED = "MEDIA_TAG_REQUEST_FAILED";
-var NETWORK_CONNECTED = exports.NETWORK_CONNECTED = "NETWORK_CONNECTED";
-var NETWORK_DISCONNECTED = exports.NETWORK_DISCONNECTED = "NETWORK_DISCONNECTED";
-var UPDATE_WINDOW_POSITIONS = exports.UPDATE_WINDOW_POSITIONS = "UPDATE_WINDOW_POSITIONS";
-
-/***/ }),
-/* 4 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-exports.__esModule = true;
-
-exports.default = function (instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
-};
-
-/***/ }),
-/* 5 */
-/***/ (function(module, exports) {
-
-var core = module.exports = { version: '2.5.3' };
-if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
-
-
-/***/ }),
-/* 6 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
- Copyright (c) 2016 Jed Watson.
- Licensed under the MIT License (MIT), see
- http://jedwatson.github.io/classnames
-*/
-/* global define */
-
-(function () {
- 'use strict';
-
- var hasOwn = {}.hasOwnProperty;
-
- function classNames () {
- var classes = [];
-
- for (var i = 0; i < arguments.length; i++) {
- var arg = arguments[i];
- if (!arg) continue;
-
- var argType = typeof arg;
-
- if (argType === 'string' || argType === 'number') {
- classes.push(arg);
- } else if (Array.isArray(arg)) {
- classes.push(classNames.apply(null, arg));
- } else if (argType === 'object') {
- for (var key in arg) {
- if (hasOwn.call(arg, key) && arg[key]) {
- classes.push(key);
- }
- }
- }
- }
-
- return classes.join(' ');
- }
-
- if (typeof module !== 'undefined' && module.exports) {
- module.exports = classNames;
- } else if (true) {
- // register as 'classnames', consistent with npm package name
- !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {
- return classNames;
- }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
- __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
- } else {
- window.classNames = classNames;
- }
-}());
-
-
-/***/ }),
-/* 7 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-exports.__esModule = true;
-
-var _defineProperty = __webpack_require__(103);
-
-var _defineProperty2 = _interopRequireDefault(_defineProperty);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = 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;
- (0, _defineProperty2.default)(target, descriptor.key, descriptor);
- }
- }
-
- return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);
- if (staticProps) defineProperties(Constructor, staticProps);
- return Constructor;
- };
-}();
-
-/***/ }),
-/* 8 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-var BANDS = exports.BANDS = [60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000];
-
-var WINDOWS = exports.WINDOWS = {
- MAIN: "MAIN",
- PLAYLIST: "PLAYLIST",
- EQUALIZER: "EQUALIZER"
-};
-
-var LOAD_STYLE = exports.LOAD_STYLE = {
- BUFFER: "BUFFER",
- PLAY: "PLAY"
-};
-
-var MEDIA_TAG_REQUEST_STATUS = exports.MEDIA_TAG_REQUEST_STATUS = {
- INITIALIZED: "INITIALIZED",
- FAILED: "FAILED",
- COMPLETE: "COMPLETE",
- NOT_REQUESTED: "NOT_REQUESTED"
-};
-
-var UTF8_ELLIPSIS = exports.UTF8_ELLIPSIS = "\u2026";
-var CHARACTER_WIDTH = exports.CHARACTER_WIDTH = 5;
-var PLAYLIST_RESIZE_SEGMENT_WIDTH = exports.PLAYLIST_RESIZE_SEGMENT_WIDTH = 25;
-var PLAYLIST_RESIZE_SEGMENT_HEIGHT = exports.PLAYLIST_RESIZE_SEGMENT_HEIGHT = 29;
-var MIN_PLAYLIST_WINDOW_WIDTH = exports.MIN_PLAYLIST_WINDOW_WIDTH = 275;
-var TRACK_HEIGHT = exports.TRACK_HEIGHT = 13;
-var LETTERS = exports.LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
-
-/***/ }),
-/* 9 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-exports.__esModule = true;
-
-var _typeof2 = __webpack_require__(124);
-
-var _typeof3 = _interopRequireDefault(_typeof2);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = function (self, call) {
- if (!self) {
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
- }
-
- return call && ((typeof call === "undefined" ? "undefined" : (0, _typeof3.default)(call)) === "object" || typeof call === "function") ? call : self;
-};
-
-/***/ }),
-/* 10 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-exports.__esModule = true;
-
-var _setPrototypeOf = __webpack_require__(259);
-
-var _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);
-
-var _create = __webpack_require__(263);
-
-var _create2 = _interopRequireDefault(_create);
-
-var _typeof2 = __webpack_require__(124);
-
-var _typeof3 = _interopRequireDefault(_typeof2);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = function (subClass, superClass) {
- if (typeof superClass !== "function" && superClass !== null) {
- throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : (0, _typeof3.default)(superClass)));
- }
-
- subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {
- constructor: {
- value: subClass,
- enumerable: false,
- writable: true,
- configurable: true
- }
- });
- if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;
-};
-
-/***/ }),
-/* 11 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var global = __webpack_require__(16);
-var core = __webpack_require__(5);
-var ctx = __webpack_require__(23);
-var hide = __webpack_require__(27);
-var PROTOTYPE = 'prototype';
-
-var $export = function (type, name, source) {
- var IS_FORCED = type & $export.F;
- var IS_GLOBAL = type & $export.G;
- var IS_STATIC = type & $export.S;
- var IS_PROTO = type & $export.P;
- var IS_BIND = type & $export.B;
- var IS_WRAP = type & $export.W;
- var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
- var expProto = exports[PROTOTYPE];
- var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
- var key, own, out;
- if (IS_GLOBAL) source = name;
- for (key in source) {
- // contains in native
- own = !IS_FORCED && target && target[key] !== undefined;
- if (own && key in exports) continue;
- // export native or passed
- out = own ? target[key] : source[key];
- // prevent global pollution for namespaces
- exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
- // bind timers to global for call from export context
- : IS_BIND && own ? ctx(out, global)
- // wrap global constructors for prevent change them in library
- : IS_WRAP && target[key] == out ? (function (C) {
- var F = function (a, b, c) {
- if (this instanceof C) {
- switch (arguments.length) {
- case 0: return new C();
- case 1: return new C(a);
- case 2: return new C(a, b);
- } return new C(a, b, c);
- } return C.apply(this, arguments);
- };
- F[PROTOTYPE] = C[PROTOTYPE];
- return F;
- // make static versions for prototype methods
- })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
- // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
- if (IS_PROTO) {
- (exports.virtual || (exports.virtual = {}))[key] = out;
- // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
- if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
- }
- }
-};
-// type bitmap
-$export.F = 1; // forced
-$export.G = 2; // global
-$export.S = 4; // static
-$export.P = 8; // proto
-$export.B = 16; // bind
-$export.W = 32; // wrap
-$export.U = 64; // safe
-$export.R = 128; // real proto method for `library`
-module.exports = $export;
-
-
-/***/ }),
-/* 12 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-exports.__esModule = true;
-
-var _assign = __webpack_require__(80);
-
-var _assign2 = _interopRequireDefault(_assign);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = _assign2.default || function (target) {
- for (var i = 1; i < arguments.length; i++) {
- var source = arguments[i];
-
- for (var key in source) {
- if (Object.prototype.hasOwnProperty.call(source, key)) {
- target[key] = source[key];
- }
- }
- }
-
- return target;
-};
-
-/***/ }),
-/* 13 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.arrayWithout = exports.arrayWith = exports.spliceIn = exports.filterObject = exports.mapObject = exports.moveSelected = exports.sort = exports.shuffle = exports.arraysAreEqual = exports.segment = exports.merge = exports.denormalize = exports.normalize = exports.percentToIndex = exports.percentToRange = exports.toPercent = exports.base64FromArrayBuffer = exports.clamp = exports.parseIni = exports.parseViscolors = exports.getTimeStr = exports.getTimeObj = undefined;
-
-var _from = __webpack_require__(60);
-
-var _from2 = _interopRequireDefault(_from);
-
-var _set = __webpack_require__(39);
-
-var _set2 = _interopRequireDefault(_set);
-
-var _keys = __webpack_require__(24);
-
-var _keys2 = _interopRequireDefault(_keys);
-
-var _getIterator2 = __webpack_require__(31);
-
-var _getIterator3 = _interopRequireDefault(_getIterator2);
-
-var _assign = __webpack_require__(80);
-
-var _assign2 = _interopRequireDefault(_assign);
-
-var _toConsumableArray2 = __webpack_require__(82);
-
-var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
-
-exports.downloadURI = downloadURI;
-exports.debounce = debounce;
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var getTimeObj = exports.getTimeObj = function getTimeObj(time) {
- if (time == null) {
- // If we clean up `` we don't need to do this any more.
- return {
- minutesFirstDigit: " ",
- minutesSecondDigit: " ",
- secondsFirstDigit: " ",
- secondsSecondDigit: " "
- };
- }
- var minutes = Math.floor(time / 60);
- var seconds = time % 60;
-
- var digits = time == null ? [" ", " ", " ", " "] : [Math.floor(minutes / 10), Math.floor(minutes % 10), Math.floor(seconds / 10), Math.floor(seconds % 10)];
-
- var minutesFirstDigit = digits[0],
- minutesSecondDigit = digits[1],
- secondsFirstDigit = digits[2],
- secondsSecondDigit = digits[3];
-
-
- return {
- minutesFirstDigit: minutesFirstDigit,
- minutesSecondDigit: minutesSecondDigit,
- secondsFirstDigit: secondsFirstDigit,
- secondsSecondDigit: secondsSecondDigit
- };
-};
-
-var getTimeStr = exports.getTimeStr = function getTimeStr(time) {
- var truncate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
-
- if (time == null) {
- return "";
- }
-
- var _getTimeObj = getTimeObj(time),
- minutesFirstDigit = _getTimeObj.minutesFirstDigit,
- minutesSecondDigit = _getTimeObj.minutesSecondDigit,
- secondsFirstDigit = _getTimeObj.secondsFirstDigit,
- secondsSecondDigit = _getTimeObj.secondsSecondDigit;
-
- return [truncate ? minutesFirstDigit || "" : minutesFirstDigit, minutesSecondDigit, ":", secondsFirstDigit, secondsSecondDigit].join("");
-};
-
-var parseViscolors = exports.parseViscolors = function parseViscolors(text) {
- var entries = text.split("\n");
- var regex = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/;
- var colors = [];
- // changed to a hard number to deal with empty lines at the end...
- // plus it's only meant to be an exact quantity of numbers anyway.
- // - @PAEz
- for (var i = 0; i < 24; i++) {
- var matches = regex.exec(entries[i]);
- if (matches) {
- colors[i] = "rgb(" + matches.slice(1, 4).join(",") + ")";
- } else {
- console.error("Error in VISCOLOR.TXT on line " + i);
- }
- }
- return colors;
-};
-
-var SECTION_REGEX = /^\s*\[(.+?)\]\s*$/;
-var PROPERTY_REGEX = /^\s*([^;].*)\s*=\s*(.*)\s*$/;
-
-var parseIni = exports.parseIni = function parseIni(text) {
- var section = void 0,
- match = void 0;
- return text.split(/[\r\n]+/g).reduce(function (data, line) {
- if ((match = line.match(PROPERTY_REGEX)) && section != null) {
- var value = match[2].replace(/(^")|("$)|(^')|('$)/gi, "");
- data[section][match[1].trim().toLowerCase()] = value;
- } else if (match = line.match(SECTION_REGEX)) {
- section = match[1].trim().toLowerCase();
- data[section] = {};
- }
- return data;
- }, {});
-};
-
-var clamp = exports.clamp = function clamp(value, min, max) {
- return Math.min(Math.max(value, min), max);
-};
-
-var base64FromArrayBuffer = exports.base64FromArrayBuffer = function base64FromArrayBuffer(arrayBuffer) {
- var dataView = new Uint8Array(arrayBuffer);
- return window.btoa(String.fromCharCode.apply(String, (0, _toConsumableArray3.default)(dataView)));
-};
-
-// https://stackoverflow.com/a/15832662/1263117
-function downloadURI(uri, name) {
- var link = document.createElement("a");
- link.download = name;
- link.href = uri;
- window.document.body.appendChild(link);
- link.click();
- window.document.body.removeChild(link);
-}
-
-var toPercent = exports.toPercent = function toPercent(min, max, value) {
- return (value - min) / (max - min);
-};
-
-var percentToRange = exports.percentToRange = function percentToRange(percent, min, max) {
- return min + Math.round(percent * (max - min));
-};
-
-var percentToIndex = exports.percentToIndex = function percentToIndex(percent, length) {
- return percentToRange(percent, 0, length - 1);
-};
-
-var rebound = function rebound(oldMin, oldMax, newMin, newMax) {
- return function (oldValue) {
- return percentToRange(toPercent(oldMin, oldMax, oldValue), newMin, newMax);
- };
-};
-
-// Convert a .eqf value to a 1-100
-var normalize = exports.normalize = rebound(1, 64, 1, 100);
-
-// Convert a 0-100 to an .eqf value
-var denormalize = exports.denormalize = rebound(1, 100, 1, 64);
-
-// Merge a `source` object to a `target` recursively
-var merge = exports.merge = function merge(target, source) {
- // Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties
- var _iteratorNormalCompletion = true;
- var _didIteratorError = false;
- var _iteratorError = undefined;
-
- try {
- for (var _iterator = (0, _getIterator3.default)((0, _keys2.default)(source)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
- var key = _step.value;
-
- if (source[key] instanceof Object) (0, _assign2.default)(source[key], merge(target[key], source[key]));
- }
-
- // Join `target` and modified `source`
- } catch (err) {
- _didIteratorError = true;
- _iteratorError = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion && _iterator.return) {
- _iterator.return();
- }
- } finally {
- if (_didIteratorError) {
- throw _iteratorError;
- }
- }
- }
-
- (0, _assign2.default)(target || {}, source);
- return target;
-};
-
-// Maps a value in a range (defined my min/max) to a value in an array (options).
-var segment = exports.segment = function segment(min, max, value, newValues) {
- var ratio = toPercent(min, max, value);
- /*
- | 0 | 1 | 2 |
- 0 1 2 3
- */
- return newValues[percentToIndex(ratio, newValues.length)];
-};
-
-var arraysAreEqual = exports.arraysAreEqual = function arraysAreEqual(a, b) {
- return a.length === b.length && a.every(function (value, i) {
- return value === b[i];
- });
-};
-
-// https://bost.ocks.org/mike/shuffle/
-// Shuffle an array in O(n)
-var shuffle = exports.shuffle = function shuffle(array) {
- var sorted = [].concat((0, _toConsumableArray3.default)(array));
- var m = sorted.length;
-
- // While there remain elements to shuffle…
- while (m) {
- // Pick a remaining element…
- var i = Math.floor(Math.random() * m--);
-
- // And swap it with the current element.
- var val = sorted[m];
- sorted[m] = sorted[i];
- sorted[i] = val;
- }
-
- return sorted;
-};
-
-var sort = exports.sort = function sort(array, iteratee) {
- return [].concat((0, _toConsumableArray3.default)(array)).sort(function (a, b) {
- var aKey = iteratee(a);
- var bKey = iteratee(b);
- if (aKey < bKey) {
- return -1;
- } else if (aKey > bKey) {
- return 1;
- }
- return 0;
- });
-};
-
-var moveSelected = exports.moveSelected = function moveSelected(arr, isSelected, offset) {
- var newArr = new Array(arr.length);
- var next = 0;
- for (var i = 0; i < newArr.length; i++) {
- var from = i - offset;
- // Is a value supposed to move here?
- if (from >= 0 && from < arr.length && isSelected(from)) {
- newArr[i] = arr[from];
- } else {
- while (next < arr.length && isSelected(next)) {
- next++;
- }
- newArr[i] = arr[next];
- next++;
- }
- }
- return newArr;
-};
-
-var mapObject = exports.mapObject = function mapObject(obj, iteratee) {
- return (
- // TODO: Could return the original reference if no values change
- (0, _keys2.default)(obj).reduce(function (newObj, key) {
- newObj[key] = iteratee(obj[key], key);
- return newObj;
- }, {})
- );
-};
-
-var filterObject = exports.filterObject = function filterObject(obj, predicate) {
- return (
- // TODO: Could return the original reference if no values change
- (0, _keys2.default)(obj).reduce(function (newObj, key) {
- if (predicate(obj[key], key)) {
- newObj[key] = obj[key];
- }
- return newObj;
- }, {})
- );
-};
-
-var spliceIn = exports.spliceIn = function spliceIn(original, start, newValues) {
- var newArr = [].concat((0, _toConsumableArray3.default)(original));
- newArr.splice.apply(newArr, [start, 0].concat((0, _toConsumableArray3.default)(newValues)));
- return newArr;
-};
-
-var arrayWith = exports.arrayWith = function arrayWith(arr, value) {
- var s = new _set2.default(arr);
- s.add(value);
- return (0, _from2.default)(s);
-};
-
-var arrayWithout = exports.arrayWithout = function arrayWithout(arr, value) {
- var s = new _set2.default(arr);
- s.delete(value);
- return (0, _from2.default)(s);
-};
-
-function debounce(func, delay) {
- var token = void 0;
- return function () {
- var _this = this;
-
- for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
-
- if (token != null) {
- clearTimeout(token);
- }
- token = setTimeout(function () {
- func.apply(_this, args);
- }, delay);
- };
-}
-
-/***/ }),
-/* 14 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var store = __webpack_require__(70)('wks');
-var uid = __webpack_require__(55);
-var Symbol = __webpack_require__(16).Symbol;
-var USE_SYMBOL = typeof Symbol == 'function';
-
-var $exports = module.exports = function (name) {
- return store[name] || (store[name] =
- USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
-};
-
-$exports.store = store;
-
-
-/***/ }),
-/* 15 */
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = { "default": __webpack_require__(248), __esModule: true };
-
-/***/ }),
-/* 16 */
-/***/ (function(module, exports) {
-
-// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
-var global = module.exports = typeof window != 'undefined' && window.Math == Math
- ? window : typeof self != 'undefined' && self.Math == Math ? self
- // eslint-disable-next-line no-new-func
- : Function('return this')();
-if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
-
-
-/***/ }),
-/* 17 */
-/***/ (function(module, exports, __webpack_require__) {
-
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-if (false) {
- var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' &&
- Symbol.for &&
- Symbol.for('react.element')) ||
- 0xeac7;
-
- var isValidElement = function(object) {
- return typeof object === 'object' &&
- object !== null &&
- object.$$typeof === REACT_ELEMENT_TYPE;
- };
-
- // By explicitly using `prop-types` you are opting into new development behavior.
- // http://fb.me/prop-types-in-prod
- var throwOnDirectAccess = true;
- module.exports = require('./factoryWithTypeCheckers')(isValidElement, throwOnDirectAccess);
-} else {
- // By explicitly using `prop-types` you are opting into new production behavior.
- // http://fb.me/prop-types-in-prod
- module.exports = __webpack_require__(164)();
-}
-
-
-/***/ }),
-/* 18 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.getWindowGraph = exports.getPlaylistURL = exports.getMediaText = exports.getMinimalMediaText = exports.getCurrentTrackDisplayName = exports.getTrackDisplayName = exports.getDuration = exports.getPlaylist = exports.getVisibleTracks = exports.getTrackIsVisibleFunction = exports.getVisibleTrackIds = exports.getScrollOffset = exports.getPlaylistScrollPosition = exports.getOverflowTrackCount = exports.getNumberOfVisibleTracks = exports.nextTrack = exports.getCurrentTrackId = exports.getCurrentTrackNumber = exports.getCurrentTrackIndex = exports.getRunningTimeMessage = exports.getSelectedTrackObjects = exports.getOrderedTracks = exports.getTrackCount = exports.getTracks = exports.getEqfData = undefined;
-
-var _extends2 = __webpack_require__(12);
-
-var _extends3 = _interopRequireDefault(_extends2);
-
-var _keys = __webpack_require__(24);
-
-var _keys2 = _interopRequireDefault(_keys);
-
-var _getIterator2 = __webpack_require__(31);
-
-var _getIterator3 = _interopRequireDefault(_getIterator2);
-
-var _values = __webpack_require__(236);
-
-var _values2 = _interopRequireDefault(_values);
-
-exports.getWindowPositions = getWindowPositions;
-exports.getPlaylistWindowPixelSize = getPlaylistWindowPixelSize;
-exports.getWindowSizes = getWindowSizes;
-
-var _reselect = __webpack_require__(239);
-
-var _utils = __webpack_require__(13);
-
-var _constants = __webpack_require__(8);
-
-var _playlistHtml = __webpack_require__(240);
-
-var _playlist = __webpack_require__(113);
-
-var fromPlaylist = _interopRequireWildcard(_playlist);
-
-var _resizeUtils = __webpack_require__(121);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var getEqfData = exports.getEqfData = function getEqfData(state) {
- var sliders = state.equalizer.sliders;
-
- var preset = {
- name: "Entry1",
- preamp: (0, _utils.denormalize)(sliders.preamp)
- };
- _constants.BANDS.forEach(function (band) {
- preset["hz" + band] = (0, _utils.denormalize)(sliders[band]);
- });
- var eqfData = {
- presets: [preset],
- type: "Winamp EQ library file v1.1"
- };
- return eqfData;
-};
-
-var getTracks = exports.getTracks = function getTracks(state) {
- return state.playlist.tracks;
-};
-var getTrackOrder = function getTrackOrder(state) {
- return state.playlist.trackOrder;
-};
-
-var getTrackCount = exports.getTrackCount = (0, _reselect.createSelector)(getTrackOrder, function (trackOrder) {
- return trackOrder.length;
-});
-
-var getOrderedTracks = exports.getOrderedTracks = (0, _reselect.createSelector)(getTracks, getTrackOrder, function (tracks, trackOrder) {
- return trackOrder.filter(function (id) {
- return tracks[id];
- });
-});
-
-var getOrderedTrackObjects = (0, _reselect.createSelector)(getTracks, getOrderedTracks, function (tracks, trackOrder) {
- return trackOrder.map(function (id) {
- return tracks[id];
- });
-});
-
-var getSelectedTrackObjects = exports.getSelectedTrackObjects = (0, _reselect.createSelector)(getOrderedTrackObjects, function (tracks) {
- return tracks.filter(function (track) {
- return track.selected;
- });
-});
-
-// If a duration is `null`, it counts as zero, which seems fine enough.
-var runningTimeFromTracks = function runningTimeFromTracks(tracks) {
- return tracks.reduce(function (time, track) {
- return time + Number(track.duration);
- }, 0);
-};
-
-var getTotalRunningTime = (0, _reselect.createSelector)(getOrderedTrackObjects, runningTimeFromTracks);
-
-var getSelectedRunningTime = (0, _reselect.createSelector)(getSelectedTrackObjects, runningTimeFromTracks);
-
-// Note: We should append "+" to these values if some of the tracks are of unknown time.
-var getRunningTimeMessage = exports.getRunningTimeMessage = (0, _reselect.createSelector)(getTotalRunningTime, getSelectedRunningTime, function (totalRunningTime, selectedRunningTime) {
- return (0, _utils.getTimeStr)(selectedRunningTime) + "/" + (0, _utils.getTimeStr)(totalRunningTime);
-});
-
-// TODO: use slectors to get memoization
-var getCurrentTrackIndex = exports.getCurrentTrackIndex = function getCurrentTrackIndex(state) {
- return state.playlist.trackOrder.indexOf(state.playlist.currentTrack);
-};
-
-var getCurrentTrackNumber = exports.getCurrentTrackNumber = (0, _reselect.createSelector)(getCurrentTrackIndex, function (currentTrackIndex) {
- return currentTrackIndex + 1;
-});
-
-var getCurrentTrackId = exports.getCurrentTrackId = function getCurrentTrackId(state) {
- return state.playlist.currentTrack;
-};
-
-var nextTrack = exports.nextTrack = function nextTrack(state) {
- var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
- var trackOrder = state.playlist.trackOrder,
- repeat = state.media.repeat;
-
- var trackCount = getTrackCount(state);
- if (trackCount === 0) {
- return null;
- }
-
- var currentIndex = getCurrentTrackIndex(state);
-
- var nextIndex = currentIndex + n;
- if (repeat) {
- nextIndex = nextIndex % trackCount;
- if (nextIndex < 0) {
- // Handle wrapping around backwards
- nextIndex += trackCount;
- }
- return trackOrder[nextIndex];
- }
-
- if (currentIndex === trackCount - 1 && n > 0) {
- return null;
- } else if (currentIndex === 0 && n < 0) {
- return null;
- }
-
- nextIndex = (0, _utils.clamp)(nextIndex, 0, trackCount - 1);
- return trackOrder[nextIndex];
-};
-
-var BASE_WINDOW_HEIGHT = 58;
-var getNumberOfVisibleTracks = exports.getNumberOfVisibleTracks = function getNumberOfVisibleTracks(state) {
- var playlistSize = state.display.playlistSize;
-
- return Math.floor((BASE_WINDOW_HEIGHT + _constants.PLAYLIST_RESIZE_SEGMENT_HEIGHT * playlistSize[1]) / _constants.TRACK_HEIGHT);
-};
-
-var getOverflowTrackCount = exports.getOverflowTrackCount = (0, _reselect.createSelector)(getTrackCount, getNumberOfVisibleTracks, function (trackCount, numberOfVisibleTracks) {
- return Math.max(0, trackCount - numberOfVisibleTracks);
-});
-
-var _getPlaylistScrollPosition = function _getPlaylistScrollPosition(state) {
- return state.display.playlistScrollPosition;
-};
-
-var getPlaylistScrollPosition = exports.getPlaylistScrollPosition = (0, _reselect.createSelector)(getOverflowTrackCount, _getPlaylistScrollPosition, function (overflowTrackCount, playlistScrollPosition) {
- if (overflowTrackCount === 0) {
- return 0;
- }
- return Math.round(Math.round(overflowTrackCount * playlistScrollPosition / 100) / overflowTrackCount * 100);
-});
-
-var getScrollOffset = exports.getScrollOffset = (0, _reselect.createSelector)(_getPlaylistScrollPosition, getTrackCount, getNumberOfVisibleTracks, function (playlistScrollPosition, trackCount, numberOfVisibleTracks) {
- var overflow = Math.max(0, trackCount - numberOfVisibleTracks);
- return (0, _utils.percentToIndex)(playlistScrollPosition / 100, overflow + 1);
-});
-
-var getVisibleTrackIds = exports.getVisibleTrackIds = (0, _reselect.createSelector)(getScrollOffset, getTrackOrder, getNumberOfVisibleTracks, function (offset, trackOrder, numberOfVisibleTracks) {
- return trackOrder.slice(offset, offset + numberOfVisibleTracks);
-});
-
-var getTrackIsVisibleFunction = exports.getTrackIsVisibleFunction = (0, _reselect.createSelector)(getVisibleTrackIds, function (visibleTrackIds) {
- return function (id) {
- return visibleTrackIds.includes(id);
- };
-});
-
-var getVisibleTracks = exports.getVisibleTracks = (0, _reselect.createSelector)(getVisibleTrackIds, getTracks, function (visibleTrackIds, tracks) {
- return visibleTrackIds.map(function (id) {
- return tracks[id];
- });
-});
-
-var getPlaylist = exports.getPlaylist = function getPlaylist(state) {
- return state.playlist;
-};
-
-var getDuration = exports.getDuration = function getDuration(state) {
- var currentTrack = state.playlist.tracks[state.playlist.currentTrack];
- return currentTrack && currentTrack.duration;
-};
-
-var getTrackDisplayName = exports.getTrackDisplayName = function getTrackDisplayName(state, trackId) {
- return fromPlaylist.getTrackDisplayName(getPlaylist(state), trackId);
-};
-
-var getCurrentTrackDisplayName = exports.getCurrentTrackDisplayName = function getCurrentTrackDisplayName(state) {
- var id = getCurrentTrackId(state);
- return getTrackDisplayName(state, id);
-};
-
-var getMinimalMediaText = exports.getMinimalMediaText = (0, _reselect.createSelector)(getCurrentTrackNumber, getCurrentTrackDisplayName, function (trackNumber, name) {
- return name == null ? null : trackNumber + ". " + name;
-});
-
-var getMediaText = exports.getMediaText = (0, _reselect.createSelector)(getMinimalMediaText, getDuration, function (minimalMediaText, duration) {
- return minimalMediaText == null ? null : // TODO: Maybe the ` *** ` should actually be added by the marquee
- minimalMediaText + " (" + (0, _utils.getTimeStr)(duration) + ") *** ";
-});
-
-var getNumberOfTracks = function getNumberOfTracks(state) {
- return getTrackOrder(state).length;
-};
-var getPlaylistDuration = (0, _reselect.createSelector)(getTracks, function (tracks) {
- return (0, _values2.default)(tracks).reduce(function (total, track) {
- return total + track.duration;
- }, 0);
-});
-
-// TODO: Move to action creator
-var getPlaylistURL = exports.getPlaylistURL = (0, _reselect.createSelector)(function (state) {
- return state;
-}, getNumberOfTracks, getPlaylistDuration, getTrackOrder, getTracks, function (state, numberOfTracks, playlistDuration, trackOrder, tracks) {
- return (0, _playlistHtml.createPlaylistURL)({
- numberOfTracks: numberOfTracks,
- averageTrackLength: (0, _utils.getTimeStr)(playlistDuration / numberOfTracks),
- // TODO: Handle hours
- playlistLengthMinutes: Math.floor(playlistDuration / 60),
- playlistLengthSeconds: Math.floor(playlistDuration % 60),
- tracks: trackOrder.map(function (id, i) {
- return i + 1 + ". " + getTrackDisplayName(state, id) + " (" + (0, _utils.getTimeStr)(tracks[id].duration) + ")";
- })
- });
-});
-
-function getWindowPositions(state) {
- return state.windows.positions;
-}
-
-var WINDOW_WIDTH = 275;
-var WINDOW_HEIGHT = 116;
-var DEFAUT_WINDOW_SIZE = {
- height: WINDOW_HEIGHT,
- width: WINDOW_WIDTH
-};
-var SHADE_WINDOW_HEIGHT = 14;
-
-function getPlaylistWindowPixelSize(state) {
- var playlistSize = state.display.playlistSize;
-
- return {
- height: WINDOW_HEIGHT + playlistSize[1] * _constants.PLAYLIST_RESIZE_SEGMENT_HEIGHT,
- width: _constants.MIN_PLAYLIST_WINDOW_WIDTH + playlistSize[0] * _constants.PLAYLIST_RESIZE_SEGMENT_WIDTH
- };
-}
-
-function getGenericWindowSize(size, shade, doubled) {
- var doubledMultiplier = doubled ? 2 : 1;
- return {
- height: (shade ? SHADE_WINDOW_HEIGHT : size.height) * doubledMultiplier,
- width: size.width * doubledMultiplier
- };
-}
-
-function getWindowSizes(state) {
- var _state$display = state.display,
- doubled = _state$display.doubled,
- mainShade = _state$display.mainShade,
- equalizerShade = _state$display.equalizerShade,
- playlistShade = _state$display.playlistShade;
-
- var main = getGenericWindowSize(DEFAUT_WINDOW_SIZE, mainShade, doubled);
- var equalizer = getGenericWindowSize(DEFAUT_WINDOW_SIZE, equalizerShade, doubled);
- var playlist = getGenericWindowSize(getPlaylistWindowPixelSize(state), playlistShade, false // The playlist cannot be doubled
- );
- return { main: main, equalizer: equalizer, playlist: playlist };
-}
-
-var getWindowGraph = exports.getWindowGraph = (0, _reselect.createSelector)(getWindowPositions, getWindowSizes, function (windowPositions, windowSizes) {
- var windowData = [];
- var _iteratorNormalCompletion = true;
- var _didIteratorError = false;
- var _iteratorError = undefined;
-
- try {
- for (var _iterator = (0, _getIterator3.default)((0, _keys2.default)(windowPositions)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
- var key = _step.value;
-
- windowData.push((0, _extends3.default)({ key: key }, windowPositions[key], windowSizes[key]));
- }
- } catch (err) {
- _didIteratorError = true;
- _iteratorError = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion && _iterator.return) {
- _iterator.return();
- }
- } finally {
- if (_didIteratorError) {
- throw _iteratorError;
- }
- }
- }
-
- return (0, _resizeUtils.generateGraph)(windowData);
-});
-
-/***/ }),
-/* 19 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var anObject = __webpack_require__(21);
-var IE8_DOM_DEFINE = __webpack_require__(89);
-var toPrimitive = __webpack_require__(67);
-var dP = Object.defineProperty;
-
-exports.f = __webpack_require__(22) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
- anObject(O);
- P = toPrimitive(P, true);
- anObject(Attributes);
- if (IE8_DOM_DEFINE) try {
- return dP(O, P, Attributes);
- } catch (e) { /* empty */ }
- if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
- if ('value' in Attributes) O[P] = Attributes.value;
- return O;
-};
-
-
-/***/ }),
-/* 20 */
-/***/ (function(module, exports) {
-
-module.exports = function (it) {
- return typeof it === 'object' ? it !== null : typeof it === 'function';
-};
-
-
-/***/ }),
-/* 21 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var isObject = __webpack_require__(20);
-module.exports = function (it) {
- if (!isObject(it)) throw TypeError(it + ' is not an object!');
- return it;
-};
-
-
-/***/ }),
-/* 22 */
-/***/ (function(module, exports, __webpack_require__) {
-
-// Thank's IE8 for his funny defineProperty
-module.exports = !__webpack_require__(28)(function () {
- return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
-});
-
-
-/***/ }),
-/* 23 */
-/***/ (function(module, exports, __webpack_require__) {
-
-// optional / simple context binding
-var aFunction = __webpack_require__(40);
-module.exports = function (fn, that, length) {
- aFunction(fn);
- if (that === undefined) return fn;
- switch (length) {
- case 1: return function (a) {
- return fn.call(that, a);
- };
- case 2: return function (a, b) {
- return fn.call(that, a, b);
- };
- case 3: return function (a, b, c) {
- return fn.call(that, a, b, c);
- };
- }
- return function (/* ...args */) {
- return fn.apply(that, arguments);
- };
-};
-
-
-/***/ }),
-/* 24 */
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = { "default": __webpack_require__(221), __esModule: true };
-
-/***/ }),
-/* 25 */
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__(136);
-
-
-/***/ }),
-/* 26 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-exports.__esModule = true;
-
-var _promise = __webpack_require__(51);
-
-var _promise2 = _interopRequireDefault(_promise);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = function (fn) {
- return function () {
- var gen = fn.apply(this, arguments);
- return new _promise2.default(function (resolve, reject) {
- function step(key, arg) {
- try {
- var info = gen[key](arg);
- var value = info.value;
- } catch (error) {
- reject(error);
- return;
- }
-
- if (info.done) {
- resolve(value);
- } else {
- return _promise2.default.resolve(value).then(function (value) {
- step("next", value);
- }, function (err) {
- step("throw", err);
- });
- }
- }
-
- return step("next");
- });
- };
-};
-
-/***/ }),
-/* 27 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var dP = __webpack_require__(19);
-var createDesc = __webpack_require__(41);
-module.exports = __webpack_require__(22) ? function (object, key, value) {
- return dP.f(object, key, createDesc(1, value));
-} : function (object, key, value) {
- object[key] = value;
- return object;
-};
-
-
-/***/ }),
-/* 28 */
-/***/ (function(module, exports) {
-
-module.exports = function (exec) {
- try {
- return !!exec();
- } catch (e) {
- return true;
- }
-};
-
-
-/***/ }),
-/* 29 */
-/***/ (function(module, exports) {
-
-var hasOwnProperty = {}.hasOwnProperty;
-module.exports = function (it, key) {
- return hasOwnProperty.call(it, key);
-};
-
-
-/***/ }),
-/* 30 */
-/***/ (function(module, exports, __webpack_require__) {
-
-// to indexed object, toObject with fallback for non-array-like ES3 strings
-var IObject = __webpack_require__(68);
-var defined = __webpack_require__(64);
-module.exports = function (it) {
- return IObject(defined(it));
-};
-
-
-/***/ }),
-/* 31 */
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = { "default": __webpack_require__(223), __esModule: true };
-
-/***/ }),
-/* 32 */
-/***/ (function(module, exports) {
-
-/*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
-*/
-// css base code, injected by the css-loader
-module.exports = function(useSourceMap) {
- var list = [];
-
- // return the list of modules as css string
- list.toString = function toString() {
- return this.map(function (item) {
- var content = cssWithMappingToString(item, useSourceMap);
- if(item[2]) {
- return "@media " + item[2] + "{" + content + "}";
- } else {
- return content;
- }
- }).join("");
- };
-
- // import a list of modules into the list
- list.i = function(modules, mediaQuery) {
- if(typeof modules === "string")
- modules = [[null, modules, ""]];
- var alreadyImportedModules = {};
- for(var i = 0; i < this.length; i++) {
- var id = this[i][0];
- if(typeof id === "number")
- alreadyImportedModules[id] = true;
- }
- for(i = 0; i < modules.length; i++) {
- var item = modules[i];
- // skip already imported module
- // this implementation is not 100% perfect for weird media query combinations
- // when a module is imported multiple times with different media queries.
- // I hope this will never occur (Hey this way we have smaller bundles)
- if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
- if(mediaQuery && !item[2]) {
- item[2] = mediaQuery;
- } else if(mediaQuery) {
- item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
- }
- list.push(item);
- }
- }
- };
- return list;
-};
-
-function cssWithMappingToString(item, useSourceMap) {
- var content = item[1] || '';
- var cssMapping = item[3];
- if (!cssMapping) {
- return content;
- }
-
- if (useSourceMap && typeof btoa === 'function') {
- var sourceMapping = toComment(cssMapping);
- var sourceURLs = cssMapping.sources.map(function (source) {
- return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'
- });
-
- return [content].concat(sourceURLs).concat([sourceMapping]).join('\n');
- }
-
- return [content].join('\n');
-}
-
-// Adapted from convert-source-map (MIT)
-function toComment(sourceMap) {
- // eslint-disable-next-line no-undef
- var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));
- var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;
-
- return '/*# ' + data + ' */';
-}
-
-
-/***/ }),
-/* 33 */
-/***/ (function(module, exports, __webpack_require__) {
-
-/*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
-*/
-
-var stylesInDom = {};
-
-var memoize = function (fn) {
- var memo;
-
- return function () {
- if (typeof memo === "undefined") memo = fn.apply(this, arguments);
- return memo;
- };
-};
-
-var isOldIE = memoize(function () {
- // Test for IE <= 9 as proposed by Browserhacks
- // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805
- // Tests for existence of standard globals is to allow style-loader
- // to operate correctly into non-standard environments
- // @see https://github.com/webpack-contrib/style-loader/issues/177
- return window && document && document.all && !window.atob;
-});
-
-var getElement = (function (fn) {
- var memo = {};
-
- return function(selector) {
- if (typeof memo[selector] === "undefined") {
- var styleTarget = fn.call(this, selector);
- // Special case to return head of iframe instead of iframe itself
- if (styleTarget instanceof window.HTMLIFrameElement) {
- try {
- // This will throw an exception if access to iframe is blocked
- // due to cross-origin restrictions
- styleTarget = styleTarget.contentDocument.head;
- } catch(e) {
- styleTarget = null;
- }
- }
- memo[selector] = styleTarget;
- }
- return memo[selector]
- };
-})(function (target) {
- return document.querySelector(target)
-});
-
-var singleton = null;
-var singletonCounter = 0;
-var stylesInsertedAtTop = [];
-
-var fixUrls = __webpack_require__(269);
-
-module.exports = function(list, options) {
- if (typeof DEBUG !== "undefined" && DEBUG) {
- if (typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
- }
-
- options = options || {};
-
- options.attrs = typeof options.attrs === "object" ? options.attrs : {};
-
- // Force single-tag solution on IE6-9, which has a hard limit on the # of