From 95dd75bc1c4b640be19ea06118b4c91b79d2d2c9 Mon Sep 17 00:00:00 2001 From: Tyler Vigario Date: Wed, 20 May 2020 15:36:22 -0700 Subject: [PATCH] Update WebPack --- static/js/main.js | 2 +- static/js/main.js.LICENSE.txt | 54 ----------------------------------- templates/index.html | 29 +++++++++---------- templates/need_token.html | 14 ++++----- web/webpack.config.js | 2 +- 5 files changed, 23 insertions(+), 78 deletions(-) delete mode 100644 static/js/main.js.LICENSE.txt diff --git a/static/js/main.js b/static/js/main.js index 19ce05d..97d2801 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -1768,7 +1768,7 @@ eval("// jQuery 3.x\nwindow.$ = window.jQuery = __webpack_require__(/*! jquery/d /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_symbol__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.symbol */ \"./node_modules/core-js/modules/es.symbol.js\");\n/* harmony import */ var core_js_modules_es_symbol__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_symbol_description__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.symbol.description */ \"./node_modules/core-js/modules/es.symbol.description.js\");\n/* harmony import */ var core_js_modules_es_symbol_description__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_symbol_iterator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator */ \"./node_modules/core-js/modules/es.symbol.iterator.js\");\n/* harmony import */ var core_js_modules_es_symbol_iterator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_array_find__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.array.find */ \"./node_modules/core-js/modules/es.array.find.js\");\n/* harmony import */ var core_js_modules_es_array_find__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_find__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.array.for-each */ \"./node_modules/core-js/modules/es.array.for-each.js\");\n/* harmony import */ var core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_array_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.array.from */ \"./node_modules/core-js/modules/es.array.from.js\");\n/* harmony import */ var core_js_modules_es_array_from__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_from__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_array_includes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.array.includes */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_array_is_array__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.array.is-array */ \"./node_modules/core-js/modules/es.array.is-array.js\");\n/* harmony import */ var core_js_modules_es_array_is_array__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_is_array__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_array_iterator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.array.iterator */ \"./node_modules/core-js/modules/es.array.iterator.js\");\n/* harmony import */ var core_js_modules_es_array_iterator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.array.join */ \"./node_modules/core-js/modules/es.array.join.js\");\n/* harmony import */ var core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.array.map */ \"./node_modules/core-js/modules/es.array.map.js\");\n/* harmony import */ var core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es_array_slice__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.array.slice */ \"./node_modules/core-js/modules/es.array.slice.js\");\n/* harmony import */ var core_js_modules_es_array_slice__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_slice__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es_date_to_string__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.date.to-string */ \"./node_modules/core-js/modules/es.date.to-string.js\");\n/* harmony import */ var core_js_modules_es_date_to_string__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_date_to_string__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var core_js_modules_es_function_name__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.function.name */ \"./node_modules/core-js/modules/es.function.name.js\");\n/* harmony import */ var core_js_modules_es_function_name__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.object.to-string */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n/* harmony import */ var core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var core_js_modules_es_object_values__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.object.values */ \"./node_modules/core-js/modules/es.object.values.js\");\n/* harmony import */ var core_js_modules_es_object_values__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_values__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var core_js_modules_es_parse_int__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! core-js/modules/es.parse-int */ \"./node_modules/core-js/modules/es.parse-int.js\");\n/* harmony import */ var core_js_modules_es_parse_int__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_parse_int__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! core-js/modules/es.regexp.exec */ \"./node_modules/core-js/modules/es.regexp.exec.js\");\n/* harmony import */ var core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! core-js/modules/es.regexp.to-string */ \"./node_modules/core-js/modules/es.regexp.to-string.js\");\n/* harmony import */ var core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var core_js_modules_es_string_includes__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! core-js/modules/es.string.includes */ \"./node_modules/core-js/modules/es.string.includes.js\");\n/* harmony import */ var core_js_modules_es_string_includes__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_includes__WEBPACK_IMPORTED_MODULE_19__);\n/* harmony import */ var core_js_modules_es_string_iterator__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! core-js/modules/es.string.iterator */ \"./node_modules/core-js/modules/es.string.iterator.js\");\n/* harmony import */ var core_js_modules_es_string_iterator__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator__WEBPACK_IMPORTED_MODULE_20__);\n/* harmony import */ var core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! core-js/modules/es.string.replace */ \"./node_modules/core-js/modules/es.string.replace.js\");\n/* harmony import */ var core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_21__);\n/* harmony import */ var core_js_modules_es_string_split__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! core-js/modules/es.string.split */ \"./node_modules/core-js/modules/es.string.split.js\");\n/* harmony import */ var core_js_modules_es_string_split__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_split__WEBPACK_IMPORTED_MODULE_22__);\n/* harmony import */ var core_js_modules_es_string_trim__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! core-js/modules/es.string.trim */ \"./node_modules/core-js/modules/es.string.trim.js\");\n/* harmony import */ var core_js_modules_es_string_trim__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_trim__WEBPACK_IMPORTED_MODULE_23__);\n/* harmony import */ var core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each */ \"./node_modules/core-js/modules/web.dom-collections.for-each.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_24__);\n/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_25__);\n/* harmony import */ var core_js_modules_web_timers__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! core-js/modules/web.timers */ \"./node_modules/core-js/modules/web.timers.js\");\n/* harmony import */ var core_js_modules_web_timers__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_timers__WEBPACK_IMPORTED_MODULE_26__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(o) { if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n$('#uploadSelectFile').on('change', function () {\n //get the file name\n var fileName = $(this).val().replace('C:\\\\fakepath\\\\', \" \"); //replace the \"Choose a file\" label\n\n $(this).next('.custom-file-label').html(fileName);\n}); // ----------------------\n// ------ Playlist ------\n// ----------------------\n\nvar pl_item_template = $(\".playlist-item-template\");\nvar pl_id_element = $(\".playlist-item-id\");\nvar pl_index_element = $(\".playlist-item-index\");\nvar pl_title_element = $(\".playlist-item-title\");\nvar pl_artist_element = $(\".playlist-item-artist\");\nvar pl_thumb_element = $(\".playlist-item-thumbnail\");\nvar pl_type_element = $(\".playlist-item-type\");\nvar pl_path_element = $(\".playlist-item-path\");\nvar pl_tag_edit_element = $(\".playlist-item-edit\");\nvar notag_element = $(\".library-item-notag\"); // these elements are shared with library\n\nvar tag_element = $(\".library-item-tag\");\nvar add_tag_modal = $(\"#addTagModal\");\nvar playlist_loading = $(\"#playlist-loading\");\nvar playlist_table = $(\"#playlist-table\");\nvar playlist_empty = $(\"#playlist-empty\");\nvar playlist_expand = $(\".playlist-expand\");\nvar playlist_items = null;\nvar playlist_ver = 0;\nvar playlist_current_index = 0;\nvar playlist_range_from = 0;\nvar playlist_range_to = 0;\nvar last_volume = 0;\nvar playing = false;\nvar playPauseBtn = $('#play-pause-btn');\nvar fastForwardBtn = $('#fast-forward-btn');\nvar playModeBtns = {\n 'one-shot': $('#one-shot-mode-btn'),\n random: $('#random-mode-btn'),\n repeat: $('#repeat-mode-btn'),\n autoplay: $('#autoplay-mode-btn')\n};\nvar playModeIcon = {\n 'one-shot': 'fa-tasks',\n random: 'fa-random',\n repeat: 'fa-redo',\n autoplay: 'fa-robot'\n};\n\nfunction request(_url, _data) {\n var refresh = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n console.log(_data);\n $.ajax({\n type: 'POST',\n url: _url,\n data: _data,\n statusCode: {\n 200: function _(data) {\n if (data.ver !== playlist_ver) {\n checkForPlaylistUpdate();\n }\n\n updateControls(data.empty, data.play, data.mode, data.volume);\n updatePlayerPlayhead(data.playhead);\n },\n 403: function _() {\n location.reload(true);\n }\n }\n });\n\n if (refresh) {\n location.reload(true);\n }\n}\n\nfunction addPlaylistItem(item) {\n pl_id_element.val(item.id);\n pl_index_element.html(item.index + 1);\n pl_title_element.html(item.title);\n pl_artist_element.html(item.artist);\n pl_thumb_element.attr(\"src\", item.thumbnail);\n pl_type_element.html(item.type);\n pl_path_element.html(item.path);\n var item_copy = pl_item_template.clone();\n item_copy.attr(\"id\", \"playlist-item-\" + item.index);\n item_copy.addClass(\"playlist-item\").removeClass(\"d-none\");\n var tags = item_copy.find(\".playlist-item-tags\");\n tags.empty();\n var tag_edit_copy = pl_tag_edit_element.clone();\n tag_edit_copy.click(function () {\n addTagModalShow(item.id, item.title, item.tags);\n });\n tag_edit_copy.appendTo(tags);\n\n if (item.tags.length > 0) {\n item.tags.forEach(function (tag_tuple) {\n var tag_copy = tag_element.clone();\n tag_copy.html(tag_tuple[0]);\n tag_copy.addClass(\"badge-\" + tag_tuple[1]);\n tag_copy.appendTo(tags);\n });\n } else {\n var tag_copy = notag_element.clone();\n tag_copy.appendTo(tags);\n }\n\n item_copy.appendTo(playlist_table);\n}\n\nfunction displayPlaylist(data) {\n playlist_table.animate({\n opacity: 0\n }, 200, function () {\n playlist_loading.hide();\n $(\".playlist-item\").remove();\n var items = data.items;\n playlist_items = items;\n var length = data.length;\n var start_from = data.start_from;\n playlist_range_from = start_from;\n playlist_range_to = start_from + items.length - 1;\n\n if (items.length < length && start_from > 0) {\n var _from = start_from - 5;\n\n _from = _from > 0 ? _from : 0;\n\n var _to = start_from - 1;\n\n if (_to > 0) {\n insertExpandPrompt(_from, start_from + length - 1, _from, _to, length);\n }\n }\n\n items.forEach(function (item) {\n addPlaylistItem(item);\n });\n\n if (items.length < length && start_from + items.length < length) {\n var _from2 = start_from + items.length;\n\n var _to2 = start_from + items.length - 1 + 10;\n\n _to2 = _to2 < length - 1 ? _to2 : length - 1;\n\n if (start_from + items.length < _to2) {\n insertExpandPrompt(start_from, _to2, _from2, _to2, length);\n }\n }\n\n displayActiveItem(data.current_index);\n updatePlayerInfo(items[data.current_index - data.start_from]);\n bindPlaylistEvent();\n playlist_table.animate({\n opacity: 1\n }, 200);\n });\n}\n\nfunction displayActiveItem(current_index) {\n $(\".playlist-item\").removeClass(\"table-active\");\n $(\"#playlist-item-\" + current_index).addClass(\"table-active\");\n}\n\nfunction insertExpandPrompt(real_from, real_to, display_from, display_to, total_length) {\n var expand_copy = playlist_expand.clone();\n expand_copy.addClass('playlist-item');\n expand_copy.removeClass('d-none');\n\n if (display_from !== display_to) {\n expand_copy.find(\".playlist-expand-item-range\").html(display_from + 1 + \"~\" + (display_to + 1) + \" of \" + total_length + \" items\");\n } else {\n expand_copy.find(\".playlist-expand-item-range\").html(display_from + \" of \" + total_length + \" items\");\n }\n\n expand_copy.addClass('playlist-item');\n expand_copy.appendTo(playlist_table);\n expand_copy.click(function () {\n playlist_range_from = real_from;\n playlist_range_to = real_to;\n updatePlaylist();\n });\n}\n\nfunction updatePlaylist() {\n playlist_table.animate({\n opacity: 0\n }, 200, function () {\n playlist_empty.addClass('d-none');\n playlist_loading.show();\n playlist_table.find(\".playlist-item\").css(\"opacity\", 0);\n var data = {};\n\n if (!(playlist_range_from === 0 && playlist_range_to === 0)) {\n data = {\n range_from: playlist_range_from,\n range_to: playlist_range_to\n };\n }\n\n $.ajax({\n type: 'GET',\n url: 'playlist',\n data: data,\n statusCode: {\n 200: displayPlaylist,\n 204: function _() {\n playlist_loading.hide();\n playlist_empty.removeClass('d-none');\n $(\".playlist-item\").remove();\n }\n }\n });\n playlist_table.animate({\n opacity: 1\n }, 200);\n });\n}\n\nfunction checkForPlaylistUpdate() {\n $.ajax({\n type: 'POST',\n url: 'post',\n statusCode: {\n 200: function _(data) {\n if (data.ver !== playlist_ver) {\n playlist_ver = data.ver;\n playlist_range_from = 0;\n playlist_range_to = 0;\n updatePlaylist();\n }\n\n if (data.current_index !== playlist_current_index) {\n if (data.current_index !== -1) {\n if (data.current_index > playlist_range_to || data.current_index < playlist_range_from) {\n playlist_range_from = 0;\n playlist_range_to = 0;\n updatePlaylist();\n } else {\n playlist_current_index = data.current_index;\n updatePlayerInfo(playlist_items[data.current_index - data.start_from]);\n displayActiveItem(data.current_index);\n }\n }\n }\n\n updateControls(data.empty, data.play, data.mode, data.volume);\n\n if (!data.empty) {\n updatePlayerPlayhead(data.playhead);\n }\n }\n }\n });\n}\n\nfunction bindPlaylistEvent() {\n $(\".playlist-item-play\").unbind().click(function (e) {\n request('post', {\n 'play_music': $(e.currentTarget).parent().parent().parent().find(\".playlist-item-index\").html() - 1\n });\n });\n $(\".playlist-item-trash\").unbind().click(function (e) {\n request('post', {\n 'delete_music': $(e.currentTarget).parent().parent().parent().find(\".playlist-item-index\").html() - 1\n });\n });\n}\n\nfunction updateControls(empty, play, mode, volume) {\n updatePlayerControls(play, empty);\n\n if (empty) {\n playPauseBtn.prop('disabled', true);\n fastForwardBtn.prop('disabled', true);\n } else {\n playPauseBtn.prop('disabled', false);\n fastForwardBtn.prop('disabled', false);\n\n if (play) {\n playing = true;\n playPauseBtn.find('[data-fa-i2svg]').removeClass('fa-play').addClass('fa-pause');\n } else {\n playing = false;\n playPauseBtn.find('[data-fa-i2svg]').removeClass('fa-pause').addClass('fa-play');\n }\n }\n\n for (var _i2 = 0, _Object$values = Object.values(playModeBtns); _i2 < _Object$values.length; _i2++) {\n var otherMode = _Object$values[_i2];\n otherMode.removeClass('active');\n }\n\n playModeBtns[mode].addClass('active');\n var playModeIndicator = $('#modeIndicator');\n\n for (var _i3 = 0, _Object$values2 = Object.values(playModeIcon); _i3 < _Object$values2.length; _i3++) {\n var icon_class = _Object$values2[_i3];\n playModeIndicator.removeClass(icon_class);\n }\n\n playModeIndicator.addClass(playModeIcon[mode]);\n\n if (volume !== last_volume) {\n last_volume = volume;\n\n if (volume > 1) {\n document.getElementById(\"volume-slider\").value = 1;\n } else if (volume < 0) {\n document.getElementById(\"volume-slider\").value = 0;\n } else {\n document.getElementById(\"volume-slider\").value = volume;\n }\n }\n}\n\nfunction togglePlayPause() {\n if (playing) {\n request('post', {\n action: 'pause'\n });\n } else {\n request('post', {\n action: 'resume'\n });\n }\n}\n\nfunction changePlayMode(mode) {\n request('post', {\n action: mode\n });\n} // ----------------------\n// --- THEME SWITCHER ---\n// ----------------------\n\n\nfunction themeInit() {\n var theme = localStorage.getItem(\"theme\");\n\n if (theme !== null) {\n setPageTheme(theme);\n }\n}\n\nfunction switchTheme() {\n var theme = localStorage.getItem(\"theme\");\n\n if (theme === \"light\" || theme === null) {\n setPageTheme(\"dark\");\n localStorage.setItem(\"theme\", \"dark\");\n } else {\n setPageTheme(\"light\");\n localStorage.setItem(\"theme\", \"light\");\n }\n}\n\nfunction setPageTheme(theme) {\n return;\n if (theme === \"light\") document.getElementById(\"pagestyle\").setAttribute(\"href\", \"web/build/assets/css/bootstrap.min.css\");else if (theme === \"dark\") document.getElementById(\"pagestyle\").setAttribute(\"href\", \"web/build/assets/css/bootstrap.darkly.min.css\");\n} // ---------------------\n// ------ Browser ------\n// ---------------------\n\n\nvar filters = {\n file: $('#filter-type-file'),\n url: $('#filter-type-url'),\n radio: $('#filter-type-radio')\n};\nvar filter_dir = $(\"#filter-dir\");\nvar filter_keywords = $(\"#filter-keywords\");\n\nfunction setFilterType(event, type) {\n event.preventDefault();\n\n if (filters[type].hasClass('active')) {\n filters[type].removeClass('active btn-primary').addClass('btn-secondary');\n filters[type].find('input[type=radio]').removeAttr('checked');\n } else {\n filters[type].removeClass('btn-secondary').addClass('active btn-primary');\n filters[type].find('input[type=radio]').attr('checked', 'checked');\n }\n\n if (type === 'file') {\n filter_dir.prop('disabled', !filters['file'].hasClass('active'));\n }\n\n updateResults();\n} // Bind Event\n\n\n$(\".filter-tag\").click(function (e) {\n var tag = $(e.currentTarget);\n\n if (!tag.hasClass('tag-clicked')) {\n tag.addClass('tag-clicked');\n tag.removeClass('tag-unclicked');\n } else {\n tag.addClass('tag-unclicked');\n tag.removeClass('tag-clicked');\n }\n\n updateResults();\n});\nfilter_dir.change(function () {\n updateResults();\n});\nfilter_keywords.change(function () {\n updateResults();\n});\nvar item_template = $(\"#library-item\");\n\nfunction bindLibraryResultEvent() {\n $(\".library-thumb-col\").unbind().hover(function (e) {\n $(e.currentTarget).find(\".library-thumb-grp\").addClass(\"library-thumb-grp-hover\");\n }, function (e) {\n $(e.currentTarget).find(\".library-thumb-grp\").removeClass(\"library-thumb-grp-hover\");\n });\n $(\".library-info-title\").unbind().hover(function (e) {\n $(e.currentTarget).parent().find(\".library-thumb-grp\").addClass(\"library-thumb-grp-hover\");\n }, function (e) {\n $(e.currentTarget).parent().find(\".library-thumb-grp\").removeClass(\"library-thumb-grp-hover\");\n });\n $(\".library-item-play\").unbind().click(function (e) {\n request('post', {\n 'add_item_at_once': $(e.currentTarget).parent().parent().parent().find(\".library-item-id\").val()\n });\n });\n $(\".library-item-trash\").unbind().click(function (e) {\n request('post', {\n 'delete_item_from_library': $(e.currentTarget).parent().parent().find(\".library-item-id\").val()\n });\n updateResults(active_page);\n });\n $(\".library-item-download\").unbind().click(function (e) {\n var id = $(e.currentTarget).parent().parent().find(\".library-item-id\").val(); //window.open('/download?id=' + id);\n\n downloadId(id);\n });\n $(\".library-item-add-next\").unbind().click(function (e) {\n var id = $(e.currentTarget).parent().parent().find(\".library-item-id\").val();\n request('post', {\n 'add_item_next': id\n });\n });\n $(\".library-item-add-bottom\").unbind().click(function (e) {\n var id = $(e.currentTarget).parent().parent().find(\".library-item-id\").val();\n request('post', {\n 'add_item_bottom': id\n });\n });\n}\n\nvar lib_group = $(\"#library-group\");\nvar id_element = $(\".library-item-id\");\nvar title_element = $(\".library-item-title\");\nvar artist_element = $(\".library-item-artist\");\nvar thumb_element = $(\".library-item-thumb\");\nvar type_element = $(\".library-item-type\");\nvar path_element = $(\".library-item-path\");\nvar tag_edit_element = $(\".library-item-edit\"); //var notag_element = $(\".library-item-notag\");\n//var tag_element = $(\".library-item-tag\");\n//var add_tag_modal = $(\"#addTagModal\");\n\nfunction addResultItem(item) {\n id_element.val(item.id);\n title_element.html(item.title);\n artist_element.html(item.artist ? \"- \" + item.artist : \"\");\n thumb_element.attr(\"src\", item.thumb);\n type_element.html(\"[\" + item.type + \"]\");\n path_element.html(item.path);\n var item_copy = item_template.clone();\n item_copy.addClass(\"library-item-active\");\n var tags = item_copy.find(\".library-item-tags\");\n tags.empty();\n var tag_edit_copy = tag_edit_element.clone();\n tag_edit_copy.click(function () {\n addTagModalShow(item.id, item.title, item.tags);\n });\n tag_edit_copy.appendTo(tags);\n\n if (item.tags.length > 0) {\n item.tags.forEach(function (tag_tuple) {\n var tag_copy = tag_element.clone();\n tag_copy.html(tag_tuple[0]);\n tag_copy.addClass(\"badge-\" + tag_tuple[1]);\n tag_copy.appendTo(tags);\n });\n } else {\n var tag_copy = notag_element.clone();\n tag_copy.appendTo(tags);\n }\n\n item_copy.appendTo(lib_group);\n item_copy.show();\n}\n\nfunction getFilters() {\n var dest_page = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n var tags = $(\".tag-clicked\");\n var tags_list = [];\n tags.each(function (index, tag) {\n tags_list.push(tag.innerHTML);\n });\n var filter_types = [];\n\n for (var filter in filters) {\n if (filters[filter].hasClass('active')) {\n filter_types.push(filter);\n }\n }\n\n return {\n type: filter_types.join(','),\n dir: filter_dir.val(),\n tags: tags_list.join(\",\"),\n keywords: filter_keywords.val(),\n page: dest_page\n };\n}\n\nvar lib_loading = $(\"#library-item-loading\");\nvar lib_empty = $(\"#library-item-empty\");\nvar active_page = 1;\n\nfunction updateResults() {\n var dest_page = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n active_page = dest_page;\n var data = getFilters(dest_page);\n data.action = \"query\";\n lib_group.animate({\n opacity: 0\n }, 200, function () {\n $.ajax({\n type: 'POST',\n url: 'library',\n data: data,\n statusCode: {\n 200: processResults,\n 204: function _() {\n lib_loading.hide();\n lib_empty.show();\n page_ul.empty();\n },\n 403: function _() {\n location.reload(true);\n }\n }\n });\n $(\".library-item-active\").remove();\n lib_empty.hide();\n lib_loading.show();\n lib_group.animate({\n opacity: 1\n }, 200);\n });\n}\n\nvar download_form = $(\"#download-form\");\nvar download_id = download_form.find(\"input[name='id']\");\nvar download_type = download_form.find(\"input[name='type']\");\nvar download_dir = download_form.find(\"input[name='dir']\");\nvar download_tags = download_form.find(\"input[name='tags']\");\nvar download_keywords = download_form.find(\"input[name='keywords']\");\n\nfunction addAllResults() {\n var data = getFilters();\n data.action = \"add\";\n console.log(data);\n $.ajax({\n type: 'POST',\n url: 'library',\n data: data\n });\n checkForPlaylistUpdate();\n}\n\nfunction deleteAllResults() {\n var data = getFilters();\n data.action = \"delete\";\n console.log(data);\n $.ajax({\n type: 'POST',\n url: 'library',\n data: data\n });\n checkForPlaylistUpdate();\n updateResults();\n}\n\nfunction downloadAllResults() {\n var cond = getFilters();\n download_id.val();\n download_type.val(cond.type);\n download_dir.val(cond.dir);\n download_tags.val(cond.tags);\n download_keywords.val(cond.keywords);\n download_form.submit();\n}\n\nfunction downloadId(id) {\n download_id.attr(\"value\", id);\n download_type.attr(\"value\", \"\");\n download_dir.attr(\"value\", \"\");\n download_tags.attr(\"value\", \"\");\n download_keywords.attr(\"value\", \"\");\n download_form.submit();\n}\n\nvar page_ul = $(\"#library-page-ul\");\nvar page_li = $(\".library-page-li\");\nvar page_no = $(\".library-page-no\");\n\nfunction processResults(data) {\n lib_group.animate({\n opacity: 0\n }, 200, function () {\n lib_loading.hide();\n var total_pages = data.total_pages;\n var active_page = data.active_page;\n var items = data.items;\n items.forEach(function (item) {\n addResultItem(item);\n bindLibraryResultEvent();\n });\n page_ul.empty();\n page_li.removeClass('active').empty();\n var i = 1;\n var page_li_copy;\n var page_no_copy;\n\n if (total_pages > 25) {\n i = active_page - 12 >= 1 ? active_page - 12 : 1;\n\n var _i = total_pages - 23;\n\n i = i < _i ? i : _i;\n page_li_copy = page_li.clone();\n page_no_copy = page_no.clone();\n page_no_copy.html(\"«\");\n page_no_copy.click(function (e) {\n updateResults(1);\n });\n page_no_copy.appendTo(page_li_copy);\n page_li_copy.appendTo(page_ul);\n }\n\n var limit = i + 24;\n\n for (; i <= total_pages && i <= limit; i++) {\n page_li_copy = page_li.clone();\n page_no_copy = page_no.clone();\n page_no_copy.html(i.toString());\n\n if (active_page === i) {\n page_li_copy.addClass(\"active\");\n } else {\n page_no_copy.click(function (e) {\n var _page_no = $(e.currentTarget).html();\n\n updateResults(_page_no);\n });\n }\n\n page_no_copy.appendTo(page_li_copy);\n page_li_copy.appendTo(page_ul);\n }\n\n if (limit < total_pages) {\n page_li_copy = page_li.clone();\n page_no_copy = page_no.clone();\n page_no_copy.html(\"»\");\n page_no_copy.click(function (e) {\n updateResults(total_pages);\n });\n page_no_copy.appendTo(page_li_copy);\n page_li_copy.appendTo(page_ul);\n }\n\n lib_group.animate({\n opacity: 1\n }, 200);\n });\n} // ---------------------\n// ------ Tagging ------\n// ---------------------\n\n\nvar add_tag_modal_title = $(\"#addTagModalTitle\");\nvar add_tag_modal_item_id = $(\"#addTagModalItemId\");\nvar add_tag_modal_tags = $(\"#addTagModalTags\");\nvar add_tag_modal_input = $(\"#addTagModalInput\");\nvar modal_tag = $(\".modal-tag\");\nvar modal_tag_text = $(\".modal-tag-text\");\n\nfunction addTagModalShow(_id, _title, _tag_tuples) {\n add_tag_modal_title.html(\"Edit tags for \" + _title);\n add_tag_modal_item_id.val(_id);\n add_tag_modal_tags.empty();\n\n _tag_tuples.forEach(function (tag_tuple) {\n modal_tag_text.html(tag_tuple[0]);\n var tag_copy = modal_tag.clone();\n var modal_tag_remove = tag_copy.find(\".modal-tag-remove\");\n modal_tag_remove.click(function (e) {\n $(e.currentTarget).parent().remove();\n });\n tag_copy.show();\n tag_copy.appendTo(add_tag_modal_tags);\n modal_tag_text.html(\"\");\n });\n\n add_tag_modal.modal('show');\n}\n\nfunction addTagModalAdd() {\n var new_tags = add_tag_modal_input.val().split(\",\").map(function (str) {\n return str.trim();\n });\n new_tags.forEach(function (tag) {\n modal_tag_text.html(tag);\n var tag_copy = modal_tag.clone();\n var modal_tag_remove = tag_copy.find(\".modal-tag-remove\");\n modal_tag_remove.click(function (e) {\n $(e.currentTarget).parent().remove();\n });\n tag_copy.show();\n tag_copy.appendTo(add_tag_modal_tags);\n modal_tag_text.html(\"\");\n });\n add_tag_modal_input.val(\"\");\n}\n\nfunction addTagModalSubmit() {\n var all_tags = $(\".modal-tag-text\");\n var tags = [];\n all_tags.each(function (i, element) {\n if (element.innerHTML) {\n tags.push(element.innerHTML);\n }\n });\n $.ajax({\n type: 'POST',\n url: 'library',\n data: {\n action: 'edit_tags',\n id: add_tag_modal_item_id.val(),\n tags: tags.join(\",\")\n }\n });\n updateResults(active_page);\n} // ---------------------\n// ------- Volume ------\n// ---------------------\n\n\nvar volume_popover_btn = document.querySelector(\"#volume-popover-btn\");\nvar volume_popover_div = document.querySelector(\"#volume-popover\");\nvar volume_popover_instance = null;\nvar volume_popover_show = false;\nvolume_popover_btn.addEventListener('click', function (e) {\n e.stopPropagation();\n});\nvolume_popover_div.addEventListener('click', function (e) {\n e.stopPropagation();\n});\n\nfunction toggleVolumePopover() {\n if (!volume_popover_show) {\n volume_popover_instance = new Popper(volume_popover_btn, volume_popover_div, {\n placement: 'top',\n modifiers: {\n offset: {\n offset: '0, 8'\n }\n }\n });\n volume_popover_div.setAttribute('data-show', '');\n } else {\n volume_popover_div.removeAttribute('data-show');\n\n if (volume_popover_instance) {\n volume_popover_instance.destroy();\n volume_popover_instance = null;\n }\n }\n\n volume_popover_show = !volume_popover_show;\n document.addEventListener('click', function () {\n volume_popover_div.removeAttribute('data-show');\n\n if (volume_popover_instance) {\n volume_popover_instance.destroy();\n volume_popover_instance = null;\n volume_popover_show = !volume_popover_show;\n }\n }, {\n once: true\n });\n}\n\nvar volume_update_timer;\n\nfunction setVolumeDelayed(new_volume_value) {\n window.clearTimeout(volume_update_timer);\n volume_update_timer = window.setTimeout(function () {\n request('post', {\n action: 'volume_set_value',\n new_volume: new_volume_value\n });\n }, 500); // delay in milliseconds\n} // ---------------------\n// ------- Upload ------\n// ---------------------\n\n\nvar uploadModal = $(\"#uploadModal\");\nvar uploadFileInput = document.getElementById(\"uploadSelectFile\");\nvar uploadModalItem = document.getElementsByClassName(\"uploadItem\")[0];\nvar uploadModalList = document.getElementById(\"uploadModalList\");\nvar uploadTargetDir = document.getElementById(\"uploadTargetDir\");\nvar uploadSuccessAlert = document.getElementById(\"uploadSuccessAlert\");\nvar uploadSubmitBtn = document.getElementById(\"uploadSubmit\");\nvar uploadCancelBtn = document.getElementById(\"uploadCancel\");\nvar uploadCloseBtn = document.getElementById(\"uploadClose\");\nvar maxFileSize = parseInt(document.getElementById(\"maxUploadFileSize\").value);\nvar filesToProceed = [];\nvar filesProgressItem = {};\nvar runningXHR = null;\nvar areYouSureToCancelUploading = false;\nuploadSubmitBtn.addEventListener(\"click\", uploadStart);\nuploadCancelBtn.addEventListener(\"click\", uploadCancel);\n\nfunction uploadStart() {\n uploadModalList.textContent = '';\n uploadSuccessAlert.style.display = 'none';\n uploadCancelBtn.style.display = 'none';\n uploadCloseBtn.style.display = 'block';\n areYouSureToCancelUploading = false;\n $(uploadCancelBtn).tooltip('hide');\n var file_list = uploadFileInput.files;\n\n if (file_list.length) {\n var _iterator = _createForOfIteratorHelper(file_list),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var file = _step.value;\n generateUploadProgressItem(file);\n\n if (file.size > maxFileSize) {\n setUploadError(file.name, 'File too large!');\n continue;\n } else if (!file.type.includes(\"audio\")) {\n setUploadError(file.name, 'Unsupported media format!');\n continue;\n }\n\n filesToProceed.push(file);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n uploadFileInput.value = '';\n uploadModal.modal(\"show\");\n uploadNextFile();\n }\n}\n\nfunction setUploadError(filename, error) {\n var file_progress_item = filesProgressItem[filename];\n file_progress_item.title.classList.add(\"text-muted\");\n file_progress_item.error.innerHTML += 'Error: ' + error;\n setProgressBar(file_progress_item.progress, 1);\n file_progress_item.progress.classList.add(\"bg-danger\");\n file_progress_item.progress.classList.remove(\"progress-bar-animated\");\n}\n\nfunction generateUploadProgressItem(file) {\n var item_clone = uploadModalItem.cloneNode(true);\n var title = item_clone.querySelector(\".uploadItemTitle\");\n title.innerHTML = file.name;\n var error = item_clone.querySelector(\".uploadItemError\");\n var progress = item_clone.querySelector(\".uploadProgress\");\n item_clone.style.display = \"block\";\n var item = {\n title: title,\n error: error,\n progress: progress\n };\n filesProgressItem[file.name] = item;\n uploadModalList.appendChild(item_clone);\n return item;\n}\n\nfunction uploadNextFile() {\n uploadCancelBtn.style.display = 'block';\n uploadCloseBtn.style.display = 'none';\n var req = new XMLHttpRequest();\n var file = filesToProceed.shift();\n var file_progress_item = filesProgressItem[file.name];\n req.addEventListener(\"load\", function () {\n if (this.status === 200) {\n setProgressBar(file_progress_item.progress, 1);\n file_progress_item.progress.classList.add(\"bg-success\");\n file_progress_item.progress.classList.remove(\"progress-bar-animated\");\n } else if (this.status === 400 || this.status === 403) {\n setUploadError(file.name, 'Illegal request!');\n } else if (this.status === 500) {\n setUploadError(file.name, 'Server internal error!');\n } else {\n if (this.responseText) {\n setUploadError(file.name, this.responseText);\n } else {\n setUploadError(file.name, 'Unknown error!');\n }\n }\n\n if (filesToProceed.length) {\n uploadNextFile();\n } else {\n uploadSuccessAlert.style.display = \"block\";\n runningXHR = null;\n uploadCancelBtn.style.display = 'none';\n uploadCloseBtn.style.display = 'block';\n request('post', {\n action: 'rescan'\n });\n updateResults();\n }\n });\n req.upload.addEventListener(\"progress\", function (e) {\n if (e.lengthComputable) {\n var percent = e.loaded / e.total;\n setProgressBar(file_progress_item.progress, percent, Math.floor(percent * 100) + \"%\");\n }\n });\n var form = new FormData();\n form.append('file', file);\n form.append('targetdir', uploadTargetDir.value);\n req.open('POST', 'upload');\n req.withCredentials = true;\n req.send(form);\n file_progress_item.progress.classList.add(\"progress-bar-striped\");\n file_progress_item.progress.classList.add(\"progress-bar-animated\");\n runningXHR = req;\n}\n\nfunction uploadCancel() {\n if (!areYouSureToCancelUploading) {\n $(uploadCancelBtn).tooltip('show');\n } else {\n $(uploadCancelBtn).tooltip('hide');\n uploadModal.modal('hide');\n runningXHR.abort();\n filesToProceed = [];\n uploadFileInput.value = '';\n request('post', {\n action: 'rescan'\n });\n updateResults();\n }\n\n areYouSureToCancelUploading = !areYouSureToCancelUploading;\n} // ---------------------\n// ------ Player ------\n// ---------------------\n\n\nvar player = document.getElementById(\"playerToast\");\nvar playerArtwork = document.getElementById(\"playerArtwork\");\nvar playerArtworkIdle = document.getElementById(\"playerArtworkIdle\");\nvar playerTitle = document.getElementById(\"playerTitle\");\nvar playerArtist = document.getElementById(\"playerArtist\");\nvar playerBar = document.getElementById(\"playerBar\");\nvar playerBarBox = document.getElementById(\"playerBarBox\");\nvar playerPlayBtn = document.getElementById(\"playerPlayBtn\");\nvar playerPauseBtn = document.getElementById(\"playerPauseBtn\");\nvar playerSkipBtn = document.getElementById(\"playerSkipBtn\");\nvar currentPlayingItem = null;\n\nfunction togglePlayer() {\n $(player).toast(\"show\");\n}\n\nfunction playerSetIdle() {\n playerArtwork.style.display = 'none';\n playerArtworkIdle.style.display = 'block';\n playerTitle.textContent = '-- IDLE --';\n playerArtist.textContent = '';\n setProgressBar(playerBar, 0);\n}\n\nfunction updatePlayerInfo(item) {\n if (!item) {\n playerSetIdle();\n }\n\n playerArtwork.style.display = 'block';\n playerArtworkIdle.style.display = 'none';\n currentPlayingItem = item;\n playerTitle.textContent = item.title;\n playerArtist.textContent = item.artist;\n playerArtwork.setAttribute(\"src\", item.thumbnail);\n\n if (isOverflown(playerTitle)) {\n playerTitle.classList.add(\"scrolling\");\n } else {\n playerTitle.classList.remove(\"scrolling\");\n }\n\n if (isOverflown(playerArtist)) {\n playerArtist.classList.add(\"scrolling\");\n } else {\n playerArtist.classList.remove(\"scrolling\");\n }\n}\n\nfunction updatePlayerControls(play, empty) {\n if (empty) {\n playerSetIdle();\n playerPlayBtn.setAttribute(\"disabled\", \"\");\n playerPauseBtn.setAttribute(\"disabled\", \"\");\n playerSkipBtn.setAttribute(\"disabled\", \"\");\n } else {\n playerPlayBtn.removeAttribute(\"disabled\");\n playerPauseBtn.removeAttribute(\"disabled\");\n playerSkipBtn.removeAttribute(\"disabled\");\n }\n\n if (play) {\n playerPlayBtn.style.display = 'none';\n playerPauseBtn.style.display = 'block';\n } else {\n playerPlayBtn.style.display = 'block';\n playerPauseBtn.style.display = 'none';\n }\n}\n\nvar playhead_timer;\nvar player_playhead_position;\nvar playhead_dragging = false;\n\nfunction updatePlayerPlayhead(playhead) {\n if (!currentPlayingItem || playhead_dragging) {\n return;\n }\n\n if (currentPlayingItem.duration !== 0 || currentPlayingItem.duration < playhead) {\n playerBar.classList.remove(\"progress-bar-animated\");\n clearInterval(playhead_timer);\n player_playhead_position = playhead;\n setProgressBar(playerBar, player_playhead_position / currentPlayingItem.duration, secondsToStr(player_playhead_position));\n\n if (playing) {\n playhead_timer = setInterval(function () {\n player_playhead_position += 0.1;\n setProgressBar(playerBar, player_playhead_position / currentPlayingItem.duration, secondsToStr(player_playhead_position));\n }, 100); // delay in milliseconds\n }\n } else {\n if (playing) {\n playerBar.classList.add(\"progress-bar-animated\");\n } else {\n playerBar.classList.remove(\"progress-bar-animated\");\n }\n\n setProgressBar(playerBar, 1);\n }\n}\n\nplayerBarBox.addEventListener('mousedown', function () {\n if (currentPlayingItem && currentPlayingItem.duration > 0) {\n playerBarBox.addEventListener('mousemove', playheadDragged);\n clearInterval(playhead_timer);\n playhead_dragging = true;\n }\n});\nplayerBarBox.addEventListener('mouseup', function (event) {\n playerBarBox.removeEventListener('mousemove', playheadDragged);\n var percent = event.offsetX / playerBarBox.clientWidth;\n request('post', {\n move_playhead: percent * currentPlayingItem.duration\n });\n playhead_dragging = false;\n});\n\nfunction playheadDragged(event) {\n var percent = event.offsetX / playerBarBox.clientWidth;\n setProgressBar(playerBar, percent, secondsToStr(percent * currentPlayingItem.duration));\n} // ---------------------\n// ------- Util -------\n// ---------------------\n\n\nfunction isOverflown(element) {\n return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;\n}\n\nfunction setProgressBar(bar, progress) {\n var text = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n var prog_str = (progress * 100).toString();\n bar.setAttribute(\"aria-valuenow\", prog_str);\n bar.style.width = prog_str + \"%\";\n bar.textContent = text;\n}\n\nfunction secondsToStr(seconds) {\n seconds = Math.floor(seconds);\n var mins = Math.floor(seconds / 60);\n var secs = seconds % 60;\n return (\"00\" + mins).slice(-2) + \":\" + (\"00\" + secs).slice(-2);\n}\n\nthemeInit();\nupdateResults();\n$(document).ready(updatePlaylist); // Check the version of playlist to see if update is needed.\n\nsetInterval(checkForPlaylistUpdate, 3000);\n\n//# sourceURL=webpack:///./src/js/main.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_symbol__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.symbol */ \"./node_modules/core-js/modules/es.symbol.js\");\n/* harmony import */ var core_js_modules_es_symbol__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_symbol_description__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.symbol.description */ \"./node_modules/core-js/modules/es.symbol.description.js\");\n/* harmony import */ var core_js_modules_es_symbol_description__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_symbol_iterator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator */ \"./node_modules/core-js/modules/es.symbol.iterator.js\");\n/* harmony import */ var core_js_modules_es_symbol_iterator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_array_find__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.array.find */ \"./node_modules/core-js/modules/es.array.find.js\");\n/* harmony import */ var core_js_modules_es_array_find__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_find__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.array.for-each */ \"./node_modules/core-js/modules/es.array.for-each.js\");\n/* harmony import */ var core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_array_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.array.from */ \"./node_modules/core-js/modules/es.array.from.js\");\n/* harmony import */ var core_js_modules_es_array_from__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_from__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_array_includes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.array.includes */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_array_is_array__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.array.is-array */ \"./node_modules/core-js/modules/es.array.is-array.js\");\n/* harmony import */ var core_js_modules_es_array_is_array__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_is_array__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_array_iterator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.array.iterator */ \"./node_modules/core-js/modules/es.array.iterator.js\");\n/* harmony import */ var core_js_modules_es_array_iterator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.array.join */ \"./node_modules/core-js/modules/es.array.join.js\");\n/* harmony import */ var core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.array.map */ \"./node_modules/core-js/modules/es.array.map.js\");\n/* harmony import */ var core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es_array_slice__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.array.slice */ \"./node_modules/core-js/modules/es.array.slice.js\");\n/* harmony import */ var core_js_modules_es_array_slice__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_slice__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es_date_to_string__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.date.to-string */ \"./node_modules/core-js/modules/es.date.to-string.js\");\n/* harmony import */ var core_js_modules_es_date_to_string__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_date_to_string__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var core_js_modules_es_function_name__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.function.name */ \"./node_modules/core-js/modules/es.function.name.js\");\n/* harmony import */ var core_js_modules_es_function_name__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.object.to-string */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n/* harmony import */ var core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var core_js_modules_es_object_values__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.object.values */ \"./node_modules/core-js/modules/es.object.values.js\");\n/* harmony import */ var core_js_modules_es_object_values__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_values__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var core_js_modules_es_parse_int__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! core-js/modules/es.parse-int */ \"./node_modules/core-js/modules/es.parse-int.js\");\n/* harmony import */ var core_js_modules_es_parse_int__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_parse_int__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! core-js/modules/es.regexp.exec */ \"./node_modules/core-js/modules/es.regexp.exec.js\");\n/* harmony import */ var core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! core-js/modules/es.regexp.to-string */ \"./node_modules/core-js/modules/es.regexp.to-string.js\");\n/* harmony import */ var core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var core_js_modules_es_string_includes__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! core-js/modules/es.string.includes */ \"./node_modules/core-js/modules/es.string.includes.js\");\n/* harmony import */ var core_js_modules_es_string_includes__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_includes__WEBPACK_IMPORTED_MODULE_19__);\n/* harmony import */ var core_js_modules_es_string_iterator__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! core-js/modules/es.string.iterator */ \"./node_modules/core-js/modules/es.string.iterator.js\");\n/* harmony import */ var core_js_modules_es_string_iterator__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator__WEBPACK_IMPORTED_MODULE_20__);\n/* harmony import */ var core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! core-js/modules/es.string.replace */ \"./node_modules/core-js/modules/es.string.replace.js\");\n/* harmony import */ var core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_21__);\n/* harmony import */ var core_js_modules_es_string_split__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! core-js/modules/es.string.split */ \"./node_modules/core-js/modules/es.string.split.js\");\n/* harmony import */ var core_js_modules_es_string_split__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_split__WEBPACK_IMPORTED_MODULE_22__);\n/* harmony import */ var core_js_modules_es_string_trim__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! core-js/modules/es.string.trim */ \"./node_modules/core-js/modules/es.string.trim.js\");\n/* harmony import */ var core_js_modules_es_string_trim__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_trim__WEBPACK_IMPORTED_MODULE_23__);\n/* harmony import */ var core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each */ \"./node_modules/core-js/modules/web.dom-collections.for-each.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_24__);\n/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_25__);\n/* harmony import */ var core_js_modules_web_timers__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! core-js/modules/web.timers */ \"./node_modules/core-js/modules/web.timers.js\");\n/* harmony import */ var core_js_modules_web_timers__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_timers__WEBPACK_IMPORTED_MODULE_26__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(o) { if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n$('#uploadSelectFile').on('change', function () {\n //get the file name\n var fileName = $(this).val().replace('C:\\\\fakepath\\\\', \" \"); //replace the \"Choose a file\" label\n\n $(this).next('.custom-file-label').html(fileName);\n}); // ----------------------\n// ------ Playlist ------\n// ----------------------\n\nvar pl_item_template = $(\".playlist-item-template\");\nvar pl_id_element = $(\".playlist-item-id\");\nvar pl_index_element = $(\".playlist-item-index\");\nvar pl_title_element = $(\".playlist-item-title\");\nvar pl_artist_element = $(\".playlist-item-artist\");\nvar pl_thumb_element = $(\".playlist-item-thumbnail\");\nvar pl_type_element = $(\".playlist-item-type\");\nvar pl_path_element = $(\".playlist-item-path\");\nvar pl_tag_edit_element = $(\".playlist-item-edit\");\nvar notag_element = $(\".library-item-notag\"); // these elements are shared with library\n\nvar tag_element = $(\".library-item-tag\");\nvar add_tag_modal = $(\"#addTagModal\");\nvar playlist_loading = $(\"#playlist-loading\");\nvar playlist_table = $(\"#playlist-table\");\nvar playlist_empty = $(\"#playlist-empty\");\nvar playlist_expand = $(\".playlist-expand\");\nvar playlist_items = null;\nvar playlist_ver = 0;\nvar playlist_current_index = 0;\nvar playlist_range_from = 0;\nvar playlist_range_to = 0;\nvar last_volume = 0;\nvar playing = false;\nvar playPauseBtn = $('#play-pause-btn');\nvar fastForwardBtn = $('#fast-forward-btn');\nvar playModeBtns = {\n 'one-shot': $('#one-shot-mode-btn'),\n random: $('#random-mode-btn'),\n repeat: $('#repeat-mode-btn'),\n autoplay: $('#autoplay-mode-btn')\n};\nvar playModeIcon = {\n 'one-shot': 'fa-tasks',\n random: 'fa-random',\n repeat: 'fa-redo',\n autoplay: 'fa-robot'\n};\n\nfunction request(_url, _data) {\n var refresh = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n console.log(_data);\n $.ajax({\n type: 'POST',\n url: _url,\n data: _data,\n statusCode: {\n 200: function _(data) {\n if (data.ver !== playlist_ver) {\n checkForPlaylistUpdate();\n }\n\n updateControls(data.empty, data.play, data.mode, data.volume);\n updatePlayerPlayhead(data.playhead);\n },\n 403: function _() {\n location.reload(true);\n }\n }\n });\n\n if (refresh) {\n location.reload(true);\n }\n}\n\nfunction addPlaylistItem(item) {\n pl_id_element.val(item.id);\n pl_index_element.html(item.index + 1);\n pl_title_element.html(item.title);\n pl_artist_element.html(item.artist);\n pl_thumb_element.attr(\"src\", item.thumbnail);\n pl_type_element.html(item.type);\n pl_path_element.html(item.path);\n var item_copy = pl_item_template.clone();\n item_copy.attr(\"id\", \"playlist-item-\" + item.index);\n item_copy.addClass(\"playlist-item\").removeClass(\"d-none\");\n var tags = item_copy.find(\".playlist-item-tags\");\n tags.empty();\n var tag_edit_copy = pl_tag_edit_element.clone();\n tag_edit_copy.click(function () {\n addTagModalShow(item.id, item.title, item.tags);\n });\n tag_edit_copy.appendTo(tags);\n\n if (item.tags.length > 0) {\n item.tags.forEach(function (tag_tuple) {\n var tag_copy = tag_element.clone();\n tag_copy.html(tag_tuple[0]);\n tag_copy.addClass(\"badge-\" + tag_tuple[1]);\n tag_copy.appendTo(tags);\n });\n } else {\n var tag_copy = notag_element.clone();\n tag_copy.appendTo(tags);\n }\n\n item_copy.appendTo(playlist_table);\n}\n\nfunction displayPlaylist(data) {\n playlist_table.animate({\n opacity: 0\n }, 200, function () {\n playlist_loading.hide();\n $(\".playlist-item\").remove();\n var items = data.items;\n playlist_items = items;\n var length = data.length;\n var start_from = data.start_from;\n playlist_range_from = start_from;\n playlist_range_to = start_from + items.length - 1;\n\n if (items.length < length && start_from > 0) {\n var _from = start_from - 5;\n\n _from = _from > 0 ? _from : 0;\n\n var _to = start_from - 1;\n\n if (_to > 0) {\n insertExpandPrompt(_from, start_from + length - 1, _from, _to, length);\n }\n }\n\n items.forEach(function (item) {\n addPlaylistItem(item);\n });\n\n if (items.length < length && start_from + items.length < length) {\n var _from2 = start_from + items.length;\n\n var _to2 = start_from + items.length - 1 + 10;\n\n _to2 = _to2 < length - 1 ? _to2 : length - 1;\n\n if (start_from + items.length < _to2) {\n insertExpandPrompt(start_from, _to2, _from2, _to2, length);\n }\n }\n\n displayActiveItem(data.current_index);\n updatePlayerInfo(items[data.current_index - data.start_from]);\n bindPlaylistEvent();\n playlist_table.animate({\n opacity: 1\n }, 200);\n });\n}\n\nfunction displayActiveItem(current_index) {\n $(\".playlist-item\").removeClass(\"table-active\");\n $(\"#playlist-item-\" + current_index).addClass(\"table-active\");\n}\n\nfunction insertExpandPrompt(real_from, real_to, display_from, display_to, total_length) {\n var expand_copy = playlist_expand.clone();\n expand_copy.addClass('playlist-item');\n expand_copy.removeClass('d-none');\n\n if (display_from !== display_to) {\n expand_copy.find(\".playlist-expand-item-range\").html(display_from + 1 + \"~\" + (display_to + 1) + \" of \" + total_length + \" items\");\n } else {\n expand_copy.find(\".playlist-expand-item-range\").html(display_from + \" of \" + total_length + \" items\");\n }\n\n expand_copy.addClass('playlist-item');\n expand_copy.appendTo(playlist_table);\n expand_copy.click(function () {\n playlist_range_from = real_from;\n playlist_range_to = real_to;\n updatePlaylist();\n });\n}\n\nfunction updatePlaylist() {\n playlist_table.animate({\n opacity: 0\n }, 200, function () {\n playlist_empty.addClass('d-none');\n playlist_loading.show();\n playlist_table.find(\".playlist-item\").css(\"opacity\", 0);\n var data = {};\n\n if (!(playlist_range_from === 0 && playlist_range_to === 0)) {\n data = {\n range_from: playlist_range_from,\n range_to: playlist_range_to\n };\n }\n\n $.ajax({\n type: 'GET',\n url: 'playlist',\n data: data,\n statusCode: {\n 200: displayPlaylist,\n 204: function _() {\n playlist_loading.hide();\n playlist_empty.removeClass('d-none');\n $(\".playlist-item\").remove();\n }\n }\n });\n playlist_table.animate({\n opacity: 1\n }, 200);\n });\n}\n\nfunction checkForPlaylistUpdate() {\n $.ajax({\n type: 'POST',\n url: 'post',\n statusCode: {\n 200: function _(data) {\n if (data.ver !== playlist_ver) {\n playlist_ver = data.ver;\n playlist_range_from = 0;\n playlist_range_to = 0;\n updatePlaylist();\n }\n\n if (data.current_index !== playlist_current_index) {\n if (data.current_index !== -1) {\n if (data.current_index > playlist_range_to || data.current_index < playlist_range_from) {\n playlist_range_from = 0;\n playlist_range_to = 0;\n updatePlaylist();\n } else {\n playlist_current_index = data.current_index;\n updatePlayerInfo(playlist_items[data.current_index - data.start_from]);\n displayActiveItem(data.current_index);\n }\n }\n }\n\n updateControls(data.empty, data.play, data.mode, data.volume);\n\n if (!data.empty) {\n updatePlayerPlayhead(data.playhead);\n }\n }\n }\n });\n}\n\nfunction bindPlaylistEvent() {\n $(\".playlist-item-play\").unbind().click(function (e) {\n request('post', {\n 'play_music': $(e.currentTarget).parent().parent().parent().find(\".playlist-item-index\").html() - 1\n });\n });\n $(\".playlist-item-trash\").unbind().click(function (e) {\n request('post', {\n 'delete_music': $(e.currentTarget).parent().parent().parent().find(\".playlist-item-index\").html() - 1\n });\n });\n}\n\nfunction updateControls(empty, play, mode, volume) {\n updatePlayerControls(play, empty);\n\n if (empty) {\n playPauseBtn.prop('disabled', true);\n fastForwardBtn.prop('disabled', true);\n } else {\n playPauseBtn.prop('disabled', false);\n fastForwardBtn.prop('disabled', false);\n\n if (play) {\n playing = true;\n playPauseBtn.find('[data-fa-i2svg]').removeClass('fa-play').addClass('fa-pause');\n } else {\n playing = false;\n playPauseBtn.find('[data-fa-i2svg]').removeClass('fa-pause').addClass('fa-play');\n }\n }\n\n for (var _i2 = 0, _Object$values = Object.values(playModeBtns); _i2 < _Object$values.length; _i2++) {\n var otherMode = _Object$values[_i2];\n otherMode.removeClass('active');\n }\n\n playModeBtns[mode].addClass('active');\n var playModeIndicator = $('#modeIndicator');\n\n for (var _i3 = 0, _Object$values2 = Object.values(playModeIcon); _i3 < _Object$values2.length; _i3++) {\n var icon_class = _Object$values2[_i3];\n playModeIndicator.removeClass(icon_class);\n }\n\n playModeIndicator.addClass(playModeIcon[mode]);\n\n if (volume !== last_volume) {\n last_volume = volume;\n\n if (volume > 1) {\n document.getElementById(\"volume-slider\").value = 1;\n } else if (volume < 0) {\n document.getElementById(\"volume-slider\").value = 0;\n } else {\n document.getElementById(\"volume-slider\").value = volume;\n }\n }\n}\n\nfunction togglePlayPause() {\n if (playing) {\n request('post', {\n action: 'pause'\n });\n } else {\n request('post', {\n action: 'resume'\n });\n }\n}\n\nfunction changePlayMode(mode) {\n request('post', {\n action: mode\n });\n} // ----------------------\n// --- THEME SWITCHER ---\n// ----------------------\n\n\nfunction themeInit() {\n var theme = localStorage.getItem(\"theme\");\n\n if (theme !== null) {\n setPageTheme(theme);\n }\n}\n\nfunction switchTheme() {\n var theme = localStorage.getItem(\"theme\");\n\n if (theme === \"light\" || theme === null) {\n setPageTheme(\"dark\");\n localStorage.setItem(\"theme\", \"dark\");\n } else {\n setPageTheme(\"light\");\n localStorage.setItem(\"theme\", \"light\");\n }\n}\n\nfunction setPageTheme(theme) {\n return;\n if (theme === \"light\") document.getElementById(\"pagestyle\").setAttribute(\"href\", \"assets/css/bootstrap.min.css\");else if (theme === \"dark\") document.getElementById(\"pagestyle\").setAttribute(\"href\", \"assets/css/bootstrap.darkly.min.css\");\n} // ---------------------\n// ------ Browser ------\n// ---------------------\n\n\nvar filters = {\n file: $('#filter-type-file'),\n url: $('#filter-type-url'),\n radio: $('#filter-type-radio')\n};\nvar filter_dir = $(\"#filter-dir\");\nvar filter_keywords = $(\"#filter-keywords\");\n\nfunction setFilterType(event, type) {\n event.preventDefault();\n\n if (filters[type].hasClass('active')) {\n filters[type].removeClass('active btn-primary').addClass('btn-secondary');\n filters[type].find('input[type=radio]').removeAttr('checked');\n } else {\n filters[type].removeClass('btn-secondary').addClass('active btn-primary');\n filters[type].find('input[type=radio]').attr('checked', 'checked');\n }\n\n if (type === 'file') {\n filter_dir.prop('disabled', !filters['file'].hasClass('active'));\n }\n\n updateResults();\n} // Bind Event\n\n\n$(\".filter-tag\").click(function (e) {\n var tag = $(e.currentTarget);\n\n if (!tag.hasClass('tag-clicked')) {\n tag.addClass('tag-clicked');\n tag.removeClass('tag-unclicked');\n } else {\n tag.addClass('tag-unclicked');\n tag.removeClass('tag-clicked');\n }\n\n updateResults();\n});\nfilter_dir.change(function () {\n updateResults();\n});\nfilter_keywords.change(function () {\n updateResults();\n});\nvar item_template = $(\"#library-item\");\n\nfunction bindLibraryResultEvent() {\n $(\".library-thumb-col\").unbind().hover(function (e) {\n $(e.currentTarget).find(\".library-thumb-grp\").addClass(\"library-thumb-grp-hover\");\n }, function (e) {\n $(e.currentTarget).find(\".library-thumb-grp\").removeClass(\"library-thumb-grp-hover\");\n });\n $(\".library-info-title\").unbind().hover(function (e) {\n $(e.currentTarget).parent().find(\".library-thumb-grp\").addClass(\"library-thumb-grp-hover\");\n }, function (e) {\n $(e.currentTarget).parent().find(\".library-thumb-grp\").removeClass(\"library-thumb-grp-hover\");\n });\n $(\".library-item-play\").unbind().click(function (e) {\n request('post', {\n 'add_item_at_once': $(e.currentTarget).parent().parent().parent().find(\".library-item-id\").val()\n });\n });\n $(\".library-item-trash\").unbind().click(function (e) {\n request('post', {\n 'delete_item_from_library': $(e.currentTarget).parent().parent().find(\".library-item-id\").val()\n });\n updateResults(active_page);\n });\n $(\".library-item-download\").unbind().click(function (e) {\n var id = $(e.currentTarget).parent().parent().find(\".library-item-id\").val(); //window.open('/download?id=' + id);\n\n downloadId(id);\n });\n $(\".library-item-add-next\").unbind().click(function (e) {\n var id = $(e.currentTarget).parent().parent().find(\".library-item-id\").val();\n request('post', {\n 'add_item_next': id\n });\n });\n $(\".library-item-add-bottom\").unbind().click(function (e) {\n var id = $(e.currentTarget).parent().parent().find(\".library-item-id\").val();\n request('post', {\n 'add_item_bottom': id\n });\n });\n}\n\nvar lib_group = $(\"#library-group\");\nvar id_element = $(\".library-item-id\");\nvar title_element = $(\".library-item-title\");\nvar artist_element = $(\".library-item-artist\");\nvar thumb_element = $(\".library-item-thumb\");\nvar type_element = $(\".library-item-type\");\nvar path_element = $(\".library-item-path\");\nvar tag_edit_element = $(\".library-item-edit\"); //var notag_element = $(\".library-item-notag\");\n//var tag_element = $(\".library-item-tag\");\n//var add_tag_modal = $(\"#addTagModal\");\n\nfunction addResultItem(item) {\n id_element.val(item.id);\n title_element.html(item.title);\n artist_element.html(item.artist ? \"- \" + item.artist : \"\");\n thumb_element.attr(\"src\", item.thumb);\n type_element.html(\"[\" + item.type + \"]\");\n path_element.html(item.path);\n var item_copy = item_template.clone();\n item_copy.addClass(\"library-item-active\");\n var tags = item_copy.find(\".library-item-tags\");\n tags.empty();\n var tag_edit_copy = tag_edit_element.clone();\n tag_edit_copy.click(function () {\n addTagModalShow(item.id, item.title, item.tags);\n });\n tag_edit_copy.appendTo(tags);\n\n if (item.tags.length > 0) {\n item.tags.forEach(function (tag_tuple) {\n var tag_copy = tag_element.clone();\n tag_copy.html(tag_tuple[0]);\n tag_copy.addClass(\"badge-\" + tag_tuple[1]);\n tag_copy.appendTo(tags);\n });\n } else {\n var tag_copy = notag_element.clone();\n tag_copy.appendTo(tags);\n }\n\n item_copy.appendTo(lib_group);\n item_copy.show();\n}\n\nfunction getFilters() {\n var dest_page = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n var tags = $(\".tag-clicked\");\n var tags_list = [];\n tags.each(function (index, tag) {\n tags_list.push(tag.innerHTML);\n });\n var filter_types = [];\n\n for (var filter in filters) {\n if (filters[filter].hasClass('active')) {\n filter_types.push(filter);\n }\n }\n\n return {\n type: filter_types.join(','),\n dir: filter_dir.val(),\n tags: tags_list.join(\",\"),\n keywords: filter_keywords.val(),\n page: dest_page\n };\n}\n\nvar lib_loading = $(\"#library-item-loading\");\nvar lib_empty = $(\"#library-item-empty\");\nvar active_page = 1;\n\nfunction updateResults() {\n var dest_page = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n active_page = dest_page;\n var data = getFilters(dest_page);\n data.action = \"query\";\n lib_group.animate({\n opacity: 0\n }, 200, function () {\n $.ajax({\n type: 'POST',\n url: 'library',\n data: data,\n statusCode: {\n 200: processResults,\n 204: function _() {\n lib_loading.hide();\n lib_empty.show();\n page_ul.empty();\n },\n 403: function _() {\n location.reload(true);\n }\n }\n });\n $(\".library-item-active\").remove();\n lib_empty.hide();\n lib_loading.show();\n lib_group.animate({\n opacity: 1\n }, 200);\n });\n}\n\nvar download_form = $(\"#download-form\");\nvar download_id = download_form.find(\"input[name='id']\");\nvar download_type = download_form.find(\"input[name='type']\");\nvar download_dir = download_form.find(\"input[name='dir']\");\nvar download_tags = download_form.find(\"input[name='tags']\");\nvar download_keywords = download_form.find(\"input[name='keywords']\");\n\nfunction addAllResults() {\n var data = getFilters();\n data.action = \"add\";\n console.log(data);\n $.ajax({\n type: 'POST',\n url: 'library',\n data: data\n });\n checkForPlaylistUpdate();\n}\n\nfunction deleteAllResults() {\n var data = getFilters();\n data.action = \"delete\";\n console.log(data);\n $.ajax({\n type: 'POST',\n url: 'library',\n data: data\n });\n checkForPlaylistUpdate();\n updateResults();\n}\n\nfunction downloadAllResults() {\n var cond = getFilters();\n download_id.val();\n download_type.val(cond.type);\n download_dir.val(cond.dir);\n download_tags.val(cond.tags);\n download_keywords.val(cond.keywords);\n download_form.submit();\n}\n\nfunction downloadId(id) {\n download_id.attr(\"value\", id);\n download_type.attr(\"value\", \"\");\n download_dir.attr(\"value\", \"\");\n download_tags.attr(\"value\", \"\");\n download_keywords.attr(\"value\", \"\");\n download_form.submit();\n}\n\nvar page_ul = $(\"#library-page-ul\");\nvar page_li = $(\".library-page-li\");\nvar page_no = $(\".library-page-no\");\n\nfunction processResults(data) {\n lib_group.animate({\n opacity: 0\n }, 200, function () {\n lib_loading.hide();\n var total_pages = data.total_pages;\n var active_page = data.active_page;\n var items = data.items;\n items.forEach(function (item) {\n addResultItem(item);\n bindLibraryResultEvent();\n });\n page_ul.empty();\n page_li.removeClass('active').empty();\n var i = 1;\n var page_li_copy;\n var page_no_copy;\n\n if (total_pages > 25) {\n i = active_page - 12 >= 1 ? active_page - 12 : 1;\n\n var _i = total_pages - 23;\n\n i = i < _i ? i : _i;\n page_li_copy = page_li.clone();\n page_no_copy = page_no.clone();\n page_no_copy.html(\"«\");\n page_no_copy.click(function (e) {\n updateResults(1);\n });\n page_no_copy.appendTo(page_li_copy);\n page_li_copy.appendTo(page_ul);\n }\n\n var limit = i + 24;\n\n for (; i <= total_pages && i <= limit; i++) {\n page_li_copy = page_li.clone();\n page_no_copy = page_no.clone();\n page_no_copy.html(i.toString());\n\n if (active_page === i) {\n page_li_copy.addClass(\"active\");\n } else {\n page_no_copy.click(function (e) {\n var _page_no = $(e.currentTarget).html();\n\n updateResults(_page_no);\n });\n }\n\n page_no_copy.appendTo(page_li_copy);\n page_li_copy.appendTo(page_ul);\n }\n\n if (limit < total_pages) {\n page_li_copy = page_li.clone();\n page_no_copy = page_no.clone();\n page_no_copy.html(\"»\");\n page_no_copy.click(function (e) {\n updateResults(total_pages);\n });\n page_no_copy.appendTo(page_li_copy);\n page_li_copy.appendTo(page_ul);\n }\n\n lib_group.animate({\n opacity: 1\n }, 200);\n });\n} // ---------------------\n// ------ Tagging ------\n// ---------------------\n\n\nvar add_tag_modal_title = $(\"#addTagModalTitle\");\nvar add_tag_modal_item_id = $(\"#addTagModalItemId\");\nvar add_tag_modal_tags = $(\"#addTagModalTags\");\nvar add_tag_modal_input = $(\"#addTagModalInput\");\nvar modal_tag = $(\".modal-tag\");\nvar modal_tag_text = $(\".modal-tag-text\");\n\nfunction addTagModalShow(_id, _title, _tag_tuples) {\n add_tag_modal_title.html(\"Edit tags for \" + _title);\n add_tag_modal_item_id.val(_id);\n add_tag_modal_tags.empty();\n\n _tag_tuples.forEach(function (tag_tuple) {\n modal_tag_text.html(tag_tuple[0]);\n var tag_copy = modal_tag.clone();\n var modal_tag_remove = tag_copy.find(\".modal-tag-remove\");\n modal_tag_remove.click(function (e) {\n $(e.currentTarget).parent().remove();\n });\n tag_copy.show();\n tag_copy.appendTo(add_tag_modal_tags);\n modal_tag_text.html(\"\");\n });\n\n add_tag_modal.modal('show');\n}\n\nfunction addTagModalAdd() {\n var new_tags = add_tag_modal_input.val().split(\",\").map(function (str) {\n return str.trim();\n });\n new_tags.forEach(function (tag) {\n modal_tag_text.html(tag);\n var tag_copy = modal_tag.clone();\n var modal_tag_remove = tag_copy.find(\".modal-tag-remove\");\n modal_tag_remove.click(function (e) {\n $(e.currentTarget).parent().remove();\n });\n tag_copy.show();\n tag_copy.appendTo(add_tag_modal_tags);\n modal_tag_text.html(\"\");\n });\n add_tag_modal_input.val(\"\");\n}\n\nfunction addTagModalSubmit() {\n var all_tags = $(\".modal-tag-text\");\n var tags = [];\n all_tags.each(function (i, element) {\n if (element.innerHTML) {\n tags.push(element.innerHTML);\n }\n });\n $.ajax({\n type: 'POST',\n url: 'library',\n data: {\n action: 'edit_tags',\n id: add_tag_modal_item_id.val(),\n tags: tags.join(\",\")\n }\n });\n updateResults(active_page);\n} // ---------------------\n// ------- Volume ------\n// ---------------------\n\n\nvar volume_popover_btn = document.querySelector(\"#volume-popover-btn\");\nvar volume_popover_div = document.querySelector(\"#volume-popover\");\nvar volume_popover_instance = null;\nvar volume_popover_show = false;\nvolume_popover_btn.addEventListener('click', function (e) {\n e.stopPropagation();\n});\nvolume_popover_div.addEventListener('click', function (e) {\n e.stopPropagation();\n});\n\nfunction toggleVolumePopover() {\n if (!volume_popover_show) {\n volume_popover_instance = new Popper(volume_popover_btn, volume_popover_div, {\n placement: 'top',\n modifiers: {\n offset: {\n offset: '0, 8'\n }\n }\n });\n volume_popover_div.setAttribute('data-show', '');\n } else {\n volume_popover_div.removeAttribute('data-show');\n\n if (volume_popover_instance) {\n volume_popover_instance.destroy();\n volume_popover_instance = null;\n }\n }\n\n volume_popover_show = !volume_popover_show;\n document.addEventListener('click', function () {\n volume_popover_div.removeAttribute('data-show');\n\n if (volume_popover_instance) {\n volume_popover_instance.destroy();\n volume_popover_instance = null;\n volume_popover_show = !volume_popover_show;\n }\n }, {\n once: true\n });\n}\n\nvar volume_update_timer;\n\nfunction setVolumeDelayed(new_volume_value) {\n window.clearTimeout(volume_update_timer);\n volume_update_timer = window.setTimeout(function () {\n request('post', {\n action: 'volume_set_value',\n new_volume: new_volume_value\n });\n }, 500); // delay in milliseconds\n} // ---------------------\n// ------- Upload ------\n// ---------------------\n\n\nvar uploadModal = $(\"#uploadModal\");\nvar uploadFileInput = document.getElementById(\"uploadSelectFile\");\nvar uploadModalItem = document.getElementsByClassName(\"uploadItem\")[0];\nvar uploadModalList = document.getElementById(\"uploadModalList\");\nvar uploadTargetDir = document.getElementById(\"uploadTargetDir\");\nvar uploadSuccessAlert = document.getElementById(\"uploadSuccessAlert\");\nvar uploadSubmitBtn = document.getElementById(\"uploadSubmit\");\nvar uploadCancelBtn = document.getElementById(\"uploadCancel\");\nvar uploadCloseBtn = document.getElementById(\"uploadClose\");\nvar maxFileSize = parseInt(document.getElementById(\"maxUploadFileSize\").value);\nvar filesToProceed = [];\nvar filesProgressItem = {};\nvar runningXHR = null;\nvar areYouSureToCancelUploading = false;\nuploadSubmitBtn.addEventListener(\"click\", uploadStart);\nuploadCancelBtn.addEventListener(\"click\", uploadCancel);\n\nfunction uploadStart() {\n uploadModalList.textContent = '';\n uploadSuccessAlert.style.display = 'none';\n uploadCancelBtn.style.display = 'none';\n uploadCloseBtn.style.display = 'block';\n areYouSureToCancelUploading = false;\n $(uploadCancelBtn).tooltip('hide');\n var file_list = uploadFileInput.files;\n\n if (file_list.length) {\n var _iterator = _createForOfIteratorHelper(file_list),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var file = _step.value;\n generateUploadProgressItem(file);\n\n if (file.size > maxFileSize) {\n setUploadError(file.name, 'File too large!');\n continue;\n } else if (!file.type.includes(\"audio\")) {\n setUploadError(file.name, 'Unsupported media format!');\n continue;\n }\n\n filesToProceed.push(file);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n uploadFileInput.value = '';\n uploadModal.modal(\"show\");\n uploadNextFile();\n }\n}\n\nfunction setUploadError(filename, error) {\n var file_progress_item = filesProgressItem[filename];\n file_progress_item.title.classList.add(\"text-muted\");\n file_progress_item.error.innerHTML += 'Error: ' + error;\n setProgressBar(file_progress_item.progress, 1);\n file_progress_item.progress.classList.add(\"bg-danger\");\n file_progress_item.progress.classList.remove(\"progress-bar-animated\");\n}\n\nfunction generateUploadProgressItem(file) {\n var item_clone = uploadModalItem.cloneNode(true);\n var title = item_clone.querySelector(\".uploadItemTitle\");\n title.innerHTML = file.name;\n var error = item_clone.querySelector(\".uploadItemError\");\n var progress = item_clone.querySelector(\".uploadProgress\");\n item_clone.style.display = \"block\";\n var item = {\n title: title,\n error: error,\n progress: progress\n };\n filesProgressItem[file.name] = item;\n uploadModalList.appendChild(item_clone);\n return item;\n}\n\nfunction uploadNextFile() {\n uploadCancelBtn.style.display = 'block';\n uploadCloseBtn.style.display = 'none';\n var req = new XMLHttpRequest();\n var file = filesToProceed.shift();\n var file_progress_item = filesProgressItem[file.name];\n req.addEventListener(\"load\", function () {\n if (this.status === 200) {\n setProgressBar(file_progress_item.progress, 1);\n file_progress_item.progress.classList.add(\"bg-success\");\n file_progress_item.progress.classList.remove(\"progress-bar-animated\");\n } else if (this.status === 400 || this.status === 403) {\n setUploadError(file.name, 'Illegal request!');\n } else if (this.status === 500) {\n setUploadError(file.name, 'Server internal error!');\n } else {\n if (this.responseText) {\n setUploadError(file.name, this.responseText);\n } else {\n setUploadError(file.name, 'Unknown error!');\n }\n }\n\n if (filesToProceed.length) {\n uploadNextFile();\n } else {\n uploadSuccessAlert.style.display = \"block\";\n runningXHR = null;\n uploadCancelBtn.style.display = 'none';\n uploadCloseBtn.style.display = 'block';\n request('post', {\n action: 'rescan'\n });\n updateResults();\n }\n });\n req.upload.addEventListener(\"progress\", function (e) {\n if (e.lengthComputable) {\n var percent = e.loaded / e.total;\n setProgressBar(file_progress_item.progress, percent, Math.floor(percent * 100) + \"%\");\n }\n });\n var form = new FormData();\n form.append('file', file);\n form.append('targetdir', uploadTargetDir.value);\n req.open('POST', 'upload');\n req.withCredentials = true;\n req.send(form);\n file_progress_item.progress.classList.add(\"progress-bar-striped\");\n file_progress_item.progress.classList.add(\"progress-bar-animated\");\n runningXHR = req;\n}\n\nfunction uploadCancel() {\n if (!areYouSureToCancelUploading) {\n $(uploadCancelBtn).tooltip('show');\n } else {\n $(uploadCancelBtn).tooltip('hide');\n uploadModal.modal('hide');\n runningXHR.abort();\n filesToProceed = [];\n uploadFileInput.value = '';\n request('post', {\n action: 'rescan'\n });\n updateResults();\n }\n\n areYouSureToCancelUploading = !areYouSureToCancelUploading;\n} // ---------------------\n// ------ Player ------\n// ---------------------\n\n\nvar player = document.getElementById(\"playerToast\");\nvar playerArtwork = document.getElementById(\"playerArtwork\");\nvar playerArtworkIdle = document.getElementById(\"playerArtworkIdle\");\nvar playerTitle = document.getElementById(\"playerTitle\");\nvar playerArtist = document.getElementById(\"playerArtist\");\nvar playerBar = document.getElementById(\"playerBar\");\nvar playerBarBox = document.getElementById(\"playerBarBox\");\nvar playerPlayBtn = document.getElementById(\"playerPlayBtn\");\nvar playerPauseBtn = document.getElementById(\"playerPauseBtn\");\nvar playerSkipBtn = document.getElementById(\"playerSkipBtn\");\nvar currentPlayingItem = null;\n\nfunction togglePlayer() {\n $(player).toast(\"show\");\n}\n\nfunction playerSetIdle() {\n playerArtwork.style.display = 'none';\n playerArtworkIdle.style.display = 'block';\n playerTitle.textContent = '-- IDLE --';\n playerArtist.textContent = '';\n setProgressBar(playerBar, 0);\n}\n\nfunction updatePlayerInfo(item) {\n if (!item) {\n playerSetIdle();\n }\n\n playerArtwork.style.display = 'block';\n playerArtworkIdle.style.display = 'none';\n currentPlayingItem = item;\n playerTitle.textContent = item.title;\n playerArtist.textContent = item.artist;\n playerArtwork.setAttribute(\"src\", item.thumbnail);\n\n if (isOverflown(playerTitle)) {\n playerTitle.classList.add(\"scrolling\");\n } else {\n playerTitle.classList.remove(\"scrolling\");\n }\n\n if (isOverflown(playerArtist)) {\n playerArtist.classList.add(\"scrolling\");\n } else {\n playerArtist.classList.remove(\"scrolling\");\n }\n}\n\nfunction updatePlayerControls(play, empty) {\n if (empty) {\n playerSetIdle();\n playerPlayBtn.setAttribute(\"disabled\", \"\");\n playerPauseBtn.setAttribute(\"disabled\", \"\");\n playerSkipBtn.setAttribute(\"disabled\", \"\");\n } else {\n playerPlayBtn.removeAttribute(\"disabled\");\n playerPauseBtn.removeAttribute(\"disabled\");\n playerSkipBtn.removeAttribute(\"disabled\");\n }\n\n if (play) {\n playerPlayBtn.style.display = 'none';\n playerPauseBtn.style.display = 'block';\n } else {\n playerPlayBtn.style.display = 'block';\n playerPauseBtn.style.display = 'none';\n }\n}\n\nvar playhead_timer;\nvar player_playhead_position;\nvar playhead_dragging = false;\n\nfunction updatePlayerPlayhead(playhead) {\n if (!currentPlayingItem || playhead_dragging) {\n return;\n }\n\n if (currentPlayingItem.duration !== 0 || currentPlayingItem.duration < playhead) {\n playerBar.classList.remove(\"progress-bar-animated\");\n clearInterval(playhead_timer);\n player_playhead_position = playhead;\n setProgressBar(playerBar, player_playhead_position / currentPlayingItem.duration, secondsToStr(player_playhead_position));\n\n if (playing) {\n playhead_timer = setInterval(function () {\n player_playhead_position += 0.1;\n setProgressBar(playerBar, player_playhead_position / currentPlayingItem.duration, secondsToStr(player_playhead_position));\n }, 100); // delay in milliseconds\n }\n } else {\n if (playing) {\n playerBar.classList.add(\"progress-bar-animated\");\n } else {\n playerBar.classList.remove(\"progress-bar-animated\");\n }\n\n setProgressBar(playerBar, 1);\n }\n}\n\nplayerBarBox.addEventListener('mousedown', function () {\n if (currentPlayingItem && currentPlayingItem.duration > 0) {\n playerBarBox.addEventListener('mousemove', playheadDragged);\n clearInterval(playhead_timer);\n playhead_dragging = true;\n }\n});\nplayerBarBox.addEventListener('mouseup', function (event) {\n playerBarBox.removeEventListener('mousemove', playheadDragged);\n var percent = event.offsetX / playerBarBox.clientWidth;\n request('post', {\n move_playhead: percent * currentPlayingItem.duration\n });\n playhead_dragging = false;\n});\n\nfunction playheadDragged(event) {\n var percent = event.offsetX / playerBarBox.clientWidth;\n setProgressBar(playerBar, percent, secondsToStr(percent * currentPlayingItem.duration));\n} // ---------------------\n// ------- Util -------\n// ---------------------\n\n\nfunction isOverflown(element) {\n return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;\n}\n\nfunction setProgressBar(bar, progress) {\n var text = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n var prog_str = (progress * 100).toString();\n bar.setAttribute(\"aria-valuenow\", prog_str);\n bar.style.width = prog_str + \"%\";\n bar.textContent = text;\n}\n\nfunction secondsToStr(seconds) {\n seconds = Math.floor(seconds);\n var mins = Math.floor(seconds / 60);\n var secs = seconds % 60;\n return (\"00\" + mins).slice(-2) + \":\" + (\"00\" + secs).slice(-2);\n}\n\nthemeInit();\nupdateResults();\n$(document).ready(updatePlaylist); // Check the version of playlist to see if update is needed.\n\nsetInterval(checkForPlaylistUpdate, 3000);\n\n//# sourceURL=webpack:///./src/js/main.js?"); /***/ }), diff --git a/static/js/main.js.LICENSE.txt b/static/js/main.js.LICENSE.txt deleted file mode 100644 index 543cdfc..0000000 --- a/static/js/main.js.LICENSE.txt +++ /dev/null @@ -1,54 +0,0 @@ -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ - -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ - -/*! - * jQuery Migrate - v3.3.0 - 2020-05-05T01:57Z - * Copyright OpenJS Foundation and other contributors - */ - -/**! - * @fileOverview Kickass library to create and place poppers near their reference elements. - * @version 1.16.1 - * @license - * Copyright (c) 2016 Federico Zivolo and contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ diff --git a/templates/index.html b/templates/index.html index 22aa4b6..16731d8 100644 --- a/templates/index.html +++ b/templates/index.html @@ -6,16 +6,16 @@ botamusique web interface - + - +