Copy the generated token and paste it in the token input box.
' + `';\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])(['setConfig', 'setTheme', 'getApiKey']),\n\n async githubBranchForceUpdate() {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/branchForceUpdate');\n\n if (response.data._size > 0) {\n this.githubBranchesForced = response.data.resetBranches;\n }\n },\n\n async generateApiKey() {\n const {\n getApiKey,\n save\n } = this;\n\n try {\n await getApiKey();\n this.$snotify.success('Saving and reloading the page, to utilize the new api key', 'Warning', {\n timeout: 5000\n });\n setTimeout(() => {\n // Save the new apiKey. No choice to reload because of /src/api.js\n save();\n }, 500);\n setTimeout(() => {\n // For now we reload the page since the layouts use python still\n location.reload();\n }, 500);\n } catch (error) {\n this.$snotify.error('Error while trying to get a new api key', `Error: ${error}`);\n }\n },\n\n async changeTheme(themeName) {\n const {\n setTheme\n } = this;\n\n try {\n await setTheme({\n themeName\n });\n this.$snotify.success('Saving and reloading the page', 'Saving', {\n timeout: 5000\n });\n setTimeout(() => {\n // For now we reload the page since the layouts use python still\n location.reload();\n }, 1000);\n } catch (error) {\n this.$snotify.error('Error while trying to change the theme', `Error: ${error}`);\n }\n },\n\n async save() {\n const {\n config,\n layout,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true;\n const {\n availableThemes,\n backlogOverview,\n datePresets,\n loggingLevels,\n logs,\n timePresets,\n randomShowSlug,\n recentShows,\n themeName,\n ...filteredConfig\n } = config;\n const configMain = {\n section: 'main',\n config: Object.assign({}, filteredConfig, {\n layout\n }, {\n logs: {\n debug: config.logs.debug,\n dbDebug: config.logs.dbDebug,\n actualLogDir: config.logs.actualLogDir,\n nr: config.logs.nr,\n size: config.logs.size,\n subliminalLog: config.logs.subliminalLog,\n privacyLevel: config.logs.privacyLevel\n }\n })\n };\n\n try {\n await setConfig(configMain);\n this.$snotify.success('Saved general config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save general config', `Error: ${error}`);\n } finally {\n this.saving = false;\n }\n }\n\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/config-general.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api.js */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _utils_core_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/core.js */ \"./src/utils/core.js\");\n/* harmony import */ var date_fns_format__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! date-fns/format */ \"./node_modules/date-fns/esm/format/index.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vue-js-toggle-button */ \"./node_modules/vue-js-toggle-button/dist/index.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var vue_multiselect__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! vue-multiselect */ \"./node_modules/vue-multiselect/dist/vue-multiselect.min.js\");\n/* harmony import */ var vue_multiselect__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(vue_multiselect__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var vue_multiselect_dist_vue_multiselect_min_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! vue-multiselect/dist/vue-multiselect.min.css */ \"./node_modules/vue-multiselect/dist/vue-multiselect.min.css\");\n/* harmony import */ var vue_multiselect_dist_vue_multiselect_min_css__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(vue_multiselect_dist_vue_multiselect_min_css__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var v_tooltip__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! v-tooltip */ \"./node_modules/v-tooltip/dist/v-tooltip.esm.js\");\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config-general',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"AppLink\"],\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"ConfigTemplate\"],\n ConfigTextbox: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"ConfigTextbox\"],\n ConfigTextboxNumber: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"ConfigTextboxNumber\"],\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"ConfigToggleSlider\"],\n LanguageSelect: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"LanguageSelect\"],\n Multiselect: (vue_multiselect__WEBPACK_IMPORTED_MODULE_7___default()),\n VPopover: v_tooltip__WEBPACK_IMPORTED_MODULE_9__[\"VPopover\"],\n ToggleButton: vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_6__[\"ToggleButton\"],\n RootDirs: _root_dirs_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n },\n directives: {\n tooltip: v_tooltip__WEBPACK_IMPORTED_MODULE_9__[\"VTooltip\"]\n },\n\n data() {\n const defaultPageOptions = [{\n value: 'home',\n text: 'Shows'\n }, {\n value: 'schedule',\n text: 'Schedule'\n }, {\n value: 'history',\n text: 'History'\n }, {\n value: 'news',\n text: 'News'\n }, {\n value: 'IRC',\n text: 'IRC'\n }];\n const privacyLevelOptions = [{\n value: 'high',\n text: 'HIGH'\n }, {\n value: 'normal',\n text: 'NORMAL'\n }, {\n value: 'low',\n text: 'LOW'\n }];\n return {\n defaultPageOptions,\n privacyLevelOptions,\n githubBranchesForced: [],\n resetBranchSelected: null\n };\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n general: state => state.config.general,\n configLoaded: state => state.config.consts.statuses.length > 0,\n layout: state => state.config.layout,\n statuses: state => state.config.consts.statuses,\n indexers: state => state.config.indexers,\n system: state => state.config.system\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])(['getStatus']),\n indexerDefault: {\n get() {\n const {\n general\n } = this;\n const {\n indexerDefault\n } = general;\n return indexerDefault || 0;\n },\n\n set(indexer) {\n // TODO: commit instead\n this.general.indexerDefault = indexer;\n }\n\n },\n\n indexerListOptions() {\n const {\n indexers\n } = this;\n const allIndexers = [{\n text: 'All Indexers',\n value: 0\n }];\n const indexerOptions = Object.values(indexers.indexers).map(indexer => ({\n value: indexer.id,\n text: indexer.name\n }));\n return [...allIndexers, ...indexerOptions];\n },\n\n datePresetOptions() {\n const {\n general\n } = this;\n const {\n datePresets\n } = general;\n const systemDefault = [{\n value: '%x',\n text: 'Use System Default'\n }];\n const formattedDatePresets = datePresets.map(preset => ({\n value: preset,\n text: Object(date_fns_format__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(new Date(), Object(_utils_core_js__WEBPACK_IMPORTED_MODULE_4__[\"convertDateFormat\"])(preset))\n }));\n return [...systemDefault, ...formattedDatePresets];\n },\n\n timePresetOptions() {\n const {\n general\n } = this;\n const {\n timePresets\n } = general;\n const systemDefault = [{\n value: '%x',\n text: 'Use System Default'\n }];\n const formattedTimePresets = timePresets.map(preset => ({\n value: preset,\n text: Object(date_fns_format__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(new Date(), Object(_utils_core_js__WEBPACK_IMPORTED_MODULE_4__[\"convertDateFormat\"])(preset))\n }));\n return [...systemDefault, ...formattedTimePresets];\n },\n\n availableThemesOptions() {\n const {\n general\n } = this;\n const {\n availableThemes\n } = general;\n\n if (!availableThemes) {\n return [];\n }\n\n return availableThemes.map(theme => ({\n value: theme.name,\n text: `${theme.name} (${theme.version})`\n }));\n },\n\n cpuPresetOptions() {\n const {\n system\n } = this;\n const {\n cpuPresets\n } = system;\n\n if (!cpuPresets) {\n return [];\n }\n\n return Object.keys(cpuPresets).map(key => ({\n value: key,\n text: key\n }));\n },\n\n defaultDeletedEpOptions() {\n const {\n general,\n getStatus\n } = this;\n let status = [];\n\n if (general.skipRemovedFiles) {\n status = ['skipped', 'ignored'].map(key => getStatus({\n key\n }));\n } else {\n // Get status objects, when skip removed files is enabled\n status = ['skipped', 'ignored', 'archived'].map(key => getStatus({\n key\n }));\n }\n\n if (status.every(x => x !== undefined)) {\n return status.map(status => ({\n text: status.name,\n value: status.value\n }));\n }\n\n return [];\n },\n\n githubRemoteBranchesOptions() {\n const {\n general,\n githubBranches,\n githubBranchForceUpdate\n } = this;\n const {\n system\n } = this;\n const {\n username,\n password,\n token\n } = general.git;\n\n if (!system.gitRemoteBranches) {\n return [];\n }\n\n if (!system.gitRemoteBranches.length > 0) {\n githubBranchForceUpdate();\n }\n\n let filteredBranches = [];\n\n if ((username && password || token) && general.developer) {\n filteredBranches = githubBranches;\n } else if (username && password || token) {\n filteredBranches = githubBranches.filter(branch => ['master', 'develop'].includes(branch));\n } else {\n filteredBranches = githubBranches.filter(branch => ['master'].includes(branch));\n }\n\n return filteredBranches.map(branch => ({\n text: branch,\n value: branch\n }));\n },\n\n githubBranches() {\n const {\n system,\n githubBranchesForced\n } = this;\n return system.gitRemoteBranches || githubBranchesForced;\n },\n\n githubTokenPopover() {\n const {\n general\n } = this;\n return '
Copy the generated token and paste it in the token input box.
' + `';\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])(['setConfig', 'setTheme', 'getApiKey']),\n\n async githubBranchForceUpdate() {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/branchForceUpdate');\n\n if (response.data._size > 0) {\n this.githubBranchesForced = response.data.resetBranches;\n }\n },\n\n async generateApiKey() {\n const {\n getApiKey,\n save\n } = this;\n\n try {\n await getApiKey();\n this.$snotify.success('Saving and reloading the page, to utilize the new api key', 'Warning', {\n timeout: 5000\n });\n setTimeout(() => {\n // Save the new apiKey. No choice to reload because of /src/api.js\n save();\n }, 500);\n setTimeout(() => {\n // For now we reload the page since the layouts use python still\n location.reload();\n }, 500);\n } catch (error) {\n this.$snotify.error('Error while trying to get a new api key', `Error: ${error}`);\n }\n },\n\n async changeTheme(themeName) {\n const {\n setTheme\n } = this;\n\n try {\n await setTheme({\n themeName\n });\n this.$snotify.success('Saving and reloading the page', 'Saving', {\n timeout: 5000\n });\n setTimeout(() => {\n // For now we reload the page since the layouts use python still\n location.reload();\n }, 1000);\n } catch (error) {\n this.$snotify.error('Error while trying to change the theme', `Error: ${error}`);\n }\n },\n\n async save() {\n const {\n general,\n layout,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true;\n const {\n availableThemes,\n backlogOverview,\n datePresets,\n loggingLevels,\n logs,\n timePresets,\n randomShowSlug,\n recentShows,\n themeName,\n ...filteredConfig\n } = general;\n const {\n local,\n ...filteredLayout\n } = layout;\n const configMain = {\n section: 'main',\n config: { ...filteredConfig,\n ...{\n layout: filteredLayout\n },\n ...{\n logs: {\n debug: general.logs.debug,\n dbDebug: general.logs.dbDebug,\n actualLogDir: general.logs.actualLogDir,\n nr: general.logs.nr,\n size: general.logs.size,\n subliminalLog: general.logs.subliminalLog,\n privacyLevel: general.logs.privacyLevel\n }\n }\n }\n };\n\n try {\n await setConfig(configMain);\n this.$snotify.success('Saved general config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save general config', `Error: ${error}`);\n } finally {\n this.saving = false;\n }\n }\n\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/config-general.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -104,7 +104,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api.js */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config-notifications',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTemplate\"],\n ConfigTextbox: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextbox\"],\n ConfigTextboxNumber: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextboxNumber\"],\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigToggleSlider\"],\n SelectList: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"SelectList\"],\n ShowSelector: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ShowSelector\"]\n },\n\n data() {\n return {\n prowlSelectedShow: null,\n prowlSelectedShowApiKeys: [],\n prowlPriorityOptions: [{\n text: 'Very Low',\n value: -2\n }, {\n text: 'Moderate',\n value: -1\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 1\n }, {\n text: 'Emergency',\n value: 2\n }],\n pushoverPriorityOptions: [{\n text: 'Lowest',\n value: -2\n }, {\n text: 'Low',\n value: -1\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 1\n }, {\n text: 'Emergency',\n value: 2\n }],\n pushoverSoundOptions: [{\n text: 'Default',\n value: 'default'\n }, {\n text: 'Pushover',\n value: 'pushover'\n }, {\n text: 'Bike',\n value: 'bike'\n }, {\n text: 'Bugle',\n value: 'bugle'\n }, {\n text: 'Cash Register',\n value: 'cashregister'\n }, {\n text: 'classical',\n value: 'classical'\n }, {\n text: 'Cosmic',\n value: 'cosmic'\n }, {\n text: 'Falling',\n value: 'falling'\n }, {\n text: 'Gamelan',\n value: 'gamelan'\n }, {\n text: 'Incoming',\n value: 'incoming'\n }, {\n text: 'Intermission',\n value: 'intermission'\n }, {\n text: 'Magic',\n value: 'magic'\n }, {\n text: 'Mechanical',\n value: 'mechanical'\n }, {\n text: 'Piano Bar',\n value: 'pianobar'\n }, {\n text: 'Siren',\n value: 'siren'\n }, {\n text: 'Space Alarm',\n value: 'spacealarm'\n }, {\n text: 'Tug Boat',\n value: 'tugboat'\n }, {\n text: 'Alien Alarm (long)',\n value: 'alien'\n }, {\n text: 'Climb (long)',\n value: 'climb'\n }, {\n text: 'Persistent (long)',\n value: 'persistant'\n }, {\n text: 'Pushover Echo (long)',\n value: 'echo'\n }, {\n text: 'Up Down (long)',\n value: 'updown'\n }, {\n text: 'None (silent)',\n value: 'none'\n }],\n pushbulletDeviceOptions: [{\n text: 'All devices',\n value: ''\n }],\n traktMethodOptions: [{\n text: 'Skip all',\n value: 0\n }, {\n text: 'Download pilot only',\n value: 1\n }, {\n text: 'Get whole show',\n value: 2\n }],\n pushbulletTestInfo: 'Click below to test.',\n joinTestInfo: 'Click below to test.',\n twitterTestInfo: 'Click below to test.',\n twitterKey: '',\n emailSelectedShow: null,\n emailSelectedShowAdresses: []\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])(['config', 'indexers', 'notifiers']),\n\n traktNewTokenMessage() {\n const {\n accessToken\n } = this.notifiers.trakt;\n return true ? 'New ' : undefined;\n },\n\n traktIndexersOptions() {\n const {\n indexers\n } = this;\n const {\n traktIndexers\n } = indexers.main;\n const validTraktIndexer = Object.keys(indexers.indexers).filter(k => traktIndexers[k]);\n return validTraktIndexer.map(indexer => {\n return {\n text: indexer,\n value: indexers.indexers[indexer].id\n };\n });\n }\n\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n mounted() {\n // TODO: vueify this.\n $('#trakt_pin').on('keyup change', () => {\n if ($('#trakt_pin').val().length === 0) {\n $('#TraktGetPin').removeClass('hide');\n $('#authTrakt').addClass('hide');\n } else {\n $('#TraktGetPin').addClass('hide');\n $('#authTrakt').removeClass('hide');\n }\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])(['getShows', 'setConfig']),\n\n onChangeProwlApi(items) {\n this.notifiers.prowl.api = items.map(item => item.value);\n },\n\n savePerShowNotifyList(listType, values) {\n const {\n emailSelectedShow,\n prowlSelectedShow\n } = this;\n const form = new FormData();\n\n if (listType === 'prowl') {\n form.set('show', prowlSelectedShow);\n form.set('prowlAPIs', values.map(apiKey => apiKey.value));\n } else {\n form.set('show', emailSelectedShow);\n form.set('emails', values.map(apiKey => apiKey.value));\n } // Save the list\n\n\n _api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"].post('home/saveShowNotifyList', form);\n },\n\n async prowlUpdateApiKeys(selectedShow) {\n this.prowlSelectedShow = selectedShow;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/loadShowNotifyLists');\n\n if (response.data._size > 0) {\n const list = response.data[selectedShow].prowl_notify_list ? response.data[selectedShow].prowl_notify_list.split(',') : [];\n this.prowlSelectedShowApiKeys = selectedShow ? list : [];\n }\n },\n\n async emailUpdateShowEmail(selectedShow) {\n this.emailSelectedShow = selectedShow;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/loadShowNotifyLists');\n\n if (response.data._size > 0) {\n const list = response.data[selectedShow].list ? response.data[selectedShow].list.split(',') : [];\n this.emailSelectedShowAdresses = selectedShow ? list : [];\n }\n },\n\n emailUpdateAddressList(items) {\n this.notifiers.email.addressList = items.map(x => x.value);\n },\n\n async getPushbulletDeviceOptions() {\n const {\n api: pushbulletApiKey\n } = this.notifiers.pushbullet;\n\n if (!pushbulletApiKey) {\n this.pushbulletTestInfo = 'You didn\\'t supply a Pushbullet api key';\n $('#pushbullet_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/getPushbulletDevices', {\n params: {\n api: pushbulletApiKey\n }\n });\n const options = [];\n const {\n data\n } = response;\n\n if (!data) {\n return false;\n }\n\n options.push({\n text: 'All devices',\n value: ''\n });\n\n for (const device of data.devices) {\n if (device.active === true) {\n options.push({\n text: device.nickname,\n value: device.iden\n });\n }\n }\n\n this.pushbulletDeviceOptions = options;\n this.pushbulletTestInfo = 'Device list updated. Please choose a device to push to.';\n },\n\n async testPushbulletApi() {\n const {\n api: pushbulletApiKey\n } = this.notifiers.pushbullet;\n\n if (!pushbulletApiKey) {\n this.pushbulletTestInfo = 'You didn\\'t supply a Pushbullet api key';\n $('#pushbullet_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testPushbullet', {\n params: {\n api: pushbulletApiKey\n }\n });\n const {\n data\n } = response;\n\n if (data) {\n this.pushbulletTestInfo = data;\n }\n },\n\n async testJoinApi() {\n const {\n api: joinApiKey\n } = this.notifiers.join;\n\n if (!joinApiKey) {\n this.joinTestInfo = 'You didn\\'t supply a Join api key';\n $('#join_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testJoin', {\n params: {\n api: joinApiKey\n }\n });\n const {\n data\n } = response;\n\n if (data) {\n this.joinTestInfo = data;\n }\n },\n\n async twitterStep1() {\n this.twitterTestInfo = MEDUSA.config.loading;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/twitterStep1');\n const {\n data\n } = response;\n window.open(data);\n this.twitterTestInfo = 'Step1: Confirm Authorization';\n },\n\n async twitterStep2() {\n const twitter = {};\n const {\n twitterKey\n } = this;\n twitter.key = twitterKey;\n\n if (twitter.key) {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/twitterStep2', {\n params: {\n key: twitter.key\n }\n });\n const {\n data\n } = response;\n this.twitterTestInfo = data;\n } else {\n this.twitterTestInfo = 'Please fill out the necessary fields above.';\n }\n },\n\n async twitterTest() {\n try {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testTwitter');\n const {\n data\n } = response;\n this.twitterTestInfo = data;\n } catch (error) {\n this.twitterTestInfo = 'Error while trying to request for a test on the twitter api.';\n }\n },\n\n async save() {\n const {\n notifiers,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true;\n const section = 'main';\n\n try {\n await setConfig({\n section,\n config: {\n notifiers\n }\n });\n this.$snotify.success('Saved Notifiers config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save notifiers config', 'Error');\n } finally {\n this.saving = false;\n }\n },\n\n testGrowl() {\n const growl = {};\n growl.host = $.trim($('#growl_host').val());\n growl.password = $.trim($('#growl_password').val());\n\n if (!growl.host) {\n $('#testGrowl-result').html('Please fill out the necessary fields above.');\n $('#growl_host').addClass('warning');\n return;\n }\n\n $('#growl_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testGrowl-result').html(MEDUSA.config.loading);\n $.get('home/testGrowl', {\n host: growl.host,\n password: growl.password\n }).done(data => {\n $('#testGrowl-result').html(data);\n $('#testGrowl').prop('disabled', false);\n });\n },\n\n testProwl() {\n const prowl = {};\n prowl.api = $.trim($('#prowl_api').find('input').val());\n prowl.priority = $('#prowl_priority').find('input').val();\n\n if (!prowl.api) {\n $('#testProwl-result').html('Please fill out the necessary fields above.');\n $('#prowl_api').find('input').addClass('warning');\n return;\n }\n\n $('#prowl_api').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testProwl-result').html(MEDUSA.config.loading);\n $.get('home/testProwl', {\n prowl_api: prowl.api,\n // eslint-disable-line camelcase\n prowl_priority: prowl.priority // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testProwl-result').html(data);\n $('#testProwl').prop('disabled', false);\n });\n },\n\n testKODI() {\n const kodi = {};\n const kodiHostInput = $('#kodi_host').find('input');\n const kodiHosts = kodiHostInput.toArray().map(value => value.value).filter(item => item !== '');\n kodi.host = kodiHosts.join(',');\n kodi.username = $.trim($('#kodi_username').val());\n kodi.password = $.trim($('#kodi_password').val());\n\n if (!kodi.host) {\n $('#testKODI-result').html('Please fill out the necessary fields above.');\n $('#kodi_host').find('input').addClass('warning');\n return;\n }\n\n $('#kodi_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testKODI-result').html(MEDUSA.config.loading);\n $.get('home/testKODI', {\n host: kodi.host,\n username: kodi.username,\n password: kodi.password\n }).done(data => {\n $('#testKODI-result').html(data);\n $('#testKODI').prop('disabled', false);\n });\n },\n\n testPHT() {\n const plex = {};\n plex.client = {};\n const plexHostsInput = $('#plex_client_host').find('input');\n const plexHosts = plexHostsInput.toArray().map(value => value.value).filter(item => item !== '');\n plex.client.host = plexHosts.join(',');\n plex.client.username = $.trim($('#plex_client_username').val());\n plex.client.password = $.trim($('#plex_client_password').val());\n\n if (!plex.client.host) {\n $('#testPHT-result').html('Please fill out the necessary fields above.');\n $('#plex_client_host').find('input').addClass('warning');\n return;\n }\n\n $('#plex_client_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPHT-result').html(MEDUSA.config.loading);\n $.get('home/testPHT', {\n host: plex.client.host,\n username: plex.client.username,\n password: plex.client.password\n }).done(data => {\n $('#testPHT-result').html(data);\n $('#testPHT').prop('disabled', false);\n });\n },\n\n testPMS() {\n const plex = {};\n plex.server = {};\n const plexHostsInput = $('#plex_server_host').find('input');\n const plexHosts = plexHostsInput.toArray().map(value => value.value).filter(item => item !== '');\n plex.server.host = plexHosts.join(',');\n plex.server.username = $.trim($('#plex_server_username').val());\n plex.server.password = $.trim($('#plex_server_password').val());\n plex.server.token = $.trim($('#plex_server_token').val());\n\n if (!plex.server.host) {\n $('#testPMS-result').html('Please fill out the necessary fields above.');\n $('#plex_server_host').find('input').addClass('warning');\n return;\n }\n\n $('#plex_server_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPMS-result').html(MEDUSA.config.loading);\n $.get('home/testPMS', {\n host: plex.server.host,\n username: plex.server.username,\n password: plex.server.password,\n plex_server_token: plex.server.token // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testPMS-result').html(data);\n $('#testPMS').prop('disabled', false);\n });\n },\n\n testEMBY() {\n const emby = {};\n emby.host = $('#emby_host').val();\n emby.apikey = $('#emby_apikey').val();\n\n if (!emby.host || !emby.apikey) {\n $('#testEMBY-result').html('Please fill out the necessary fields above.');\n $('#emby_host').addRemoveWarningClass(emby.host);\n $('#emby_apikey').addRemoveWarningClass(emby.apikey);\n return;\n }\n\n $('#emby_host,#emby_apikey').children('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testEMBY-result').html(MEDUSA.config.loading);\n $.get('home/testEMBY', {\n host: emby.host,\n emby_apikey: emby.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testEMBY-result').html(data);\n $('#testEMBY').prop('disabled', false);\n });\n },\n\n testBoxcar2() {\n const boxcar2 = {};\n boxcar2.accesstoken = $.trim($('#boxcar2_accesstoken').val());\n\n if (!boxcar2.accesstoken) {\n $('#testBoxcar2-result').html('Please fill out the necessary fields above.');\n $('#boxcar2_accesstoken').addClass('warning');\n return;\n }\n\n $('#boxcar2_accesstoken').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testBoxcar2-result').html(MEDUSA.config.loading);\n $.get('home/testBoxcar2', {\n accesstoken: boxcar2.accesstoken\n }).done(data => {\n $('#testBoxcar2-result').html(data);\n $('#testBoxcar2').prop('disabled', false);\n });\n },\n\n testPushover() {\n const pushover = {};\n pushover.userkey = $('#pushover_userkey').val();\n pushover.apikey = $('#pushover_apikey').val();\n\n if (!pushover.userkey || !pushover.apikey) {\n $('#testPushover-result').html('Please fill out the necessary fields above.');\n $('#pushover_userkey').addRemoveWarningClass(pushover.userkey);\n $('#pushover_apikey').addRemoveWarningClass(pushover.apikey);\n return;\n }\n\n $('#pushover_userkey,#pushover_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPushover-result').html(MEDUSA.config.loading);\n $.get('home/testPushover', {\n userKey: pushover.userkey,\n apiKey: pushover.apikey\n }).done(data => {\n $('#testPushover-result').html(data);\n $('#testPushover').prop('disabled', false);\n });\n },\n\n testLibnotify() {\n $('#testLibnotify-result').html(MEDUSA.config.loading);\n $.get('home/testLibnotify', data => {\n $('#testLibnotify-result').html(data);\n });\n },\n\n settingsNMJ() {\n const nmj = {};\n nmj.host = $('#nmj_host').val();\n\n if (nmj.host) {\n $('#testNMJ-result').html(MEDUSA.config.loading);\n $.get('home/settingsNMJ', {\n host: nmj.host\n }, data => {\n if (data === null) {\n $('#nmj_database').removeAttr('readonly');\n $('#nmj_mount').removeAttr('readonly');\n }\n\n const JSONData = $.parseJSON(data);\n $('#testNMJ-result').html(JSONData.message);\n $('#nmj_database').val(JSONData.database);\n $('#nmj_mount').val(JSONData.mount);\n\n if (JSONData.database) {\n $('#nmj_database').prop('readonly', true);\n } else {\n $('#nmj_database').removeAttr('readonly');\n }\n\n if (JSONData.mount) {\n $('#nmj_mount').prop('readonly', true);\n } else {\n $('#nmj_mount').removeAttr('readonly');\n }\n });\n } else {\n alert('Please fill in the Popcorn IP address'); // eslint-disable-line no-alert\n\n $('#nmj_host').focus();\n }\n },\n\n testNMJ() {\n const nmj = {};\n nmj.host = $.trim($('#nmj_host').val());\n nmj.database = $('#nmj_database').val();\n nmj.mount = $('#nmj_mount').val();\n\n if (nmj.host) {\n $('#nmj_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testNMJ-result').html(MEDUSA.config.loading);\n $.get('home/testNMJ', {\n host: nmj.host,\n database: nmj.database,\n mount: nmj.mount\n }).done(data => {\n $('#testNMJ-result').html(data);\n $('#testNMJ').prop('disabled', false);\n });\n } else {\n $('#testNMJ-result').html('Please fill out the necessary fields above.');\n $('#nmj_host').addClass('warning');\n }\n },\n\n settingsNMJv2() {\n const nmjv2 = {};\n nmjv2.host = $('#nmjv2_host').val();\n\n if (nmjv2.host) {\n $('#testNMJv2-result').html(MEDUSA.config.loading);\n nmjv2.dbloc = '';\n const radios = document.getElementsByName('nmjv2_dbloc');\n\n for (let i = 0, len = radios.length; i < len; i++) {\n if (radios[i].checked) {\n nmjv2.dbloc = radios[i].value;\n break;\n }\n }\n\n nmjv2.dbinstance = $('#NMJv2db_instance').val();\n $.get('home/settingsNMJv2', {\n host: nmjv2.host,\n dbloc: nmjv2.dbloc,\n instance: nmjv2.dbinstance\n }, data => {\n if (data === null) {\n $('#nmjv2_database').removeAttr('readonly');\n }\n\n const JSONData = $.parseJSON(data);\n $('#testNMJv2-result').html(JSONData.message);\n $('#nmjv2_database').val(JSONData.database);\n\n if (JSONData.database) {\n $('#nmjv2_database').prop('readonly', true);\n } else {\n $('#nmjv2_database').removeAttr('readonly');\n }\n });\n } else {\n alert('Please fill in the Popcorn IP address'); // eslint-disable-line no-alert\n\n $('#nmjv2_host').focus();\n }\n },\n\n testNMJv2() {\n const nmjv2 = {};\n nmjv2.host = $.trim($('#nmjv2_host').val());\n\n if (nmjv2.host) {\n $('#nmjv2_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testNMJv2-result').html(MEDUSA.config.loading);\n $.get('home/testNMJv2', {\n host: nmjv2.host\n }).done(data => {\n $('#testNMJv2-result').html(data);\n $('#testNMJv2').prop('disabled', false);\n });\n } else {\n $('#testNMJv2-result').html('Please fill out the necessary fields above.');\n $('#nmjv2_host').addClass('warning');\n }\n },\n\n testFreeMobile() {\n const freemobile = {};\n freemobile.id = $.trim($('#freemobile_id').val());\n freemobile.apikey = $.trim($('#freemobile_apikey').val());\n\n if (!freemobile.id || !freemobile.apikey) {\n $('#testFreeMobile-result').html('Please fill out the necessary fields above.');\n\n if (freemobile.id) {\n $('#freemobile_id').removeClass('warning');\n } else {\n $('#freemobile_id').addClass('warning');\n }\n\n if (freemobile.apikey) {\n $('#freemobile_apikey').removeClass('warning');\n } else {\n $('#freemobile_apikey').addClass('warning');\n }\n\n return;\n }\n\n $('#freemobile_id,#freemobile_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testFreeMobile-result').html(MEDUSA.config.loading);\n $.get('home/testFreeMobile', {\n freemobile_id: freemobile.id,\n // eslint-disable-line camelcase\n freemobile_apikey: freemobile.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testFreeMobile-result').html(data);\n $('#testFreeMobile').prop('disabled', false);\n });\n },\n\n testTelegram() {\n const telegram = {};\n telegram.id = $.trim($('#telegram_id').val());\n telegram.apikey = $.trim($('#telegram_apikey').val());\n\n if (!telegram.id || !telegram.apikey) {\n $('#testTelegram-result').html('Please fill out the necessary fields above.');\n $('#telegram_id').addRemoveWarningClass(telegram.id);\n $('#telegram_apikey').addRemoveWarningClass(telegram.apikey);\n return;\n }\n\n $('#telegram_id,#telegram_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testTelegram-result').html(MEDUSA.config.loading);\n $.get('home/testTelegram', {\n telegram_id: telegram.id,\n // eslint-disable-line camelcase\n telegram_apikey: telegram.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTelegram-result').html(data);\n $('#testTelegram').prop('disabled', false);\n });\n },\n\n testDiscord() {\n const {\n notifiers\n } = this;\n\n if (!notifiers.discord.webhook) {\n $('#testDiscord-result').html('Please fill out the necessary fields above.');\n $('#discord_webhook').addRemoveWarningClass(notifiers.discord.webhook);\n return;\n }\n\n $('#discord_id,#discord_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testDiscord-result').html(MEDUSA.config.loading);\n $.get('home/testDiscord', {\n discord_webhook: notifiers.discord.webhook,\n // eslint-disable-line camelcase\n discord_tts: notifiers.discord.tts // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testDiscord-result').html(data);\n $('#testDiscord').prop('disabled', false);\n });\n },\n\n testSlack() {\n const slack = {};\n slack.webhook = $.trim($('#slack_webhook').val());\n\n if (!slack.webhook) {\n $('#testSlack-result').html('Please fill out the necessary fields above.');\n $('#slack_webhook').addRemoveWarningClass(slack.webhook);\n return;\n }\n\n $('#slack_webhook').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testSlack-result').html(MEDUSA.config.loading);\n $.get('home/testslack', {\n slack_webhook: slack.webhook // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testSlack-result').html(data);\n $('#testSlack').prop('disabled', false);\n });\n },\n\n TraktGetPin() {\n window.open($('#trakt_pin_url').val(), 'popUp', 'toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550');\n $('#trakt_pin').prop('disabled', false);\n },\n\n authTrakt() {\n const trakt = {};\n trakt.pin = $('#trakt_pin').val();\n\n if (trakt.pin.length !== 0) {\n $.get('home/getTraktToken', {\n trakt_pin: trakt.pin // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTrakt-result').html(data);\n $('#authTrakt').addClass('hide');\n $('#trakt_pin').prop('disabled', true);\n $('#trakt_pin').val('');\n $('#TraktGetPin').removeClass('hide');\n });\n }\n },\n\n testTrakt() {\n const trakt = {};\n trakt.username = $.trim($('#trakt_username').val());\n trakt.trendingBlacklist = $.trim($('#trakt_blacklist_name').val());\n\n if (!trakt.username) {\n $('#testTrakt-result').html('Please fill out the necessary fields above.');\n $('#trakt_username').addRemoveWarningClass(trakt.username);\n return;\n }\n\n if (/\\s/g.test(trakt.trendingBlacklist)) {\n $('#testTrakt-result').html('Check blacklist name; the value needs to be a trakt slug');\n $('#trakt_blacklist_name').addClass('warning');\n return;\n }\n\n $('#trakt_username').removeClass('warning');\n $('#trakt_blacklist_name').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testTrakt-result').html(MEDUSA.config.loading);\n $.get('home/testTrakt', {\n username: trakt.username,\n blacklist_name: trakt.trendingBlacklist // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTrakt-result').html(data);\n $('#testTrakt').prop('disabled', false);\n });\n },\n\n traktForceSync() {\n $('#testTrakt-result').html(MEDUSA.config.loading);\n $.getJSON('home/forceTraktSync', data => {\n $('#testTrakt-result').html(data.result);\n });\n },\n\n testEmail() {\n let to = '';\n const status = $('#testEmail-result');\n status.html(MEDUSA.config.loading);\n let host = $('#email_host').val();\n host = host.length > 0 ? host : null;\n let port = $('#email_port').val();\n port = port.length > 0 ? port : null;\n const tls = $('#email_tls').find('input').is(':checked') ? 1 : 0;\n let from = $('#email_from').val();\n from = from.length > 0 ? from : 'root@localhost';\n const user = $('#email_username').val().trim();\n const pwd = $('#email_password').val();\n let err = '';\n\n if (host === null) {\n err += '
- ' + err + '
You must provide a recipient email address!
');\n } else {\n $.get('home/testEmail', {\n host,\n port,\n smtp_from: from,\n // eslint-disable-line camelcase\n use_tls: tls,\n // eslint-disable-line camelcase\n user,\n pwd,\n to\n }, msg => {\n $('#testEmail-result').html(msg);\n });\n }\n }\n },\n\n testPushalot() {\n const pushalot = {};\n pushalot.authToken = $.trim($('#pushalot_authorizationtoken').val());\n\n if (!pushalot.authToken) {\n $('#testPushalot-result').html('Please fill out the necessary fields above.');\n $('#pushalot_authorizationtoken').addClass('warning');\n return;\n }\n\n $('#pushalot_authorizationtoken').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPushalot-result').html(MEDUSA.config.loading);\n $.get('home/testPushalot', {\n authorizationToken: pushalot.authToken\n }).done(data => {\n $('#testPushalot-result').html(data);\n $('#testPushalot').prop('disabled', false);\n });\n }\n\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/config-notifications.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api.js */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config-notifications',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTemplate\"],\n ConfigTextbox: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextbox\"],\n ConfigTextboxNumber: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextboxNumber\"],\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigToggleSlider\"],\n SelectList: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"SelectList\"],\n ShowSelector: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ShowSelector\"]\n },\n\n data() {\n return {\n prowlSelectedShow: null,\n prowlSelectedShowApiKeys: [],\n prowlPriorityOptions: [{\n text: 'Very Low',\n value: -2\n }, {\n text: 'Moderate',\n value: -1\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 1\n }, {\n text: 'Emergency',\n value: 2\n }],\n pushoverPriorityOptions: [{\n text: 'Lowest',\n value: -2\n }, {\n text: 'Low',\n value: -1\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 1\n }, {\n text: 'Emergency',\n value: 2\n }],\n pushoverSoundOptions: [{\n text: 'Default',\n value: 'default'\n }, {\n text: 'Pushover',\n value: 'pushover'\n }, {\n text: 'Bike',\n value: 'bike'\n }, {\n text: 'Bugle',\n value: 'bugle'\n }, {\n text: 'Cash Register',\n value: 'cashregister'\n }, {\n text: 'classical',\n value: 'classical'\n }, {\n text: 'Cosmic',\n value: 'cosmic'\n }, {\n text: 'Falling',\n value: 'falling'\n }, {\n text: 'Gamelan',\n value: 'gamelan'\n }, {\n text: 'Incoming',\n value: 'incoming'\n }, {\n text: 'Intermission',\n value: 'intermission'\n }, {\n text: 'Magic',\n value: 'magic'\n }, {\n text: 'Mechanical',\n value: 'mechanical'\n }, {\n text: 'Piano Bar',\n value: 'pianobar'\n }, {\n text: 'Siren',\n value: 'siren'\n }, {\n text: 'Space Alarm',\n value: 'spacealarm'\n }, {\n text: 'Tug Boat',\n value: 'tugboat'\n }, {\n text: 'Alien Alarm (long)',\n value: 'alien'\n }, {\n text: 'Climb (long)',\n value: 'climb'\n }, {\n text: 'Persistent (long)',\n value: 'persistant'\n }, {\n text: 'Pushover Echo (long)',\n value: 'echo'\n }, {\n text: 'Up Down (long)',\n value: 'updown'\n }, {\n text: 'None (silent)',\n value: 'none'\n }],\n pushbulletDeviceOptions: [{\n text: 'All devices',\n value: ''\n }],\n traktMethodOptions: [{\n text: 'Skip all',\n value: 0\n }, {\n text: 'Download pilot only',\n value: 1\n }, {\n text: 'Get whole show',\n value: 2\n }],\n pushbulletTestInfo: 'Click below to test.',\n joinTestInfo: 'Click below to test.',\n twitterTestInfo: 'Click below to test.',\n twitterKey: '',\n emailSelectedShow: null,\n emailSelectedShowAdresses: []\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config.general,\n indexers: state => state.config.indexers,\n notifiers: state => state.config.notifiers\n }),\n\n traktNewTokenMessage() {\n const {\n accessToken\n } = this.notifiers.trakt;\n return true ? 'New ' : undefined;\n },\n\n traktIndexersOptions() {\n const {\n indexers\n } = this;\n const {\n traktIndexers\n } = indexers.main;\n const validTraktIndexer = Object.keys(indexers.indexers).filter(k => traktIndexers[k]);\n return validTraktIndexer.map(indexer => {\n return {\n text: indexer,\n value: indexers.indexers[indexer].id\n };\n });\n }\n\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n mounted() {\n // TODO: vueify this.\n $('#trakt_pin').on('keyup change', () => {\n if ($('#trakt_pin').val().length === 0) {\n $('#TraktGetPin').removeClass('hide');\n $('#authTrakt').addClass('hide');\n } else {\n $('#TraktGetPin').addClass('hide');\n $('#authTrakt').removeClass('hide');\n }\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])(['getShows', 'setConfig']),\n\n onChangeProwlApi(items) {\n this.notifiers.prowl.api = items.map(item => item.value);\n },\n\n savePerShowNotifyList(listType, values) {\n const {\n emailSelectedShow,\n prowlSelectedShow\n } = this;\n const form = new FormData();\n\n if (listType === 'prowl') {\n form.set('show', prowlSelectedShow);\n form.set('prowlAPIs', values.map(apiKey => apiKey.value));\n } else {\n form.set('show', emailSelectedShow);\n form.set('emails', values.map(apiKey => apiKey.value));\n } // Save the list\n\n\n _api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"].post('home/saveShowNotifyList', form);\n },\n\n async prowlUpdateApiKeys(selectedShow) {\n this.prowlSelectedShow = selectedShow;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/loadShowNotifyLists');\n\n if (response.data._size > 0) {\n const list = response.data[selectedShow].prowl_notify_list ? response.data[selectedShow].prowl_notify_list.split(',') : [];\n this.prowlSelectedShowApiKeys = selectedShow ? list : [];\n }\n },\n\n async emailUpdateShowEmail(selectedShow) {\n this.emailSelectedShow = selectedShow;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/loadShowNotifyLists');\n\n if (response.data._size > 0) {\n const list = response.data[selectedShow].list ? response.data[selectedShow].list.split(',') : [];\n this.emailSelectedShowAdresses = selectedShow ? list : [];\n }\n },\n\n emailUpdateAddressList(items) {\n this.notifiers.email.addressList = items.map(x => x.value);\n },\n\n async getPushbulletDeviceOptions() {\n const {\n api: pushbulletApiKey\n } = this.notifiers.pushbullet;\n\n if (!pushbulletApiKey) {\n this.pushbulletTestInfo = 'You didn\\'t supply a Pushbullet api key';\n $('#pushbullet_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/getPushbulletDevices', {\n params: {\n api: pushbulletApiKey\n }\n });\n const options = [];\n const {\n data\n } = response;\n\n if (!data) {\n return false;\n }\n\n options.push({\n text: 'All devices',\n value: ''\n });\n\n for (const device of data.devices) {\n if (device.active === true) {\n options.push({\n text: device.nickname,\n value: device.iden\n });\n }\n }\n\n this.pushbulletDeviceOptions = options;\n this.pushbulletTestInfo = 'Device list updated. Please choose a device to push to.';\n },\n\n async testPushbulletApi() {\n const {\n api: pushbulletApiKey\n } = this.notifiers.pushbullet;\n\n if (!pushbulletApiKey) {\n this.pushbulletTestInfo = 'You didn\\'t supply a Pushbullet api key';\n $('#pushbullet_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testPushbullet', {\n params: {\n api: pushbulletApiKey\n }\n });\n const {\n data\n } = response;\n\n if (data) {\n this.pushbulletTestInfo = data;\n }\n },\n\n async testJoinApi() {\n const {\n api: joinApiKey\n } = this.notifiers.join;\n\n if (!joinApiKey) {\n this.joinTestInfo = 'You didn\\'t supply a Join api key';\n $('#join_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testJoin', {\n params: {\n api: joinApiKey\n }\n });\n const {\n data\n } = response;\n\n if (data) {\n this.joinTestInfo = data;\n }\n },\n\n async twitterStep1() {\n this.twitterTestInfo = MEDUSA.config.loading;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/twitterStep1');\n const {\n data\n } = response;\n window.open(data);\n this.twitterTestInfo = 'Step1: Confirm Authorization';\n },\n\n async twitterStep2() {\n const twitter = {};\n const {\n twitterKey\n } = this;\n twitter.key = twitterKey;\n\n if (twitter.key) {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/twitterStep2', {\n params: {\n key: twitter.key\n }\n });\n const {\n data\n } = response;\n this.twitterTestInfo = data;\n } else {\n this.twitterTestInfo = 'Please fill out the necessary fields above.';\n }\n },\n\n async twitterTest() {\n try {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testTwitter');\n const {\n data\n } = response;\n this.twitterTestInfo = data;\n } catch (error) {\n this.twitterTestInfo = 'Error while trying to request for a test on the twitter api.';\n }\n },\n\n async save() {\n const {\n notifiers,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true;\n const section = 'main';\n\n try {\n await setConfig({\n section,\n config: {\n notifiers\n }\n });\n this.$snotify.success('Saved Notifiers config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save notifiers config', 'Error');\n } finally {\n this.saving = false;\n }\n },\n\n testGrowl() {\n const growl = {};\n growl.host = $.trim($('#growl_host').val());\n growl.password = $.trim($('#growl_password').val());\n\n if (!growl.host) {\n $('#testGrowl-result').html('Please fill out the necessary fields above.');\n $('#growl_host').addClass('warning');\n return;\n }\n\n $('#growl_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testGrowl-result').html(MEDUSA.config.loading);\n $.get('home/testGrowl', {\n host: growl.host,\n password: growl.password\n }).done(data => {\n $('#testGrowl-result').html(data);\n $('#testGrowl').prop('disabled', false);\n });\n },\n\n testProwl() {\n const prowl = {};\n prowl.api = $.trim($('#prowl_api').find('input').val());\n prowl.priority = $('#prowl_priority').find('input').val();\n\n if (!prowl.api) {\n $('#testProwl-result').html('Please fill out the necessary fields above.');\n $('#prowl_api').find('input').addClass('warning');\n return;\n }\n\n $('#prowl_api').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testProwl-result').html(MEDUSA.config.loading);\n $.get('home/testProwl', {\n prowl_api: prowl.api,\n // eslint-disable-line camelcase\n prowl_priority: prowl.priority // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testProwl-result').html(data);\n $('#testProwl').prop('disabled', false);\n });\n },\n\n testKODI() {\n const kodi = {};\n const kodiHostInput = $('#kodi_host').find('input');\n const kodiHosts = kodiHostInput.toArray().map(value => value.value).filter(item => item !== '');\n kodi.host = kodiHosts.join(',');\n kodi.username = $.trim($('#kodi_username').val());\n kodi.password = $.trim($('#kodi_password').val());\n\n if (!kodi.host) {\n $('#testKODI-result').html('Please fill out the necessary fields above.');\n $('#kodi_host').find('input').addClass('warning');\n return;\n }\n\n $('#kodi_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testKODI-result').html(MEDUSA.config.loading);\n $.get('home/testKODI', {\n host: kodi.host,\n username: kodi.username,\n password: kodi.password\n }).done(data => {\n $('#testKODI-result').html(data);\n $('#testKODI').prop('disabled', false);\n });\n },\n\n testPHT() {\n const plex = {};\n plex.client = {};\n const plexHostsInput = $('#plex_client_host').find('input');\n const plexHosts = plexHostsInput.toArray().map(value => value.value).filter(item => item !== '');\n plex.client.host = plexHosts.join(',');\n plex.client.username = $.trim($('#plex_client_username').val());\n plex.client.password = $.trim($('#plex_client_password').val());\n\n if (!plex.client.host) {\n $('#testPHT-result').html('Please fill out the necessary fields above.');\n $('#plex_client_host').find('input').addClass('warning');\n return;\n }\n\n $('#plex_client_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPHT-result').html(MEDUSA.config.loading);\n $.get('home/testPHT', {\n host: plex.client.host,\n username: plex.client.username,\n password: plex.client.password\n }).done(data => {\n $('#testPHT-result').html(data);\n $('#testPHT').prop('disabled', false);\n });\n },\n\n testPMS() {\n const plex = {};\n plex.server = {};\n const plexHostsInput = $('#plex_server_host').find('input');\n const plexHosts = plexHostsInput.toArray().map(value => value.value).filter(item => item !== '');\n plex.server.host = plexHosts.join(',');\n plex.server.username = $.trim($('#plex_server_username').val());\n plex.server.password = $.trim($('#plex_server_password').val());\n plex.server.token = $.trim($('#plex_server_token').val());\n\n if (!plex.server.host) {\n $('#testPMS-result').html('Please fill out the necessary fields above.');\n $('#plex_server_host').find('input').addClass('warning');\n return;\n }\n\n $('#plex_server_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPMS-result').html(MEDUSA.config.loading);\n $.get('home/testPMS', {\n host: plex.server.host,\n username: plex.server.username,\n password: plex.server.password,\n plex_server_token: plex.server.token // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testPMS-result').html(data);\n $('#testPMS').prop('disabled', false);\n });\n },\n\n testEMBY() {\n const emby = {};\n emby.host = $('#emby_host').val();\n emby.apikey = $('#emby_apikey').val();\n\n if (!emby.host || !emby.apikey) {\n $('#testEMBY-result').html('Please fill out the necessary fields above.');\n $('#emby_host').addRemoveWarningClass(emby.host);\n $('#emby_apikey').addRemoveWarningClass(emby.apikey);\n return;\n }\n\n $('#emby_host,#emby_apikey').children('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testEMBY-result').html(MEDUSA.config.loading);\n $.get('home/testEMBY', {\n host: emby.host,\n emby_apikey: emby.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testEMBY-result').html(data);\n $('#testEMBY').prop('disabled', false);\n });\n },\n\n testBoxcar2() {\n const boxcar2 = {};\n boxcar2.accesstoken = $.trim($('#boxcar2_accesstoken').val());\n\n if (!boxcar2.accesstoken) {\n $('#testBoxcar2-result').html('Please fill out the necessary fields above.');\n $('#boxcar2_accesstoken').addClass('warning');\n return;\n }\n\n $('#boxcar2_accesstoken').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testBoxcar2-result').html(MEDUSA.config.loading);\n $.get('home/testBoxcar2', {\n accesstoken: boxcar2.accesstoken\n }).done(data => {\n $('#testBoxcar2-result').html(data);\n $('#testBoxcar2').prop('disabled', false);\n });\n },\n\n testPushover() {\n const pushover = {};\n pushover.userkey = $('#pushover_userkey').val();\n pushover.apikey = $('#pushover_apikey').val();\n\n if (!pushover.userkey || !pushover.apikey) {\n $('#testPushover-result').html('Please fill out the necessary fields above.');\n $('#pushover_userkey').addRemoveWarningClass(pushover.userkey);\n $('#pushover_apikey').addRemoveWarningClass(pushover.apikey);\n return;\n }\n\n $('#pushover_userkey,#pushover_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPushover-result').html(MEDUSA.config.loading);\n $.get('home/testPushover', {\n userKey: pushover.userkey,\n apiKey: pushover.apikey\n }).done(data => {\n $('#testPushover-result').html(data);\n $('#testPushover').prop('disabled', false);\n });\n },\n\n testLibnotify() {\n $('#testLibnotify-result').html(MEDUSA.config.loading);\n $.get('home/testLibnotify', data => {\n $('#testLibnotify-result').html(data);\n });\n },\n\n settingsNMJ() {\n const nmj = {};\n nmj.host = $('#nmj_host').val();\n\n if (nmj.host) {\n $('#testNMJ-result').html(MEDUSA.config.loading);\n $.get('home/settingsNMJ', {\n host: nmj.host\n }, data => {\n if (data === null) {\n $('#nmj_database').removeAttr('readonly');\n $('#nmj_mount').removeAttr('readonly');\n }\n\n const JSONData = $.parseJSON(data);\n $('#testNMJ-result').html(JSONData.message);\n $('#nmj_database').val(JSONData.database);\n $('#nmj_mount').val(JSONData.mount);\n\n if (JSONData.database) {\n $('#nmj_database').prop('readonly', true);\n } else {\n $('#nmj_database').removeAttr('readonly');\n }\n\n if (JSONData.mount) {\n $('#nmj_mount').prop('readonly', true);\n } else {\n $('#nmj_mount').removeAttr('readonly');\n }\n });\n } else {\n alert('Please fill in the Popcorn IP address'); // eslint-disable-line no-alert\n\n $('#nmj_host').focus();\n }\n },\n\n testNMJ() {\n const nmj = {};\n nmj.host = $.trim($('#nmj_host').val());\n nmj.database = $('#nmj_database').val();\n nmj.mount = $('#nmj_mount').val();\n\n if (nmj.host) {\n $('#nmj_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testNMJ-result').html(MEDUSA.config.loading);\n $.get('home/testNMJ', {\n host: nmj.host,\n database: nmj.database,\n mount: nmj.mount\n }).done(data => {\n $('#testNMJ-result').html(data);\n $('#testNMJ').prop('disabled', false);\n });\n } else {\n $('#testNMJ-result').html('Please fill out the necessary fields above.');\n $('#nmj_host').addClass('warning');\n }\n },\n\n settingsNMJv2() {\n const nmjv2 = {};\n nmjv2.host = $('#nmjv2_host').val();\n\n if (nmjv2.host) {\n $('#testNMJv2-result').html(MEDUSA.config.loading);\n nmjv2.dbloc = '';\n const radios = document.getElementsByName('nmjv2_dbloc');\n\n for (let i = 0, len = radios.length; i < len; i++) {\n if (radios[i].checked) {\n nmjv2.dbloc = radios[i].value;\n break;\n }\n }\n\n nmjv2.dbinstance = $('#NMJv2db_instance').val();\n $.get('home/settingsNMJv2', {\n host: nmjv2.host,\n dbloc: nmjv2.dbloc,\n instance: nmjv2.dbinstance\n }, data => {\n if (data === null) {\n $('#nmjv2_database').removeAttr('readonly');\n }\n\n const JSONData = $.parseJSON(data);\n $('#testNMJv2-result').html(JSONData.message);\n $('#nmjv2_database').val(JSONData.database);\n\n if (JSONData.database) {\n $('#nmjv2_database').prop('readonly', true);\n } else {\n $('#nmjv2_database').removeAttr('readonly');\n }\n });\n } else {\n alert('Please fill in the Popcorn IP address'); // eslint-disable-line no-alert\n\n $('#nmjv2_host').focus();\n }\n },\n\n testNMJv2() {\n const nmjv2 = {};\n nmjv2.host = $.trim($('#nmjv2_host').val());\n\n if (nmjv2.host) {\n $('#nmjv2_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testNMJv2-result').html(MEDUSA.config.loading);\n $.get('home/testNMJv2', {\n host: nmjv2.host\n }).done(data => {\n $('#testNMJv2-result').html(data);\n $('#testNMJv2').prop('disabled', false);\n });\n } else {\n $('#testNMJv2-result').html('Please fill out the necessary fields above.');\n $('#nmjv2_host').addClass('warning');\n }\n },\n\n testFreeMobile() {\n const freemobile = {};\n freemobile.id = $.trim($('#freemobile_id').val());\n freemobile.apikey = $.trim($('#freemobile_apikey').val());\n\n if (!freemobile.id || !freemobile.apikey) {\n $('#testFreeMobile-result').html('Please fill out the necessary fields above.');\n\n if (freemobile.id) {\n $('#freemobile_id').removeClass('warning');\n } else {\n $('#freemobile_id').addClass('warning');\n }\n\n if (freemobile.apikey) {\n $('#freemobile_apikey').removeClass('warning');\n } else {\n $('#freemobile_apikey').addClass('warning');\n }\n\n return;\n }\n\n $('#freemobile_id,#freemobile_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testFreeMobile-result').html(MEDUSA.config.loading);\n $.get('home/testFreeMobile', {\n freemobile_id: freemobile.id,\n // eslint-disable-line camelcase\n freemobile_apikey: freemobile.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testFreeMobile-result').html(data);\n $('#testFreeMobile').prop('disabled', false);\n });\n },\n\n testTelegram() {\n const telegram = {};\n telegram.id = $.trim($('#telegram_id').val());\n telegram.apikey = $.trim($('#telegram_apikey').val());\n\n if (!telegram.id || !telegram.apikey) {\n $('#testTelegram-result').html('Please fill out the necessary fields above.');\n $('#telegram_id').addRemoveWarningClass(telegram.id);\n $('#telegram_apikey').addRemoveWarningClass(telegram.apikey);\n return;\n }\n\n $('#telegram_id,#telegram_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testTelegram-result').html(MEDUSA.config.loading);\n $.get('home/testTelegram', {\n telegram_id: telegram.id,\n // eslint-disable-line camelcase\n telegram_apikey: telegram.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTelegram-result').html(data);\n $('#testTelegram').prop('disabled', false);\n });\n },\n\n testDiscord() {\n const {\n notifiers\n } = this;\n\n if (!notifiers.discord.webhook) {\n $('#testDiscord-result').html('Please fill out the necessary fields above.');\n $('#discord_webhook').addRemoveWarningClass(notifiers.discord.webhook);\n return;\n }\n\n $('#discord_id,#discord_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testDiscord-result').html(MEDUSA.config.loading);\n $.get('home/testDiscord', {\n discord_webhook: notifiers.discord.webhook,\n // eslint-disable-line camelcase\n discord_tts: notifiers.discord.tts // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testDiscord-result').html(data);\n $('#testDiscord').prop('disabled', false);\n });\n },\n\n testSlack() {\n const slack = {};\n slack.webhook = $.trim($('#slack_webhook').val());\n\n if (!slack.webhook) {\n $('#testSlack-result').html('Please fill out the necessary fields above.');\n $('#slack_webhook').addRemoveWarningClass(slack.webhook);\n return;\n }\n\n $('#slack_webhook').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testSlack-result').html(MEDUSA.config.loading);\n $.get('home/testslack', {\n slack_webhook: slack.webhook // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testSlack-result').html(data);\n $('#testSlack').prop('disabled', false);\n });\n },\n\n TraktGetPin() {\n window.open($('#trakt_pin_url').val(), 'popUp', 'toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550');\n $('#trakt_pin').prop('disabled', false);\n },\n\n authTrakt() {\n const trakt = {};\n trakt.pin = $('#trakt_pin').val();\n\n if (trakt.pin.length !== 0) {\n $.get('home/getTraktToken', {\n trakt_pin: trakt.pin // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTrakt-result').html(data);\n $('#authTrakt').addClass('hide');\n $('#trakt_pin').prop('disabled', true);\n $('#trakt_pin').val('');\n $('#TraktGetPin').removeClass('hide');\n });\n }\n },\n\n testTrakt() {\n const trakt = {};\n trakt.username = $.trim($('#trakt_username').val());\n trakt.trendingBlacklist = $.trim($('#trakt_blacklist_name').val());\n\n if (!trakt.username) {\n $('#testTrakt-result').html('Please fill out the necessary fields above.');\n $('#trakt_username').addRemoveWarningClass(trakt.username);\n return;\n }\n\n if (/\\s/g.test(trakt.trendingBlacklist)) {\n $('#testTrakt-result').html('Check blacklist name; the value needs to be a trakt slug');\n $('#trakt_blacklist_name').addClass('warning');\n return;\n }\n\n $('#trakt_username').removeClass('warning');\n $('#trakt_blacklist_name').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testTrakt-result').html(MEDUSA.config.loading);\n $.get('home/testTrakt', {\n username: trakt.username,\n blacklist_name: trakt.trendingBlacklist // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTrakt-result').html(data);\n $('#testTrakt').prop('disabled', false);\n });\n },\n\n traktForceSync() {\n $('#testTrakt-result').html(MEDUSA.config.loading);\n $.getJSON('home/forceTraktSync', data => {\n $('#testTrakt-result').html(data.result);\n });\n },\n\n testEmail() {\n let to = '';\n const status = $('#testEmail-result');\n status.html(MEDUSA.config.loading);\n let host = $('#email_host').val();\n host = host.length > 0 ? host : null;\n let port = $('#email_port').val();\n port = port.length > 0 ? port : null;\n const tls = $('#email_tls').find('input').is(':checked') ? 1 : 0;\n let from = $('#email_from').val();\n from = from.length > 0 ? from : 'root@localhost';\n const user = $('#email_username').val().trim();\n const pwd = $('#email_password').val();\n let err = '';\n\n if (host === null) {\n err += '- ' + err + '
You must provide a recipient email address!
');\n } else {\n $.get('home/testEmail', {\n host,\n port,\n smtp_from: from,\n // eslint-disable-line camelcase\n use_tls: tls,\n // eslint-disable-line camelcase\n user,\n pwd,\n to\n }, msg => {\n $('#testEmail-result').html(msg);\n });\n }\n }\n },\n\n testPushalot() {\n const pushalot = {};\n pushalot.authToken = $.trim($('#pushalot_authorizationtoken').val());\n\n if (!pushalot.authToken) {\n $('#testPushalot-result').html('Please fill out the necessary fields above.');\n $('#pushalot_authorizationtoken').addClass('warning');\n return;\n }\n\n $('#pushalot_authorizationtoken').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPushalot-result').html(MEDUSA.config.loading);\n $.get('home/testPushalot', {\n authorizationToken: pushalot.authToken\n }).done(data => {\n $('#testPushalot-result').html(data);\n $('#testPushalot').prop('disabled', false);\n });\n }\n\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/config-notifications.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -116,7 +116,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-js-toggle-button */ \"./node_modules/vue-js-toggle-button/dist/index.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config-post-processing',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n FileBrowser: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"FileBrowser\"],\n NamePattern: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"NamePattern\"],\n SelectList: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"SelectList\"],\n ToggleButton: vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_1__[\"ToggleButton\"]\n },\n\n data() {\n return {\n presets: [{\n pattern: '%SN - %Sx%0E - %EN',\n example: 'Show Name - 2x03 - Ep Name'\n }, {\n pattern: '%S.N.S%0SE%0E.%E.N',\n example: 'Show.Name.S02E03.Ep.Name'\n }, {\n pattern: '%Sx%0E - %EN',\n example: '2x03 - Ep Name'\n }, {\n pattern: 'S%0SE%0E - %EN',\n example: 'S02E03 - Ep Name'\n }, {\n pattern: 'Season %0S/%S.N.S%0SE%0E.%Q.N-%RG',\n example: 'Season 02/Show.Name.S02E03.720p.HDTV-RLSGROUP'\n }],\n processMethods: [{\n value: 'copy',\n text: 'Copy'\n }, {\n value: 'move',\n text: 'Move'\n }, {\n value: 'hardlink',\n text: 'Hard Link'\n }, {\n value: 'symlink',\n text: 'Symbolic Link'\n }, {\n value: 'keeplink',\n text: 'Keep Link'\n }],\n timezoneOptions: [{\n value: 'local',\n text: 'Local'\n }, {\n value: 'network',\n text: 'Network'\n }],\n metadataProviderSelected: null\n };\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])(['setConfig']),\n\n onChangeSyncFiles(items) {\n const {\n postprocessing\n } = this;\n postprocessing.syncFiles = items.map(item => item.value);\n },\n\n onChangeAllowedExtensions(items) {\n const {\n postprocessing\n } = this;\n postprocessing.allowedExtensions = items.map(item => item.value);\n },\n\n onChangeExtraScripts(items) {\n const {\n postprocessing\n } = this;\n postprocessing.extraScripts = items.map(item => item.value);\n },\n\n saveNaming(values) {\n const {\n postprocessing\n } = this;\n\n if (!this.configLoaded) {\n return;\n }\n\n postprocessing.naming.pattern = values.pattern;\n postprocessing.naming.multiEp = values.multiEpStyle;\n },\n\n saveNamingSports(values) {\n const {\n postprocessing\n } = this;\n\n if (!this.configLoaded) {\n return;\n }\n\n postprocessing.naming.patternSports = values.pattern;\n postprocessing.naming.enableCustomNamingSports = values.enabled;\n },\n\n saveNamingAbd(values) {\n const {\n postprocessing\n } = this;\n\n if (!this.configLoaded) {\n return;\n }\n\n postprocessing.naming.patternAirByDate = values.pattern;\n postprocessing.naming.enableCustomNamingAirByDate = values.enabled;\n },\n\n saveNamingAnime(values) {\n const {\n postprocessing\n } = this;\n\n if (!this.configLoaded) {\n return;\n }\n\n postprocessing.naming.patternAnime = values.pattern;\n postprocessing.naming.animeMultiEp = values.multiEpStyle;\n postprocessing.naming.animeNamingType = values.animeNamingType;\n postprocessing.naming.enableCustomNamingAnime = values.enabled;\n },\n\n async save() {\n const {\n postprocessing,\n metadata,\n setConfig\n } = this; // We want to wait until the page has been fully loaded, before starting to save stuff.\n\n if (!this.configLoaded) {\n return;\n } // Disable the save button until we're done.\n\n\n this.saving = true; // Clone the config into a new object\n\n const config = Object.assign({}, {\n postProcessing: postprocessing,\n metadata\n }); // Use destructuring to remove the unwanted keys.\n\n const {\n multiEpStrings,\n reflinkAvailable,\n extraScriptsUrl,\n ...rest\n } = postprocessing; // Assign the object with the keys removed to our copied object.\n\n config.postProcessing = rest;\n const section = 'main';\n\n try {\n await setConfig({\n section,\n config\n });\n this.$snotify.success('Saved Post-Processing config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save Post-Processing config', 'Error');\n } finally {\n this.saving = false;\n }\n },\n\n /**\n * Get the first enabled metadata provider based on enabled features.\n * @param {Object} providers - The metadata providers object.\n * @return {String} - The id of the first enabled provider.\n */\n getFirstEnabledMetadataProvider() {\n const {\n metadata\n } = this;\n const firstEnabledProvider = Object.values(metadata.metadataProviders).find(provider => {\n return provider.showMetadata || provider.episodeMetadata;\n });\n return firstEnabledProvider === undefined ? 'kodi' : firstEnabledProvider.id;\n }\n\n },\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])(['config', 'metadata', 'postprocessing', 'system']),\n\n configLoaded() {\n const {\n postprocessing\n } = this;\n return postprocessing.processAutomatically !== null;\n },\n\n multiEpStringsSelect() {\n const {\n postprocessing\n } = this;\n\n if (!postprocessing.multiEpStrings) {\n return [];\n }\n\n return Object.keys(postprocessing.multiEpStrings).map(k => ({\n value: Number(k),\n text: postprocessing.multiEpStrings[k]\n }));\n }\n\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n watch: {\n 'metadata.metadataProviders': function (providers) {\n // eslint-disable-line object-shorthand\n const {\n getFirstEnabledMetadataProvider\n } = this;\n\n if (Object.keys(providers).length > 0) {\n this.metadataProviderSelected = getFirstEnabledMetadataProvider();\n }\n }\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/config-post-processing.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-js-toggle-button */ \"./node_modules/vue-js-toggle-button/dist/index.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config-post-processing',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n FileBrowser: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"FileBrowser\"],\n NamePattern: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"NamePattern\"],\n SelectList: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"SelectList\"],\n ToggleButton: vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_1__[\"ToggleButton\"]\n },\n\n data() {\n return {\n presets: [{\n pattern: '%SN - %Sx%0E - %EN',\n example: 'Show Name - 2x03 - Ep Name'\n }, {\n pattern: '%S.N.S%0SE%0E.%E.N',\n example: 'Show.Name.S02E03.Ep.Name'\n }, {\n pattern: '%Sx%0E - %EN',\n example: '2x03 - Ep Name'\n }, {\n pattern: 'S%0SE%0E - %EN',\n example: 'S02E03 - Ep Name'\n }, {\n pattern: 'Season %0S/%S.N.S%0SE%0E.%Q.N-%RG',\n example: 'Season 02/Show.Name.S02E03.720p.HDTV-RLSGROUP'\n }],\n processMethods: [{\n value: 'copy',\n text: 'Copy'\n }, {\n value: 'move',\n text: 'Move'\n }, {\n value: 'hardlink',\n text: 'Hard Link'\n }, {\n value: 'symlink',\n text: 'Symbolic Link'\n }, {\n value: 'keeplink',\n text: 'Keep Link'\n }],\n timezoneOptions: [{\n value: 'local',\n text: 'Local'\n }, {\n value: 'network',\n text: 'Network'\n }],\n metadataProviderSelected: null\n };\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])(['setConfig']),\n\n onChangeSyncFiles(items) {\n const {\n postprocessing\n } = this;\n postprocessing.syncFiles = items.map(item => item.value);\n },\n\n onChangeAllowedExtensions(items) {\n const {\n postprocessing\n } = this;\n postprocessing.allowedExtensions = items.map(item => item.value);\n },\n\n onChangeExtraScripts(items) {\n const {\n postprocessing\n } = this;\n postprocessing.extraScripts = items.map(item => item.value);\n },\n\n saveNaming(values) {\n const {\n postprocessing\n } = this;\n\n if (!this.configLoaded) {\n return;\n }\n\n postprocessing.naming.pattern = values.pattern;\n postprocessing.naming.multiEp = values.multiEpStyle;\n },\n\n saveNamingSports(values) {\n const {\n postprocessing\n } = this;\n\n if (!this.configLoaded) {\n return;\n }\n\n postprocessing.naming.patternSports = values.pattern;\n postprocessing.naming.enableCustomNamingSports = values.enabled;\n },\n\n saveNamingAbd(values) {\n const {\n postprocessing\n } = this;\n\n if (!this.configLoaded) {\n return;\n }\n\n postprocessing.naming.patternAirByDate = values.pattern;\n postprocessing.naming.enableCustomNamingAirByDate = values.enabled;\n },\n\n saveNamingAnime(values) {\n const {\n postprocessing\n } = this;\n\n if (!this.configLoaded) {\n return;\n }\n\n postprocessing.naming.patternAnime = values.pattern;\n postprocessing.naming.animeMultiEp = values.multiEpStyle;\n postprocessing.naming.animeNamingType = values.animeNamingType;\n postprocessing.naming.enableCustomNamingAnime = values.enabled;\n },\n\n async save() {\n const {\n postprocessing,\n metadata,\n setConfig\n } = this; // We want to wait until the page has been fully loaded, before starting to save stuff.\n\n if (!this.configLoaded) {\n return;\n } // Disable the save button until we're done.\n\n\n this.saving = true; // Clone the config into a new object\n\n const config = Object.assign({}, {\n postProcessing: postprocessing,\n metadata\n }); // Use destructuring to remove the unwanted keys.\n\n const {\n multiEpStrings,\n reflinkAvailable,\n extraScriptsUrl,\n ...rest\n } = postprocessing; // Assign the object with the keys removed to our copied object.\n\n config.postProcessing = rest;\n const section = 'main';\n\n try {\n await setConfig({\n section,\n config\n });\n this.$snotify.success('Saved Post-Processing config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save Post-Processing config', 'Error');\n } finally {\n this.saving = false;\n }\n },\n\n /**\n * Get the first enabled metadata provider based on enabled features.\n * @param {Object} providers - The metadata providers object.\n * @return {String} - The id of the first enabled provider.\n */\n getFirstEnabledMetadataProvider() {\n const {\n metadata\n } = this;\n const firstEnabledProvider = Object.values(metadata.metadataProviders).find(provider => {\n return provider.showMetadata || provider.episodeMetadata;\n });\n return firstEnabledProvider === undefined ? 'kodi' : firstEnabledProvider.id;\n }\n\n },\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config.general,\n metadata: state => state.config.metadata,\n postprocessing: state => state.config.postprocessing,\n system: state => state.config.system\n }),\n\n configLoaded() {\n const {\n postprocessing\n } = this;\n return postprocessing.processAutomatically !== null;\n },\n\n multiEpStringsSelect() {\n const {\n postprocessing\n } = this;\n\n if (!postprocessing.multiEpStrings) {\n return [];\n }\n\n return Object.keys(postprocessing.multiEpStrings).map(k => ({\n value: Number(k),\n text: postprocessing.multiEpStrings[k]\n }));\n }\n\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n watch: {\n 'metadata.metadataProviders': function (providers) {\n // eslint-disable-line object-shorthand\n const {\n getFirstEnabledMetadataProvider\n } = this;\n\n if (Object.keys(providers).length > 0) {\n this.metadataProviderSelected = getFirstEnabledMetadataProvider();\n }\n }\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/config-post-processing.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -128,7 +128,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api.js */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config-search',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTemplate\"],\n ConfigTextbox: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextbox\"],\n ConfigTextboxNumber: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextboxNumber\"],\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigToggleSlider\"],\n FileBrowser: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"FileBrowser\"],\n SelectList: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"SelectList\"]\n },\n\n data() {\n return {\n configLoaded: false,\n checkPropersIntervalLabels: [{\n text: '24 hours',\n value: 'daily'\n }, {\n text: '4 hours',\n value: '4h'\n }, {\n text: '90 mins',\n value: '90m'\n }, {\n text: '45 mins',\n value: '45m'\n }, {\n text: '30 mins',\n value: '30m'\n }, {\n text: '15 mins',\n value: '15m'\n }],\n nzbGetPriorityOptions: [{\n text: 'Very low',\n value: -100\n }, {\n text: 'Low',\n value: -50\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 50\n }, {\n text: 'Very high',\n value: 100\n }, {\n text: 'Force',\n value: 900\n }],\n // Static clients config\n clientsConfig: {\n torrent: {\n blackhole: {\n title: 'Black hole'\n },\n utorrent: {\n title: 'uTorrent',\n description: 'URL to your uTorrent client (e.g. http://localhost:8000)',\n labelOption: true,\n labelAnimeOption: true,\n seedTimeOption: true,\n pausedOption: true,\n testStatus: 'Click below to test'\n },\n transmission: {\n title: 'Transmission',\n description: 'URL to your Transmission client (e.g. http://localhost:9091)',\n pathOption: true,\n removeFromClientOption: true,\n seedLocationOption: true,\n seedTimeOption: true,\n pausedOption: true,\n testStatus: 'Click below to test'\n },\n deluge: {\n title: 'Deluge (via WebUI)',\n shortTitle: 'Deluge',\n description: 'URL to your Deluge client (e.g. http://localhost:8112)',\n pathOption: true,\n removeFromClientOption: true,\n labelOption: true,\n labelAnimeOption: true,\n seedLocationOption: true,\n pausedOption: true,\n verifySSLOption: true,\n testStatus: 'Click below to test'\n },\n deluged: {\n title: 'Deluge (via Daemon)',\n shortTitle: 'Deluge',\n description: 'IP or Hostname of your Deluge Daemon (e.g. scgi://localhost:58846)',\n pathOption: true,\n removeFromClientOption: true,\n labelOption: true,\n labelAnimeOption: true,\n seedLocationOption: true,\n pausedOption: true,\n verifySSLOption: true,\n testStatus: 'Click below to test'\n },\n downloadstation: {\n title: 'Synology DS',\n description: 'URL to your Synology DS client (e.g. http://localhost:5000)',\n pathOption: true,\n testStatus: 'Click below to test'\n },\n rtorrent: {\n title: 'rTorrent',\n description: 'URL to your rTorrent client (e.g. scgi://localhost:5000or https://localhost/rutorrent/plugins/httprpc/action.php)',\n pathOption: true,\n labelOption: true,\n labelAnimeOption: true,\n verifySSLOption: true,\n testStatus: 'Click below to test'\n },\n qbittorrent: {\n title: 'qBittorrent',\n description: 'URL to your qBittorrent client (e.g. http://localhost:8080)',\n labelOption: true,\n labelAnimeOption: true,\n pausedOption: true,\n verifySSLOption: true,\n testStatus: 'Click below to test'\n },\n mlnet: {\n title: 'MLDonkey',\n description: 'URL to your MLDonkey (e.g. http://localhost:4080)',\n verifySSLOption: true,\n testStatus: 'Click below to test'\n }\n },\n nzb: {\n blackhole: {\n title: 'Black hole'\n },\n nzbget: {\n title: 'NZBget',\n description: 'NZBget RPC host name and port number (not NZBgetweb!) (e.g. localhost:6789)',\n testStatus: 'Click below to test'\n },\n sabnzbd: {\n title: 'SABnzbd',\n description: 'URL to your SABnzbd server (e.g. http://localhost:8080/)',\n testStatus: 'Click below to test'\n }\n }\n },\n httpAuthTypes: {\n none: 'None',\n basic: 'Basic',\n digest: 'Digest'\n }\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])(['clients', 'search', 'system']),\n\n torrentUsernameIsDisabled() {\n const {\n clients\n } = this;\n const {\n torrents\n } = clients;\n const {\n host,\n method\n } = torrents;\n const torrentHost = host || '';\n\n if (!['rtorrent', 'deluge'].includes(method) || method === 'rtorrent' && !torrentHost.startsWith('scgi://')) {\n return false;\n }\n\n return true;\n },\n\n torrentPasswordIsDisabled() {\n const {\n clients\n } = this;\n const {\n torrents\n } = clients;\n const {\n host,\n method\n } = torrents;\n const torrentHost = host || '';\n\n if (method !== 'rtorrent' || method === 'rtorrent' && !torrentHost.startsWith('scgi://')) {\n return false;\n }\n\n return true;\n },\n\n authTypeIsDisabled() {\n const {\n clients\n } = this;\n const {\n torrents\n } = clients;\n const {\n host,\n method\n } = torrents;\n const torrentHost = host || '';\n\n if (method === 'rtorrent' && !torrentHost.startsWith('scgi://')) {\n return false;\n }\n\n return true;\n }\n\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])(['setConfig']),\n\n async testTorrentClient() {\n const {\n clients\n } = this;\n const {\n torrents\n } = clients;\n const {\n method,\n host,\n username,\n password\n } = torrents;\n this.clientsConfig.torrent[method].testStatus = MEDUSA.config.loading;\n const params = {\n torrent_method: method,\n // eslint-disable-line camelcase\n host,\n username,\n password\n };\n const resp = await _api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"].get('home/testTorrent', {\n params\n });\n this.clientsConfig.torrent[method].testStatus = resp.data;\n },\n\n async testNzbget() {\n const {\n clients\n } = this;\n const {\n nzb\n } = clients;\n const {\n nzbget\n } = nzb;\n const {\n host,\n username,\n password,\n useHttps\n } = nzbget;\n this.clientsConfig.nzb.nzbget.testStatus = MEDUSA.config.loading;\n const params = {\n host,\n username,\n password,\n use_https: useHttps // eslint-disable-line camelcase\n\n };\n const resp = await _api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"].get('home/testNZBget', {\n params\n });\n this.clientsConfig.nzb.nzbget.testStatus = resp.data;\n },\n\n async testSabnzbd() {\n const {\n clients\n } = this;\n const {\n nzb\n } = clients;\n const {\n sabnzbd\n } = nzb;\n const {\n host,\n username,\n password,\n apiKey\n } = sabnzbd;\n this.clientsConfig.nzb.sabnzbd.testStatus = MEDUSA.config.loading;\n const params = {\n host,\n username,\n password,\n apikey: apiKey\n };\n const resp = await _api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"].get('home/testSABnzbd', {\n params\n });\n this.clientsConfig.nzb.sabnzbd.testStatus = resp.data;\n },\n\n async save() {\n const {\n clients,\n search,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true; // Clone the config into a new object\n\n const config = Object.assign({}, {\n search\n }, {\n clients\n });\n const section = 'main';\n\n try {\n await setConfig({\n section,\n config\n });\n this.$snotify.success('Saved Search config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save search config', 'Error');\n } finally {\n this.saving = false;\n }\n }\n\n },\n watch: {\n 'clients.torrents.host'(host) {\n const {\n clients\n } = this;\n const {\n torrents\n } = clients;\n const {\n method\n } = torrents;\n\n if (method === 'rtorrent') {\n if (!host) {\n return;\n }\n\n const isMatch = host.startsWith('scgi://');\n\n if (isMatch) {\n this.clients.torrents.username = '';\n this.clients.torrents.password = '';\n this.clients.torrents.authType = 'none';\n }\n }\n\n if (method === 'deluge') {\n this.clients.torrents.username = '';\n }\n },\n\n 'clients.torrents.method'(method) {\n if (!this.clientsConfig.torrent[method].removeFromClientOption) {\n this.search.general.removeFromClient = false;\n }\n }\n\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/config-search.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api.js */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config-search',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTemplate\"],\n ConfigTextbox: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextbox\"],\n ConfigTextboxNumber: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextboxNumber\"],\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigToggleSlider\"],\n FileBrowser: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"FileBrowser\"],\n SelectList: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"SelectList\"]\n },\n\n data() {\n return {\n configLoaded: false,\n checkPropersIntervalLabels: [{\n text: '24 hours',\n value: 'daily'\n }, {\n text: '4 hours',\n value: '4h'\n }, {\n text: '90 mins',\n value: '90m'\n }, {\n text: '45 mins',\n value: '45m'\n }, {\n text: '30 mins',\n value: '30m'\n }, {\n text: '15 mins',\n value: '15m'\n }],\n nzbGetPriorityOptions: [{\n text: 'Very low',\n value: -100\n }, {\n text: 'Low',\n value: -50\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 50\n }, {\n text: 'Very high',\n value: 100\n }, {\n text: 'Force',\n value: 900\n }],\n // Static clients config\n clientsConfig: {\n torrent: {\n blackhole: {\n title: 'Black hole'\n },\n utorrent: {\n title: 'uTorrent',\n description: 'URL to your uTorrent client (e.g. http://localhost:8000)',\n labelOption: true,\n labelAnimeOption: true,\n seedTimeOption: true,\n pausedOption: true,\n testStatus: 'Click below to test'\n },\n transmission: {\n title: 'Transmission',\n description: 'URL to your Transmission client (e.g. http://localhost:9091)',\n pathOption: true,\n removeFromClientOption: true,\n seedLocationOption: true,\n seedTimeOption: true,\n pausedOption: true,\n testStatus: 'Click below to test'\n },\n deluge: {\n title: 'Deluge (via WebUI)',\n shortTitle: 'Deluge',\n description: 'URL to your Deluge client (e.g. http://localhost:8112)',\n pathOption: true,\n removeFromClientOption: true,\n labelOption: true,\n labelAnimeOption: true,\n seedLocationOption: true,\n pausedOption: true,\n verifySSLOption: true,\n testStatus: 'Click below to test'\n },\n deluged: {\n title: 'Deluge (via Daemon)',\n shortTitle: 'Deluge',\n description: 'IP or Hostname of your Deluge Daemon (e.g. scgi://localhost:58846)',\n pathOption: true,\n removeFromClientOption: true,\n labelOption: true,\n labelAnimeOption: true,\n seedLocationOption: true,\n pausedOption: true,\n verifySSLOption: true,\n testStatus: 'Click below to test'\n },\n downloadstation: {\n title: 'Synology DS',\n description: 'URL to your Synology DS client (e.g. http://localhost:5000)',\n pathOption: true,\n testStatus: 'Click below to test'\n },\n rtorrent: {\n title: 'rTorrent',\n description: 'URL to your rTorrent client (e.g. scgi://localhost:5000
or https://localhost/rutorrent/plugins/httprpc/action.php)',\n pathOption: true,\n labelOption: true,\n labelAnimeOption: true,\n verifySSLOption: true,\n testStatus: 'Click below to test'\n },\n qbittorrent: {\n title: 'qBittorrent',\n description: 'URL to your qBittorrent client (e.g. http://localhost:8080)',\n labelOption: true,\n labelAnimeOption: true,\n pausedOption: true,\n verifySSLOption: true,\n testStatus: 'Click below to test'\n },\n mlnet: {\n title: 'MLDonkey',\n description: 'URL to your MLDonkey (e.g. http://localhost:4080)',\n verifySSLOption: true,\n testStatus: 'Click below to test'\n }\n },\n nzb: {\n blackhole: {\n title: 'Black hole'\n },\n nzbget: {\n title: 'NZBget',\n description: 'NZBget RPC host name and port number (not NZBgetweb!) (e.g. localhost:6789)',\n testStatus: 'Click below to test'\n },\n sabnzbd: {\n title: 'SABnzbd',\n description: 'URL to your SABnzbd server (e.g. http://localhost:8080/)',\n testStatus: 'Click below to test'\n }\n }\n },\n httpAuthTypes: {\n none: 'None',\n basic: 'Basic',\n digest: 'Digest'\n }\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n clients: state => state.config.clients,\n search: state => state.config.search,\n system: state => state.config.system\n }),\n\n torrentUsernameIsDisabled() {\n const {\n clients\n } = this;\n const {\n torrents\n } = clients;\n const {\n host,\n method\n } = torrents;\n const torrentHost = host || '';\n\n if (!['rtorrent', 'deluge'].includes(method) || method === 'rtorrent' && !torrentHost.startsWith('scgi://')) {\n return false;\n }\n\n return true;\n },\n\n torrentPasswordIsDisabled() {\n const {\n clients\n } = this;\n const {\n torrents\n } = clients;\n const {\n host,\n method\n } = torrents;\n const torrentHost = host || '';\n\n if (method !== 'rtorrent' || method === 'rtorrent' && !torrentHost.startsWith('scgi://')) {\n return false;\n }\n\n return true;\n },\n\n authTypeIsDisabled() {\n const {\n clients\n } = this;\n const {\n torrents\n } = clients;\n const {\n host,\n method\n } = torrents;\n const torrentHost = host || '';\n\n if (method === 'rtorrent' && !torrentHost.startsWith('scgi://')) {\n return false;\n }\n\n return true;\n }\n\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])(['setConfig']),\n\n async testTorrentClient() {\n const {\n clients\n } = this;\n const {\n torrents\n } = clients;\n const {\n method,\n host,\n username,\n password\n } = torrents;\n this.clientsConfig.torrent[method].testStatus = MEDUSA.config.loading;\n const params = {\n torrent_method: method,\n // eslint-disable-line camelcase\n host,\n username,\n password\n };\n const resp = await _api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"].get('home/testTorrent', {\n params\n });\n this.clientsConfig.torrent[method].testStatus = resp.data;\n },\n\n async testNzbget() {\n const {\n clients\n } = this;\n const {\n nzb\n } = clients;\n const {\n nzbget\n } = nzb;\n const {\n host,\n username,\n password,\n useHttps\n } = nzbget;\n this.clientsConfig.nzb.nzbget.testStatus = MEDUSA.config.loading;\n const params = {\n host,\n username,\n password,\n use_https: useHttps // eslint-disable-line camelcase\n\n };\n const resp = await _api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"].get('home/testNZBget', {\n params\n });\n this.clientsConfig.nzb.nzbget.testStatus = resp.data;\n },\n\n async testSabnzbd() {\n const {\n clients\n } = this;\n const {\n nzb\n } = clients;\n const {\n sabnzbd\n } = nzb;\n const {\n host,\n username,\n password,\n apiKey\n } = sabnzbd;\n this.clientsConfig.nzb.sabnzbd.testStatus = MEDUSA.config.loading;\n const params = {\n host,\n username,\n password,\n apikey: apiKey\n };\n const resp = await _api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"].get('home/testSABnzbd', {\n params\n });\n this.clientsConfig.nzb.sabnzbd.testStatus = resp.data;\n },\n\n async save() {\n const {\n clients,\n search,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true; // Clone the config into a new object\n\n const config = Object.assign({}, {\n search\n }, {\n clients\n });\n const section = 'main';\n\n try {\n await setConfig({\n section,\n config\n });\n this.$snotify.success('Saved Search config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save search config', 'Error');\n } finally {\n this.saving = false;\n }\n }\n\n },\n watch: {\n 'clients.torrents.host'(host) {\n const {\n clients\n } = this;\n const {\n torrents\n } = clients;\n const {\n method\n } = torrents;\n\n if (method === 'rtorrent') {\n if (!host) {\n return;\n }\n\n const isMatch = host.startsWith('scgi://');\n\n if (isMatch) {\n this.clients.torrents.username = '';\n this.clients.torrents.password = '';\n this.clients.torrents.authType = 'none';\n }\n }\n\n if (method === 'deluge') {\n this.clients.torrents.username = '';\n }\n },\n\n 'clients.torrents.method'(method) {\n if (!this.clientsConfig.torrent[method].removeFromClientOption) {\n this.search.general.removeFromClient = false;\n }\n }\n\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/config-search.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -140,7 +140,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__[\"AppLink\"]\n },\n computed: Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])(['config', 'system'])\n});\n\n//# sourceURL=webpack:///./src/components/config.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__[\"AppLink\"]\n },\n computed: Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config.general,\n system: state => state.config.system\n })\n});\n\n//# sourceURL=webpack:///./src/components/config.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -152,7 +152,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/debounce */ \"./node_modules/lodash/debounce.js\");\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./subtitle-search.vue */ \"./src/components/subtitle-search.vue\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_6__[\"VueGoodTable\"],\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n PlotInfo: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"PlotInfo\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_10__[\"default\"]\n },\n mixins: [Object(_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_4__[\"manageCookieMixin\"])('displayShow')],\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n props: {\n /**\n * Show indexer\n */\n showIndexer: {\n type: String\n },\n\n /**\n * Show id\n */\n showId: {\n type: Number\n }\n },\n\n data() {\n const {\n getCookie\n } = this;\n const perPageDropdown = [25, 50, 100, 250, 500];\n\n const getPaginationPerPage = () => {\n const rows = getCookie('pagination-perPage');\n\n if (!rows) {\n return 50;\n }\n\n if (!perPageDropdown.includes(rows)) {\n return 500;\n }\n\n return rows;\n };\n\n return {\n invertTable: true,\n isMobile: false,\n subtitleSearchComponents: [],\n columns: [{\n label: 'NFO',\n field: 'content.hasNfo',\n type: 'boolean',\n sortable: false,\n hidden: getCookie('NFO')\n }, {\n label: 'TBN',\n field: 'content.hasTbn',\n type: 'boolean',\n sortable: false,\n hidden: getCookie('TBN')\n }, {\n label: 'Episode',\n field: 'episode',\n type: 'number',\n hidden: getCookie('Episode')\n }, {\n label: 'Abs. #',\n field: 'absoluteNumber',\n type: 'number',\n hidden: getCookie('Abs. #')\n }, {\n label: 'Scene',\n field: row => {\n const {\n getSceneNumbering\n } = this;\n return getSceneNumbering(row);\n },\n sortable: false,\n hidden: getCookie('Scene')\n }, {\n label: 'Scene Abs. #',\n field: row => {\n const {\n getSceneAbsoluteNumbering\n } = this;\n return getSceneAbsoluteNumbering(row);\n },\n type: 'number',\n\n /**\n * Vue-good-table sort overwrite function.\n * @param {Object} x - row1 value for column.\n * @param {object} y - row2 value for column.\n * @returns {Boolean} - if we want to display this row before the next\n */\n sortFn(x, y) {\n return x < y ? -1 : x > y ? 1 : 0;\n },\n\n hidden: getCookie('Scene Abs. #')\n }, {\n label: 'Title',\n field: 'title',\n hidden: getCookie('Title')\n }, {\n label: 'File',\n field: 'file.location',\n hidden: getCookie('File')\n }, {\n label: 'Size',\n field: 'file.size',\n type: 'number',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_3__[\"humanFileSize\"],\n hidden: getCookie('Size')\n }, {\n // For now i'm using a custom function the parse it. As the type: date, isn't working for us.\n // But the goal is to have this user formatted (as configured in backend)\n label: 'Air date',\n field: this.parseDateFn,\n sortable: false,\n hidden: getCookie('Air date')\n }, {\n label: 'Download',\n field: 'download',\n sortable: false,\n hidden: getCookie('Download')\n }, {\n label: 'Subtitles',\n field: 'subtitles',\n sortable: false,\n hidden: getCookie('Subtitles')\n }, {\n label: 'Status',\n field: 'status',\n hidden: getCookie('Status')\n }, {\n label: 'Search',\n field: 'search',\n sortable: false,\n hidden: getCookie('Search')\n }],\n perPageDropdown,\n paginationPerPage: getPaginationPerPage(),\n selectedEpisodes: [],\n // We need to keep track of which episode where trying to search, for the vue-modal\n failedSearchEpisode: null,\n backlogSearchEpisodes: [],\n filterByOverviewStatus: false\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n shows: state => state.shows.shows,\n configLoaded: state => state.layout.fanartBackground !== null,\n config: state => state.config,\n layout: state => state.layout,\n stateSearch: state => state.search\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n show: 'getCurrentShow',\n getOverviewStatus: 'getOverviewStatus',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n indexer() {\n return this.showIndexer || this.$route.query.indexername;\n },\n\n id() {\n return this.showId || Number(this.$route.query.seriesid) || undefined;\n },\n\n theme() {\n const {\n layout\n } = this;\n const {\n themeName\n } = layout;\n return themeName || 'light';\n },\n\n orderSeasons() {\n const {\n filterByOverviewStatus,\n invertTable,\n show\n } = this;\n\n if (!show.seasons) {\n return [];\n }\n\n let sortedSeasons = show.seasons.sort((a, b) => a.season - b.season).filter(season => season.season !== 0); // Use the filterOverviewStatus to filter the data based on what's checked in the show-header.\n\n if (filterByOverviewStatus && filterByOverviewStatus.filter(status => status.checked).length < filterByOverviewStatus.length) {\n const filteredSortedSeasons = [];\n\n for (const season of sortedSeasons) {\n const {\n episodes,\n ...res\n } = season;\n const filteredEpisodes = episodes.filter(episode => {\n const episodeOverviewStatus = this.getOverviewStatus(episode.status, episode.quality, show.config.qualities);\n const filteredStatus = filterByOverviewStatus.find(overviewStatus => overviewStatus.name === episodeOverviewStatus);\n return !filteredStatus || filteredStatus.checked;\n });\n filteredSortedSeasons.push(Object.assign({\n episodes: filteredEpisodes\n }, res));\n }\n\n sortedSeasons = filteredSortedSeasons;\n }\n\n if (invertTable) {\n return sortedSeasons.reverse();\n }\n\n return sortedSeasons;\n },\n\n specials() {\n const {\n show\n } = this;\n\n if (!show.seasons) {\n return [];\n }\n\n return show.seasons.filter(season => season.season === 0);\n }\n\n },\n\n mounted() {\n const {\n loadShow,\n setEpisodeSceneNumbering,\n setAbsoluteSceneNumbering,\n setInputValidInvalid\n } = this;\n loadShow();\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.reflowLayout();\n });\n });\n $(document.body).on('click', '.seasonCheck', event => {\n const seasCheck = event.currentTarget;\n const seasNo = $(seasCheck).attr('id');\n $('#collapseSeason-' + seasNo).collapse('show');\n const seasonIdentifier = 's' + seasNo;\n $('.epCheck:visible').each((index, element) => {\n const epParts = $(element).attr('id').split('e');\n\n if (epParts[0] === seasonIdentifier) {\n element.checked = seasCheck.checked;\n }\n });\n });\n $(document.body).on('change', '.sceneSeasonXEpisode', event => {\n const target = event.currentTarget; // Strip non-numeric characters\n\n const value = $(target).val();\n $(target).val(value.replace(/[^\\dXx]*/g, ''));\n const forSeason = $(target).attr('data-for-season');\n const forEpisode = $(target).attr('data-for-episode'); // If empty reset the field\n\n if (value === '') {\n setEpisodeSceneNumbering(forSeason, forEpisode, null, null);\n return;\n }\n\n const m = $(target).val().match(/^(\\d+)x(\\d+)$/i);\n const onlyEpisode = $(target).val().match(/^(\\d+)$/i);\n let sceneSeason = null;\n let sceneEpisode = null;\n let isValid = false;\n\n if (m) {\n sceneSeason = m[1];\n sceneEpisode = m[2];\n isValid = setInputValidInvalid(true, $(target));\n } else if (onlyEpisode) {\n // For example when '5' is filled in instead of '1x5', asume it's the first season\n sceneSeason = forSeason;\n sceneEpisode = onlyEpisode[1];\n isValid = setInputValidInvalid(true, $(target));\n } else {\n isValid = setInputValidInvalid(false, $(target));\n }\n\n if (isValid) {\n setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode);\n }\n });\n $(document.body).on('change', '.sceneAbsolute', event => {\n const target = event.currentTarget; // Strip non-numeric characters\n\n $(target).val($(target).val().replace(/[^\\dXx]*/g, ''));\n const forAbsolute = $(target).attr('data-for-absolute');\n const m = $(target).val().match(/^(\\d{1,3})$/i);\n let sceneAbsolute = null;\n\n if (m) {\n sceneAbsolute = m[1];\n }\n\n setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute);\n });\n },\n\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_3__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getEpisodes: 'getEpisodes',\n setCurrentShow: 'setCurrentShow'\n }),\n\n loadShow() {\n const {\n setCurrentShow,\n id,\n indexer,\n getShow\n } = this; // Let's tell the store which show we currently want as current.\n\n setCurrentShow({\n indexer,\n id\n }); // We need detailed info for the xem / scene exceptions, so let's get it.\n\n getShow({\n id,\n indexer,\n detailed: true\n });\n },\n\n statusQualityUpdate(event) {\n const {\n selectedEpisodes,\n setStatus,\n setQuality\n } = this;\n\n if (event.newQuality !== null && event.newQuality !== 'Change quality to:') {\n setQuality(event.newQuality, selectedEpisodes);\n }\n\n if (event.newStatus !== null && event.newStatus !== 'Change status to:') {\n setStatus(event.newStatus, selectedEpisodes);\n }\n },\n\n setQuality(quality, episodes) {\n const {\n id,\n indexer,\n getEpisodes,\n show\n } = this;\n const patchData = {};\n episodes.forEach(episode => {\n patchData[episode.slug] = {\n quality: Number.parseInt(quality, 10)\n };\n });\n api.patch('series/' + show.id.slug + '/episodes', patchData) // eslint-disable-line no-undef\n .then(_ => {\n console.info(`patched show ${show.id.slug} with quality ${quality}`);\n [...new Set(episodes.map(episode => episode.season))].forEach(season => {\n getEpisodes({\n id,\n indexer,\n season\n });\n });\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n setStatus(status, episodes) {\n const {\n id,\n indexer,\n getEpisodes,\n show\n } = this;\n const patchData = {};\n episodes.forEach(episode => {\n patchData[episode.slug] = {\n status\n };\n });\n api.patch('series/' + show.id.slug + '/episodes', patchData) // eslint-disable-line no-undef\n .then(_ => {\n console.info(`patched show ${show.id.slug} with status ${status}`);\n [...new Set(episodes.map(episode => episode.season))].forEach(season => {\n getEpisodes({\n id,\n indexer,\n season\n });\n });\n }).catch(error => {\n console.error(String(error));\n });\n\n if (status === 3) {\n this.$modal.show('query-start-backlog-search', {\n episodes\n });\n }\n },\n\n parseDateFn(row) {\n const {\n fuzzyParseDateTime\n } = this;\n return fuzzyParseDateTime(row.airDate);\n },\n\n rowStyleClassFn(row) {\n const {\n getOverviewStatus,\n show\n } = this;\n const overview = getOverviewStatus(row.status, row.quality, show.config.qualities).toLowerCase().trim();\n return overview;\n },\n\n /**\n * Add (reduce) the total episodes filesize.\n * @param {object} headerRow header row object.\n * @returns {string} - Human readable file size.\n */\n addFileSize(headerRow) {\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_3__[\"humanFileSize\"])(headerRow.episodes.reduce((a, b) => a + (b.file.size || 0), 0));\n },\n\n searchSubtitle(event, episode, lang) {\n const {\n id,\n indexer,\n getEpisodes,\n show,\n subtitleSearchComponents\n } = this;\n const SubtitleSearchClass = Vue.extend(_subtitle_search_vue__WEBPACK_IMPORTED_MODULE_9__[\"default\"]); // eslint-disable-line no-undef\n\n const instance = new SubtitleSearchClass({\n propsData: {\n show,\n episode,\n key: episode.originalIndex,\n lang\n },\n parent: this\n }); // Update the show, as we downloaded new subtitle(s)\n\n instance.$on('update', event => {\n // This could be replaced by the generic websocket updates in future.\n if (event.reason === 'new subtitles found') {\n getEpisodes({\n id,\n indexer,\n season: episode.season\n });\n }\n });\n const node = document.createElement('div');\n const subtitleRef = episode.season === 0 ? 'table-specials' : 'table-seasons';\n this.$refs[subtitleRef].$refs[`row-${episode.originalIndex}`][0].after(node);\n instance.$mount(node);\n subtitleSearchComponents.push(instance);\n },\n\n /**\n * Attaches IMDB tooltip\n */\n reflowLayout: lodash_debounce__WEBPACK_IMPORTED_MODULE_0___default()(() => {\n console.debug('Reflowing layout');\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_5__[\"addQTip\"])(); // eslint-disable-line no-undef\n }, 1000),\n\n setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode) {\n const {\n $snotify,\n id,\n indexer,\n show\n } = this;\n\n if (!show.config.scene) {\n $snotify.warning('To change episode scene numbering you need to enable the show option `scene` first', 'Warning', {\n timeout: 0\n });\n }\n\n if (sceneSeason === '') {\n sceneSeason = null;\n }\n\n if (sceneEpisode === '') {\n sceneEpisode = null;\n }\n\n $.getJSON('home/setSceneNumbering', {\n indexername: indexer,\n seriesid: id,\n forSeason,\n forEpisode,\n sceneSeason,\n sceneEpisode\n }, data => {\n // Set the values we get back\n if (data.sceneSeason === null || data.sceneEpisode === null) {\n $('#sceneSeasonXEpisode_' + id + '_' + forSeason + '_' + forEpisode).val('');\n } else {\n $('#sceneSeasonXEpisode_' + id + '_' + forSeason + '_' + forEpisode).val(data.sceneSeason + 'x' + data.sceneEpisode);\n }\n\n if (!data.success) {\n if (data.errorMessage) {\n alert(data.errorMessage); // eslint-disable-line no-alert\n } else {\n alert('Update failed.'); // eslint-disable-line no-alert\n }\n }\n });\n },\n\n setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute) {\n const {\n $snotify,\n id,\n indexer,\n show\n } = this;\n\n if (!show.config.scene) {\n $snotify.warning('To change an anime episode scene numbering you need to enable the show option `scene` first', 'Warning', {\n timeout: 0\n });\n }\n\n if (sceneAbsolute === '') {\n sceneAbsolute = null;\n }\n\n $.getJSON('home/setSceneNumbering', {\n indexername: indexer,\n seriesid: id,\n forAbsolute,\n sceneAbsolute\n }, data => {\n // Set the values we get back\n if (data.sceneAbsolute === null) {\n $('#sceneAbsolute_' + id + '_' + forAbsolute).val('');\n } else {\n $('#sceneAbsolute_' + id + '_' + forAbsolute).val(data.sceneAbsolute);\n }\n\n if (!data.success) {\n if (data.errorMessage) {\n alert(data.errorMessage); // eslint-disable-line no-alert\n } else {\n alert('Update failed.'); // eslint-disable-line no-alert\n }\n }\n });\n },\n\n setInputValidInvalid(valid, el) {\n if (valid) {\n $(el).css({\n 'background-color': '#90EE90',\n // Green\n 'color': '#FFF',\n // eslint-disable-line quote-props\n 'font-weight': 'bold'\n });\n return true;\n }\n\n $(el).css({\n 'background-color': '#FF0000',\n // Red\n 'color': '#FFF !important',\n // eslint-disable-line quote-props\n 'font-weight': 'bold'\n });\n return false;\n },\n\n /**\n * Check if any of the episodes in this season does not have the status \"unaired\".\n * If that's the case we want to manual season search icon.\n * @param {object} season - A season object.\n * @returns {Boolean} - true if one of the seasons episodes has a status 'unaired'.\n */\n anyEpisodeNotUnaired(season) {\n return season.episodes.filter(ep => ep.status !== 'Unaired').length > 0;\n },\n\n episodesInverse(season) {\n const {\n invertTable\n } = this;\n\n if (!season.episodes) {\n return [];\n }\n\n if (invertTable) {\n return season.episodes.slice().reverse();\n }\n\n return season.episodes;\n },\n\n /**\n * Check if the season/episode combination exists in the scene numbering.\n * @param {Object} episode - object.\n * @returns {Object} with scene season and episodes mapped numbering.\n */\n getSceneNumbering(episode) {\n const {\n show\n } = this;\n const {\n sceneNumbering,\n xemNumbering\n } = show;\n\n if (!show.config.scene) {\n return {\n season: 0,\n episode: 0\n };\n } // Manually configured scene numbering\n\n\n if (sceneNumbering.length !== 0) {\n const mapped = sceneNumbering.filter(x => {\n return x.source.season === episode.season && x.source.episode === episode.episode;\n });\n\n if (mapped.length !== 0) {\n return mapped[0].destination;\n }\n } // Scene numbering downloaded from thexem.de.\n\n\n if (xemNumbering.length !== 0) {\n const mapped = xemNumbering.filter(x => {\n return x.source.season === episode.season && x.source.episode === episode.episode;\n });\n\n if (mapped.length !== 0) {\n return mapped[0].destination;\n }\n }\n\n return {\n season: episode.scene.season || 0,\n episode: episode.scene.episode || 0\n };\n },\n\n getSceneAbsoluteNumbering(episode) {\n const {\n show\n } = this;\n const {\n sceneAbsoluteNumbering,\n xemAbsoluteNumbering\n } = show;\n\n if (!show.config.anime || !show.config.scene) {\n return episode.scene.absoluteNumber;\n }\n\n if (Object.keys(sceneAbsoluteNumbering).length > 0 && sceneAbsoluteNumbering[episode.absoluteNumber]) {\n return sceneAbsoluteNumbering[episode.absoluteNumber].sceneAbsolute;\n }\n\n if (Object.keys(xemAbsoluteNumbering).length > 0 && xemAbsoluteNumbering[episode.absoluteNumber]) {\n return xemAbsoluteNumbering[episode.absoluteNumber].sceneAbsolute;\n }\n\n return episode.scene.absoluteNumber;\n },\n\n /**\n * Vue-js-modal requires a method, to pass an event to.\n * The event then can be used to assign the value of the episode.\n * @param {Object} event - vue js modal event\n */\n beforeBacklogSearchModalClose(event) {\n this.backlogSearchEpisodes = event.params.episodes;\n },\n\n /**\n * Vue-js-modal requires a method, to pass an event to.\n * The event then can be used to assign the value of the episode.\n * @param {Object} event - vue js modal event\n */\n beforeFailedSearchModalClose(event) {\n this.failedSearchEpisode = event.params.episode;\n },\n\n retryDownload(episode) {\n const {\n stateSearch\n } = this;\n return stateSearch.general.failedDownloads.enabled && ['Snatched', 'Snatched (Proper)', 'Snatched (Best)', 'Downloaded'].includes(episode.status);\n },\n\n search(episodes, searchType) {\n const {\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes: [],\n options: {}\n };\n episodes.forEach(episode => {\n data.episodes.push(episode.slug);\n this.$refs[`search-${episode.slug}`].src = 'images/loading16-dark.gif';\n });\n }\n\n api.put(`search/${searchType}`, data) // eslint-disable-line no-undef\n .then(_ => {\n if (episodes.length === 1) {\n console.info(`started search for show: ${show.id.slug} episode: ${episodes[0].slug}`);\n this.$refs[`search-${episodes[0].slug}`].src = 'images/queued.png';\n this.$refs[`search-${episodes[0].slug}`].disabled = true;\n } else {\n console.info('started a full backlog search');\n }\n }).catch(error => {\n console.error(String(error));\n episodes.forEach(episode => {\n data.episodes.push(episode.slug);\n this.$refs[`search-${episodes[0].slug}`].src = 'images/no16.png';\n });\n }).finally(() => {\n this.failedSearchEpisode = null;\n this.backlogSearchEpisodes = [];\n });\n },\n\n /**\n * Start a backlog search or failed search for the specific episode.\n * A failed search is started depending on the current episodes status.\n * @param {Object} episode - Episode object. If no episode object is passed, a backlog search is started.\n */\n queueSearch(episode) {\n const {\n $modal,\n search,\n retryDownload\n } = this;\n const episodeIdentifier = episode.slug;\n\n if (episode) {\n if (this.$refs[`search-${episodeIdentifier}`].disabled === true) {\n return;\n }\n\n if (retryDownload(episode)) {\n $modal.show('query-mark-failed-and-search', {\n episode\n });\n } else {\n search([episode], 'backlog');\n }\n }\n },\n\n showSubtitleButton(episode) {\n const {\n config,\n show\n } = this;\n return episode.season !== 0 && config.subtitles.enabled && show.config.subtitlesEnabled && !['Snatched', 'Snatched (Proper)', 'Snatched (Best)', 'Downloaded'].includes(episode.status);\n },\n\n totalSeasonEpisodeSize(season) {\n return season.episodes.filter(x => x.file && x.file.size > 0).reduce((a, b) => a + b.file.size, 0);\n },\n\n getSeasonExceptions(season) {\n const {\n show\n } = this;\n const {\n config\n } = show;\n const {\n aliases\n } = config;\n let bindData = {\n class: 'display: none'\n }; // Map the indexer season to a xem mapped season.\n // check if the season exception also exists in the xem numbering table\n\n let xemSeasons = [];\n let foundInXem = false;\n\n if (show.xemNumbering.length > 0) {\n const xemResult = show.xemNumbering.filter(x => x.source.season === season); // Create an array with unique seasons\n\n xemSeasons = [...new Set(xemResult.map(item => item.destination.season))];\n foundInXem = Boolean(xemSeasons.length);\n } // Check if there is a season exception for this season\n\n\n if (aliases.find(x => x.season === season)) {\n // If there is not a match on the xem table, display it as a medusa scene exception\n bindData = {\n id: `xem-exception-season-${foundInXem ? xemSeasons[0] : season}`,\n alt: foundInXem ? '[xem]' : '[medusa]',\n src: foundInXem ? 'images/xem.png' : 'images/ico/favicon-16.png',\n title: foundInXem ? xemSeasons.reduce((a, b) => {\n return a.concat(aliases.filter(alias => alias.season === b).map(alias => alias.title));\n }, []).join(', ') : aliases.filter(alias => alias.season === season).map(alias => alias.title).join(', ')\n };\n }\n\n return bindData;\n },\n\n updateEpisodeWatched(episode, watched) {\n const {\n id,\n indexer,\n getEpisodes,\n show\n } = this;\n const patchData = {};\n patchData[episode.slug] = {\n watched\n };\n api.patch(`series/${show.id.slug}/episodes`, patchData) // eslint-disable-line no-undef\n .then(_ => {\n console.info(`patched episode ${episode.slug} with watched set to ${watched}`);\n getEpisodes({\n id,\n indexer,\n season: episode.season\n });\n }).catch(error => {\n console.error(String(error));\n });\n episode.watched = watched;\n },\n\n updatePaginationPerPage(rows) {\n const {\n setCookie\n } = this;\n this.paginationPerPage = rows;\n setCookie('pagination-perPage', rows);\n },\n\n onPageChange(params) {\n this.loadEpisodes(params.currentPage);\n },\n\n neededSeasons(page) {\n const {\n paginationPerPage,\n show\n } = this;\n const seasons = show.seasonCount.length - 1;\n let pagesCount = 1;\n let episodeCount = 0;\n const pages = {};\n\n for (let i = seasons; i >= 0; i--) {\n const {\n season\n } = show.seasonCount[i]; // Exclude specials\n\n if (season === 0) {\n break;\n }\n\n if (pagesCount in pages) {\n pages[pagesCount].push(season);\n } else {\n pages[pagesCount] = [season];\n }\n\n episodeCount += show.seasonCount[i].episodeCount;\n\n if (episodeCount / paginationPerPage > pagesCount) {\n pagesCount++;\n pages[pagesCount] = [season];\n }\n\n if (pagesCount > page) {\n break;\n }\n }\n\n return pages[page] || [];\n },\n\n loadEpisodes(page) {\n const {\n id,\n indexer,\n getEpisodes\n } = this; // Wrap getEpisodes into an async/await function, so we can wait for the season to have been committed\n // before going on to the next one.\n\n const _getEpisodes = async (id, indexer) => {\n for (const season of this.neededSeasons(page)) {\n // We're waiting for the results by design, to give vue the chance to update the dom.\n // If we fire all the promises at once for, for example 25 seasons. We'll overload medusa's app\n // and chance is high a number of requests will timeout.\n await getEpisodes({\n id,\n indexer,\n season\n }); // eslint-disable-line no-await-in-loop\n }\n };\n\n _getEpisodes(id, indexer);\n },\n\n initializeEpisodes() {\n const {\n getEpisodes,\n id,\n indexer,\n show\n } = this;\n\n if (!show.seasons) {\n // Load episodes for the first page.\n this.loadEpisodes(1); // Always get special episodes if available.\n\n if (show.seasonCount.length > 0 && show.seasonCount[0].season === 0) {\n getEpisodes({\n id,\n indexer,\n season: 0\n });\n }\n }\n }\n\n },\n watch: {\n 'show.id.slug': function (slug) {\n // eslint-disable-line object-shorthand\n const {\n initializeEpisodes\n } = this; // Show's slug has changed, meaning the show's page has finished loading.\n\n if (slug) {\n // This is still technically jQuery. Meaning whe're still letting jQuery do its thing on the entire dom.\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_5__[\"updateSearchIcons\"])(slug, this);\n initializeEpisodes();\n }\n }\n },\n\n beforeRouteEnter(to, from, next) {\n next(vm => {\n // Access to component instance via `vm`.\n // When moving from editShow to displayShow we might not have loaded the episodes yet.\n // The watch on show.id.slug will also not be triggered.\n vm.initializeEpisodes();\n });\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/debounce */ \"./node_modules/lodash/debounce.js\");\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./subtitle-search.vue */ \"./src/components/subtitle-search.vue\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_6__[\"VueGoodTable\"],\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n PlotInfo: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"PlotInfo\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_10__[\"default\"]\n },\n mixins: [Object(_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_4__[\"manageCookieMixin\"])('displayShow')],\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n props: {\n /**\n * Show indexer\n */\n showIndexer: {\n type: String\n },\n\n /**\n * Show id\n */\n showId: {\n type: Number\n }\n },\n\n data() {\n const {\n getCookie\n } = this;\n const perPageDropdown = [25, 50, 100, 250, 500];\n\n const getPaginationPerPage = () => {\n const rows = getCookie('pagination-perPage');\n\n if (!rows) {\n return 50;\n }\n\n if (!perPageDropdown.includes(rows)) {\n return 500;\n }\n\n return rows;\n };\n\n return {\n invertTable: true,\n isMobile: false,\n subtitleSearchComponents: [],\n columns: [{\n label: 'NFO',\n field: 'content.hasNfo',\n type: 'boolean',\n sortable: false,\n hidden: getCookie('NFO')\n }, {\n label: 'TBN',\n field: 'content.hasTbn',\n type: 'boolean',\n sortable: false,\n hidden: getCookie('TBN')\n }, {\n label: 'Episode',\n field: 'episode',\n type: 'number',\n hidden: getCookie('Episode')\n }, {\n label: 'Abs. #',\n field: 'absoluteNumber',\n type: 'number',\n hidden: getCookie('Abs. #')\n }, {\n label: 'Scene',\n field: row => {\n const {\n getSceneNumbering\n } = this;\n return getSceneNumbering(row);\n },\n sortable: false,\n hidden: getCookie('Scene')\n }, {\n label: 'Scene Abs. #',\n field: row => {\n const {\n getSceneAbsoluteNumbering\n } = this;\n return getSceneAbsoluteNumbering(row);\n },\n type: 'number',\n\n /**\n * Vue-good-table sort overwrite function.\n * @param {Object} x - row1 value for column.\n * @param {object} y - row2 value for column.\n * @returns {Boolean} - if we want to display this row before the next\n */\n sortFn(x, y) {\n return x < y ? -1 : x > y ? 1 : 0;\n },\n\n hidden: getCookie('Scene Abs. #')\n }, {\n label: 'Title',\n field: 'title',\n hidden: getCookie('Title')\n }, {\n label: 'File',\n field: 'file.location',\n hidden: getCookie('File')\n }, {\n label: 'Size',\n field: 'file.size',\n type: 'number',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_3__[\"humanFileSize\"],\n hidden: getCookie('Size')\n }, {\n // For now i'm using a custom function the parse it. As the type: date, isn't working for us.\n // But the goal is to have this user formatted (as configured in backend)\n label: 'Air date',\n field: this.parseDateFn,\n sortable: false,\n hidden: getCookie('Air date')\n }, {\n label: 'Download',\n field: 'download',\n sortable: false,\n hidden: getCookie('Download')\n }, {\n label: 'Subtitles',\n field: 'subtitles',\n sortable: false,\n hidden: getCookie('Subtitles')\n }, {\n label: 'Status',\n field: 'status',\n hidden: getCookie('Status')\n }, {\n label: 'Search',\n field: 'search',\n sortable: false,\n hidden: getCookie('Search')\n }],\n perPageDropdown,\n paginationPerPage: getPaginationPerPage(),\n selectedEpisodes: [],\n // We need to keep track of which episode where trying to search, for the vue-modal\n failedSearchEpisode: null,\n backlogSearchEpisodes: [],\n filterByOverviewStatus: false\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config.general,\n configLoaded: state => state.config.layout.fanartBackground !== null,\n layout: state => state.config.layout,\n stateSearch: state => state.config.search\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n show: 'getCurrentShow',\n getOverviewStatus: 'getOverviewStatus',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n indexer() {\n return this.showIndexer || this.$route.query.indexername;\n },\n\n id() {\n return this.showId || Number(this.$route.query.seriesid) || undefined;\n },\n\n theme() {\n const {\n layout\n } = this;\n const {\n themeName\n } = layout;\n return themeName || 'light';\n },\n\n orderSeasons() {\n const {\n filterByOverviewStatus,\n invertTable,\n show\n } = this;\n\n if (!show.seasons) {\n return [];\n }\n\n let sortedSeasons = show.seasons.sort((a, b) => a.season - b.season).filter(season => season.season !== 0); // Use the filterOverviewStatus to filter the data based on what's checked in the show-header.\n\n if (filterByOverviewStatus && filterByOverviewStatus.filter(status => status.checked).length < filterByOverviewStatus.length) {\n const filteredSortedSeasons = [];\n\n for (const season of sortedSeasons) {\n const {\n episodes,\n ...res\n } = season;\n const filteredEpisodes = episodes.filter(episode => {\n const episodeOverviewStatus = this.getOverviewStatus(episode.status, episode.quality, show.config.qualities);\n const filteredStatus = filterByOverviewStatus.find(overviewStatus => overviewStatus.name === episodeOverviewStatus);\n return !filteredStatus || filteredStatus.checked;\n });\n filteredSortedSeasons.push(Object.assign({\n episodes: filteredEpisodes\n }, res));\n }\n\n sortedSeasons = filteredSortedSeasons;\n }\n\n if (invertTable) {\n return sortedSeasons.reverse();\n }\n\n return sortedSeasons;\n },\n\n specials() {\n const {\n show\n } = this;\n\n if (!show.seasons) {\n return [];\n }\n\n return show.seasons.filter(season => season.season === 0);\n }\n\n },\n\n mounted() {\n const {\n loadShow,\n setEpisodeSceneNumbering,\n setAbsoluteSceneNumbering,\n setInputValidInvalid\n } = this;\n loadShow();\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.reflowLayout();\n });\n });\n $(document.body).on('click', '.seasonCheck', event => {\n const seasCheck = event.currentTarget;\n const seasNo = $(seasCheck).attr('id');\n $('#collapseSeason-' + seasNo).collapse('show');\n const seasonIdentifier = 's' + seasNo;\n $('.epCheck:visible').each((index, element) => {\n const epParts = $(element).attr('id').split('e');\n\n if (epParts[0] === seasonIdentifier) {\n element.checked = seasCheck.checked;\n }\n });\n });\n $(document.body).on('change', '.sceneSeasonXEpisode', event => {\n const target = event.currentTarget; // Strip non-numeric characters\n\n const value = $(target).val();\n $(target).val(value.replace(/[^\\dXx]*/g, ''));\n const forSeason = $(target).attr('data-for-season');\n const forEpisode = $(target).attr('data-for-episode'); // If empty reset the field\n\n if (value === '') {\n setEpisodeSceneNumbering(forSeason, forEpisode, null, null);\n return;\n }\n\n const m = $(target).val().match(/^(\\d+)x(\\d+)$/i);\n const onlyEpisode = $(target).val().match(/^(\\d+)$/i);\n let sceneSeason = null;\n let sceneEpisode = null;\n let isValid = false;\n\n if (m) {\n sceneSeason = m[1];\n sceneEpisode = m[2];\n isValid = setInputValidInvalid(true, $(target));\n } else if (onlyEpisode) {\n // For example when '5' is filled in instead of '1x5', asume it's the first season\n sceneSeason = forSeason;\n sceneEpisode = onlyEpisode[1];\n isValid = setInputValidInvalid(true, $(target));\n } else {\n isValid = setInputValidInvalid(false, $(target));\n }\n\n if (isValid) {\n setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode);\n }\n });\n $(document.body).on('change', '.sceneAbsolute', event => {\n const target = event.currentTarget; // Strip non-numeric characters\n\n $(target).val($(target).val().replace(/[^\\dXx]*/g, ''));\n const forAbsolute = $(target).attr('data-for-absolute');\n const m = $(target).val().match(/^(\\d{1,3})$/i);\n let sceneAbsolute = null;\n\n if (m) {\n sceneAbsolute = m[1];\n }\n\n setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute);\n });\n },\n\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_3__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getEpisodes: 'getEpisodes',\n setCurrentShow: 'setCurrentShow',\n setRecentShow: 'setRecentShow'\n }),\n\n loadShow() {\n const {\n setCurrentShow,\n id,\n indexer,\n getShow\n } = this; // Let's tell the store which show we currently want as current.\n\n setCurrentShow({\n indexer,\n id\n }); // We need detailed info for the xem / scene exceptions, so let's get it.\n\n getShow({\n id,\n indexer,\n detailed: true\n });\n },\n\n statusQualityUpdate(event) {\n const {\n selectedEpisodes,\n setStatus,\n setQuality\n } = this;\n\n if (event.newQuality !== null && event.newQuality !== 'Change quality to:') {\n setQuality(event.newQuality, selectedEpisodes);\n }\n\n if (event.newStatus !== null && event.newStatus !== 'Change status to:') {\n setStatus(event.newStatus, selectedEpisodes);\n }\n },\n\n setQuality(quality, episodes) {\n const {\n id,\n indexer,\n getEpisodes,\n show\n } = this;\n const patchData = {};\n episodes.forEach(episode => {\n patchData[episode.slug] = {\n quality: Number.parseInt(quality, 10)\n };\n });\n api.patch('series/' + show.id.slug + '/episodes', patchData) // eslint-disable-line no-undef\n .then(_ => {\n console.info(`patched show ${show.id.slug} with quality ${quality}`);\n [...new Set(episodes.map(episode => episode.season))].forEach(season => {\n getEpisodes({\n id,\n indexer,\n season\n });\n });\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n setStatus(status, episodes) {\n const {\n id,\n indexer,\n getEpisodes,\n show\n } = this;\n const patchData = {};\n episodes.forEach(episode => {\n patchData[episode.slug] = {\n status\n };\n });\n api.patch('series/' + show.id.slug + '/episodes', patchData) // eslint-disable-line no-undef\n .then(_ => {\n console.info(`patched show ${show.id.slug} with status ${status}`);\n [...new Set(episodes.map(episode => episode.season))].forEach(season => {\n getEpisodes({\n id,\n indexer,\n season\n });\n });\n }).catch(error => {\n console.error(String(error));\n });\n\n if (status === 3) {\n this.$modal.show('query-start-backlog-search', {\n episodes\n });\n }\n },\n\n parseDateFn(row) {\n const {\n fuzzyParseDateTime\n } = this;\n return fuzzyParseDateTime(row.airDate);\n },\n\n rowStyleClassFn(row) {\n const {\n getOverviewStatus,\n show\n } = this;\n const overview = getOverviewStatus(row.status, row.quality, show.config.qualities).toLowerCase().trim();\n return overview;\n },\n\n /**\n * Add (reduce) the total episodes filesize.\n * @param {object} headerRow header row object.\n * @returns {string} - Human readable file size.\n */\n addFileSize(headerRow) {\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_3__[\"humanFileSize\"])(headerRow.episodes.reduce((a, b) => a + (b.file.size || 0), 0));\n },\n\n searchSubtitle(event, episode, lang) {\n const {\n id,\n indexer,\n getEpisodes,\n show,\n subtitleSearchComponents\n } = this;\n const SubtitleSearchClass = Vue.extend(_subtitle_search_vue__WEBPACK_IMPORTED_MODULE_9__[\"default\"]); // eslint-disable-line no-undef\n\n const instance = new SubtitleSearchClass({\n propsData: {\n show,\n episode,\n key: episode.originalIndex,\n lang\n },\n parent: this\n }); // Update the show, as we downloaded new subtitle(s)\n\n instance.$on('update', event => {\n // This could be replaced by the generic websocket updates in future.\n if (event.reason === 'new subtitles found') {\n getEpisodes({\n id,\n indexer,\n season: episode.season\n });\n }\n });\n const node = document.createElement('div');\n const subtitleRef = episode.season === 0 ? 'table-specials' : 'table-seasons';\n this.$refs[subtitleRef].$refs[`row-${episode.originalIndex}`][0].after(node);\n instance.$mount(node);\n subtitleSearchComponents.push(instance);\n },\n\n /**\n * Attaches IMDB tooltip\n */\n reflowLayout: lodash_debounce__WEBPACK_IMPORTED_MODULE_0___default()(() => {\n console.debug('Reflowing layout');\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_5__[\"addQTip\"])(); // eslint-disable-line no-undef\n }, 1000),\n\n setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode) {\n const {\n $snotify,\n id,\n indexer,\n show\n } = this;\n\n if (!show.config.scene) {\n $snotify.warning('To change episode scene numbering you need to enable the show option `scene` first', 'Warning', {\n timeout: 0\n });\n }\n\n if (sceneSeason === '') {\n sceneSeason = null;\n }\n\n if (sceneEpisode === '') {\n sceneEpisode = null;\n }\n\n $.getJSON('home/setSceneNumbering', {\n indexername: indexer,\n seriesid: id,\n forSeason,\n forEpisode,\n sceneSeason,\n sceneEpisode\n }, data => {\n // Set the values we get back\n if (data.sceneSeason === null || data.sceneEpisode === null) {\n $('#sceneSeasonXEpisode_' + id + '_' + forSeason + '_' + forEpisode).val('');\n } else {\n $('#sceneSeasonXEpisode_' + id + '_' + forSeason + '_' + forEpisode).val(data.sceneSeason + 'x' + data.sceneEpisode);\n }\n\n if (!data.success) {\n if (data.errorMessage) {\n alert(data.errorMessage); // eslint-disable-line no-alert\n } else {\n alert('Update failed.'); // eslint-disable-line no-alert\n }\n }\n });\n },\n\n setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute) {\n const {\n $snotify,\n id,\n indexer,\n show\n } = this;\n\n if (!show.config.scene) {\n $snotify.warning('To change an anime episode scene numbering you need to enable the show option `scene` first', 'Warning', {\n timeout: 0\n });\n }\n\n if (sceneAbsolute === '') {\n sceneAbsolute = null;\n }\n\n $.getJSON('home/setSceneNumbering', {\n indexername: indexer,\n seriesid: id,\n forAbsolute,\n sceneAbsolute\n }, data => {\n // Set the values we get back\n if (data.sceneAbsolute === null) {\n $('#sceneAbsolute_' + id + '_' + forAbsolute).val('');\n } else {\n $('#sceneAbsolute_' + id + '_' + forAbsolute).val(data.sceneAbsolute);\n }\n\n if (!data.success) {\n if (data.errorMessage) {\n alert(data.errorMessage); // eslint-disable-line no-alert\n } else {\n alert('Update failed.'); // eslint-disable-line no-alert\n }\n }\n });\n },\n\n setInputValidInvalid(valid, el) {\n if (valid) {\n $(el).css({\n 'background-color': '#90EE90',\n // Green\n 'color': '#FFF',\n // eslint-disable-line quote-props\n 'font-weight': 'bold'\n });\n return true;\n }\n\n $(el).css({\n 'background-color': '#FF0000',\n // Red\n 'color': '#FFF !important',\n // eslint-disable-line quote-props\n 'font-weight': 'bold'\n });\n return false;\n },\n\n /**\n * Check if any of the episodes in this season does not have the status \"unaired\".\n * If that's the case we want to manual season search icon.\n * @param {object} season - A season object.\n * @returns {Boolean} - true if one of the seasons episodes has a status 'unaired'.\n */\n anyEpisodeNotUnaired(season) {\n return season.episodes.filter(ep => ep.status !== 'Unaired').length > 0;\n },\n\n episodesInverse(season) {\n const {\n invertTable\n } = this;\n\n if (!season.episodes) {\n return [];\n }\n\n if (invertTable) {\n return season.episodes.slice().reverse();\n }\n\n return season.episodes;\n },\n\n /**\n * Check if the season/episode combination exists in the scene numbering.\n * @param {Object} episode - object.\n * @returns {Object} with scene season and episodes mapped numbering.\n */\n getSceneNumbering(episode) {\n const {\n show\n } = this;\n const {\n sceneNumbering,\n xemNumbering\n } = show;\n\n if (!show.config.scene) {\n return {\n season: 0,\n episode: 0\n };\n } // Manually configured scene numbering\n\n\n if (sceneNumbering.length !== 0) {\n const mapped = sceneNumbering.filter(x => {\n return x.source.season === episode.season && x.source.episode === episode.episode;\n });\n\n if (mapped.length !== 0) {\n return mapped[0].destination;\n }\n } // Scene numbering downloaded from thexem.de.\n\n\n if (xemNumbering.length !== 0) {\n const mapped = xemNumbering.filter(x => {\n return x.source.season === episode.season && x.source.episode === episode.episode;\n });\n\n if (mapped.length !== 0) {\n return mapped[0].destination;\n }\n }\n\n return {\n season: episode.scene.season || 0,\n episode: episode.scene.episode || 0\n };\n },\n\n getSceneAbsoluteNumbering(episode) {\n const {\n show\n } = this;\n const {\n sceneAbsoluteNumbering,\n xemAbsoluteNumbering\n } = show;\n\n if (!show.config.anime || !show.config.scene) {\n return episode.scene.absoluteNumber;\n }\n\n if (Object.keys(sceneAbsoluteNumbering).length > 0 && sceneAbsoluteNumbering[episode.absoluteNumber]) {\n return sceneAbsoluteNumbering[episode.absoluteNumber].sceneAbsolute;\n }\n\n if (Object.keys(xemAbsoluteNumbering).length > 0 && xemAbsoluteNumbering[episode.absoluteNumber]) {\n return xemAbsoluteNumbering[episode.absoluteNumber].sceneAbsolute;\n }\n\n return episode.scene.absoluteNumber;\n },\n\n /**\n * Vue-js-modal requires a method, to pass an event to.\n * The event then can be used to assign the value of the episode.\n * @param {Object} event - vue js modal event\n */\n beforeBacklogSearchModalClose(event) {\n this.backlogSearchEpisodes = event.params.episodes;\n },\n\n /**\n * Vue-js-modal requires a method, to pass an event to.\n * The event then can be used to assign the value of the episode.\n * @param {Object} event - vue js modal event\n */\n beforeFailedSearchModalClose(event) {\n this.failedSearchEpisode = event.params.episode;\n },\n\n retryDownload(episode) {\n const {\n stateSearch\n } = this;\n return stateSearch.general.failedDownloads.enabled && ['Snatched', 'Snatched (Proper)', 'Snatched (Best)', 'Downloaded'].includes(episode.status);\n },\n\n search(episodes, searchType) {\n const {\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes: [],\n options: {}\n };\n episodes.forEach(episode => {\n data.episodes.push(episode.slug);\n this.$refs[`search-${episode.slug}`].src = 'images/loading16-dark.gif';\n });\n }\n\n api.put(`search/${searchType}`, data) // eslint-disable-line no-undef\n .then(_ => {\n if (episodes.length === 1) {\n console.info(`started search for show: ${show.id.slug} episode: ${episodes[0].slug}`);\n this.$refs[`search-${episodes[0].slug}`].src = 'images/queued.png';\n this.$refs[`search-${episodes[0].slug}`].disabled = true;\n } else {\n console.info('started a full backlog search');\n }\n }).catch(error => {\n console.error(String(error));\n episodes.forEach(episode => {\n data.episodes.push(episode.slug);\n this.$refs[`search-${episodes[0].slug}`].src = 'images/no16.png';\n });\n }).finally(() => {\n this.failedSearchEpisode = null;\n this.backlogSearchEpisodes = [];\n });\n },\n\n /**\n * Start a backlog search or failed search for the specific episode.\n * A failed search is started depending on the current episodes status.\n * @param {Object} episode - Episode object. If no episode object is passed, a backlog search is started.\n */\n queueSearch(episode) {\n const {\n $modal,\n search,\n retryDownload\n } = this;\n const episodeIdentifier = episode.slug;\n\n if (episode) {\n if (this.$refs[`search-${episodeIdentifier}`].disabled === true) {\n return;\n }\n\n if (retryDownload(episode)) {\n $modal.show('query-mark-failed-and-search', {\n episode\n });\n } else {\n search([episode], 'backlog');\n }\n }\n },\n\n showSubtitleButton(episode) {\n const {\n config,\n show\n } = this;\n return episode.season !== 0 && config.subtitles.enabled && show.config.subtitlesEnabled && !['Snatched', 'Snatched (Proper)', 'Snatched (Best)', 'Downloaded'].includes(episode.status);\n },\n\n totalSeasonEpisodeSize(season) {\n return season.episodes.filter(x => x.file && x.file.size > 0).reduce((a, b) => a + b.file.size, 0);\n },\n\n getSeasonExceptions(season) {\n const {\n show\n } = this;\n const {\n config\n } = show;\n const {\n aliases\n } = config;\n let bindData = {\n class: 'display: none'\n }; // Map the indexer season to a xem mapped season.\n // check if the season exception also exists in the xem numbering table\n\n let xemSeasons = [];\n let foundInXem = false;\n\n if (show.xemNumbering.length > 0) {\n const xemResult = show.xemNumbering.filter(x => x.source.season === season); // Create an array with unique seasons\n\n xemSeasons = [...new Set(xemResult.map(item => item.destination.season))];\n foundInXem = Boolean(xemSeasons.length);\n } // Check if there is a season exception for this season\n\n\n if (aliases.find(x => x.season === season)) {\n // If there is not a match on the xem table, display it as a medusa scene exception\n bindData = {\n id: `xem-exception-season-${foundInXem ? xemSeasons[0] : season}`,\n alt: foundInXem ? '[xem]' : '[medusa]',\n src: foundInXem ? 'images/xem.png' : 'images/ico/favicon-16.png',\n title: foundInXem ? xemSeasons.reduce((a, b) => {\n return a.concat(aliases.filter(alias => alias.season === b).map(alias => alias.title));\n }, []).join(', ') : aliases.filter(alias => alias.season === season).map(alias => alias.title).join(', ')\n };\n }\n\n return bindData;\n },\n\n updateEpisodeWatched(episode, watched) {\n const {\n id,\n indexer,\n getEpisodes,\n show\n } = this;\n const patchData = {};\n patchData[episode.slug] = {\n watched\n };\n api.patch(`series/${show.id.slug}/episodes`, patchData) // eslint-disable-line no-undef\n .then(_ => {\n console.info(`patched episode ${episode.slug} with watched set to ${watched}`);\n getEpisodes({\n id,\n indexer,\n season: episode.season\n });\n }).catch(error => {\n console.error(String(error));\n });\n episode.watched = watched;\n },\n\n updatePaginationPerPage(rows) {\n const {\n setCookie\n } = this;\n this.paginationPerPage = rows;\n setCookie('pagination-perPage', rows);\n },\n\n onPageChange(params) {\n this.loadEpisodes(params.currentPage);\n },\n\n neededSeasons(page) {\n const {\n paginationPerPage,\n show\n } = this;\n const seasons = show.seasonCount.length - 1;\n let pagesCount = 1;\n let episodeCount = 0;\n const pages = {};\n\n for (let i = seasons; i >= 0; i--) {\n const {\n season\n } = show.seasonCount[i]; // Exclude specials\n\n if (season === 0) {\n break;\n }\n\n if (pagesCount in pages) {\n pages[pagesCount].push(season);\n } else {\n pages[pagesCount] = [season];\n }\n\n episodeCount += show.seasonCount[i].episodeCount;\n\n if (episodeCount / paginationPerPage > pagesCount) {\n pagesCount++;\n pages[pagesCount] = [season];\n }\n\n if (pagesCount > page) {\n break;\n }\n }\n\n return pages[page] || [];\n },\n\n loadEpisodes(page) {\n const {\n id,\n indexer,\n getEpisodes\n } = this; // Wrap getEpisodes into an async/await function, so we can wait for the season to have been committed\n // before going on to the next one.\n\n const _getEpisodes = async (id, indexer) => {\n for (const season of this.neededSeasons(page)) {\n // We're waiting for the results by design, to give vue the chance to update the dom.\n // If we fire all the promises at once for, for example 25 seasons. We'll overload medusa's app\n // and chance is high a number of requests will timeout.\n await getEpisodes({\n id,\n indexer,\n season\n }); // eslint-disable-line no-await-in-loop\n }\n };\n\n _getEpisodes(id, indexer);\n },\n\n initializeEpisodes() {\n const {\n getEpisodes,\n id,\n indexer,\n setRecentShow,\n show\n } = this;\n\n if (!show.seasons) {\n // Load episodes for the first page.\n this.loadEpisodes(1); // Always get special episodes if available.\n\n if (show.seasonCount.length > 0 && show.seasonCount[0].season === 0) {\n getEpisodes({\n id,\n indexer,\n season: 0\n });\n }\n }\n\n if (show.id.slug) {\n // For now i'm dumping this here\n setRecentShow({\n indexerName: show.indexer,\n showId: show.id[show.indexer],\n name: show.title\n });\n }\n }\n\n },\n watch: {\n 'show.id.slug': function (slug) {\n // eslint-disable-line object-shorthand\n const {\n initializeEpisodes\n } = this; // Show's slug has changed, meaning the show's page has finished loading.\n\n if (slug) {\n // This is still technically jQuery. Meaning whe're still letting jQuery do its thing on the entire dom.\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_5__[\"updateSearchIcons\"])(slug, this);\n initializeEpisodes();\n }\n }\n },\n\n beforeRouteEnter(to, from, next) {\n next(vm => {\n // Access to component instance via `vm`.\n // When moving from editShow to displayShow we might not have loaded the episodes yet.\n // The watch on show.id.slug will also not be triggered.\n vm.initializeEpisodes();\n });\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -164,7 +164,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-nav-tabs/dist/vue-tabs.js */ \"./node_modules/vue-nav-tabs/dist/vue-tabs.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./anidb-release-group-ui.vue */ \"./src/components/anidb-release-group-ui.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\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//\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//\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//\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//\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//\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//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'edit-show',\n components: {\n AnidbReleaseGroupUi: _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"AppLink\"],\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n ConfigSceneExceptions: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"ConfigSceneExceptions\"],\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"ConfigTemplate\"],\n ConfigTextboxNumber: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"ConfigTextboxNumber\"],\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"ConfigToggleSlider\"],\n FileBrowser: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"FileBrowser\"],\n LanguageSelect: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"LanguageSelect\"],\n QualityChooser: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"QualityChooser\"],\n SelectList: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"SelectList\"],\n VueTabs: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2__[\"VueTabs\"],\n VTab: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2__[\"VTab\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n props: {\n /**\n * Show indexer\n */\n showIndexer: {\n type: String\n },\n\n /**\n * Show id\n */\n showId: {\n type: Number\n }\n },\n\n data() {\n return {\n saving: false,\n loadError: null\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n indexers: state => state.indexers,\n layout: state => state.layout,\n episodeStatuses: state => state.consts.statuses\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n show: 'getCurrentShow',\n getStatus: 'getStatus'\n }),\n\n indexer() {\n return this.showIndexer || this.$route.query.indexername;\n },\n\n id() {\n return this.showId || Number(this.$route.query.seriesid) || undefined;\n },\n\n showLoaded() {\n return Boolean(this.show.id.slug);\n },\n\n defaultEpisodeStatusOptions() {\n if (this.episodeStatuses.length === 0) {\n return [];\n } // Get status objects, in this order\n\n\n return ['wanted', 'skipped', 'ignored'].map(key => this.getStatus({\n key\n }));\n },\n\n availableLanguages() {\n if (this.indexers.main.validLanguages) {\n return this.indexers.main.validLanguages.join(',');\n }\n\n return '';\n },\n\n combinedQualities() {\n const {\n allowed,\n preferred\n } = this.show.config.qualities;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__[\"combineQualities\"])(allowed, preferred);\n },\n\n saveButton() {\n return this.saving === false ? 'Save Changes' : 'Saving...';\n },\n\n globalIgnored() {\n return this.$store.state.search.filters.ignored.map(x => x.toLowerCase());\n },\n\n globalRequired() {\n return this.$store.state.search.filters.required.map(x => x.toLowerCase());\n },\n\n effectiveIgnored() {\n const {\n globalIgnored\n } = this;\n const showIgnored = this.show.config.release.ignoredWords.map(x => x.toLowerCase());\n\n if (this.show.config.release.ignoredWordsExclude) {\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__[\"arrayExclude\"])(globalIgnored, showIgnored);\n }\n\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__[\"arrayUnique\"])(globalIgnored.concat(showIgnored));\n },\n\n effectiveRequired() {\n const {\n globalRequired\n } = this;\n const showRequired = this.show.config.release.requiredWords.map(x => x.toLowerCase());\n\n if (this.show.config.release.requiredWordsExclude) {\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__[\"arrayExclude\"])(globalRequired, showRequired);\n }\n\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__[\"arrayUnique\"])(globalRequired.concat(showRequired));\n }\n\n },\n\n created() {\n this.loadShow();\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])(['getShow', 'setShow', 'setCurrentShow']),\n\n loadShow() {\n const {\n setCurrentShow,\n id,\n indexer,\n getShow\n } = this; // Let's tell the store which show we currently want as current.\n\n setCurrentShow({\n indexer,\n id\n }); // We need detailed info for the xem / scene exceptions, so let's get it.\n\n getShow({\n id,\n indexer,\n detailed: true\n });\n },\n\n async saveShow(subject) {\n const {\n show,\n showLoaded\n } = this; // We want to wait until the page has been fully loaded, before starting to save stuff.\n\n if (!showLoaded) {\n return;\n }\n\n if (!['show', 'all'].includes(subject)) {\n return;\n } // Disable the save button until we're done.\n\n\n this.saving = true;\n const showConfig = show.config;\n const data = {\n config: {\n aliases: showConfig.aliases,\n defaultEpisodeStatus: showConfig.defaultEpisodeStatus,\n dvdOrder: showConfig.dvdOrder,\n seasonFolders: showConfig.seasonFolders,\n anime: showConfig.anime,\n scene: showConfig.scene,\n sports: showConfig.sports,\n paused: showConfig.paused,\n location: showConfig.location,\n airByDate: showConfig.airByDate,\n subtitlesEnabled: showConfig.subtitlesEnabled,\n release: {\n requiredWords: showConfig.release.requiredWords,\n ignoredWords: showConfig.release.ignoredWords,\n requiredWordsExclude: showConfig.release.requiredWordsExclude,\n ignoredWordsExclude: showConfig.release.ignoredWordsExclude\n },\n qualities: {\n preferred: showConfig.qualities.preferred,\n allowed: showConfig.qualities.allowed\n },\n airdateOffset: showConfig.airdateOffset\n },\n language: show.language\n };\n\n if (data.config.anime) {\n data.config.release.blacklist = showConfig.release.blacklist;\n data.config.release.whitelist = showConfig.release.whitelist;\n }\n\n const {\n indexer,\n id,\n setShow\n } = this;\n\n try {\n await setShow({\n indexer,\n id,\n data\n });\n this.$snotify.success('You may need to \"Re-scan files\" or \"Force Full Update\".', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error(`Error while trying to save ${this.show.title}: ${error.message || 'Unknown'}`, 'Error');\n } finally {\n // Re-enable the save button.\n this.saving = false;\n }\n },\n\n onChangeIgnoredWords(items) {\n this.show.config.release.ignoredWords = items.map(item => item.value);\n },\n\n onChangeRequiredWords(items) {\n this.show.config.release.requiredWords = items.map(item => item.value);\n },\n\n onChangeReleaseGroupsAnime(groupNames) {\n this.show.config.release.whitelist = groupNames.whitelist;\n this.show.config.release.blacklist = groupNames.blacklist;\n },\n\n updateLanguage(value) {\n this.show.language = value;\n },\n\n changeFormat(value, formatOption) {\n this.show.config[formatOption] = value;\n\n if (value) {\n // Check each format option, disable the other options.\n ['anime', 'sports', 'airByDate'].filter(item => item !== formatOption).forEach(option => {\n this.show.config[option] = false;\n });\n }\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/edit-show.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-nav-tabs/dist/vue-tabs.js */ \"./node_modules/vue-nav-tabs/dist/vue-tabs.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./anidb-release-group-ui.vue */ \"./src/components/anidb-release-group-ui.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\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//\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//\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//\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//\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//\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//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'edit-show',\n components: {\n AnidbReleaseGroupUi: _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"AppLink\"],\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n ConfigSceneExceptions: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"ConfigSceneExceptions\"],\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"ConfigTemplate\"],\n ConfigTextboxNumber: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"ConfigTextboxNumber\"],\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"ConfigToggleSlider\"],\n FileBrowser: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"FileBrowser\"],\n LanguageSelect: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"LanguageSelect\"],\n QualityChooser: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"QualityChooser\"],\n SelectList: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"SelectList\"],\n VueTabs: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2__[\"VueTabs\"],\n VTab: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2__[\"VTab\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n props: {\n /**\n * Show indexer\n */\n showIndexer: {\n type: String\n },\n\n /**\n * Show id\n */\n showId: {\n type: Number\n }\n },\n\n data() {\n return {\n saving: false,\n loadError: null\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n indexers: state => state.config.indexers,\n layout: state => state.config.layout,\n episodeStatuses: state => state.config.consts.statuses,\n search: state => state.config.search\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n show: 'getCurrentShow',\n getStatus: 'getStatus'\n }),\n\n indexer() {\n return this.showIndexer || this.$route.query.indexername;\n },\n\n id() {\n return this.showId || Number(this.$route.query.seriesid) || undefined;\n },\n\n showLoaded() {\n return Boolean(this.show.id.slug);\n },\n\n defaultEpisodeStatusOptions() {\n if (this.episodeStatuses.length === 0) {\n return [];\n } // Get status objects, in this order\n\n\n return ['wanted', 'skipped', 'ignored'].map(key => this.getStatus({\n key\n }));\n },\n\n availableLanguages() {\n if (this.indexers.main.validLanguages) {\n return this.indexers.main.validLanguages.join(',');\n }\n\n return '';\n },\n\n combinedQualities() {\n const {\n allowed,\n preferred\n } = this.show.config.qualities;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__[\"combineQualities\"])(allowed, preferred);\n },\n\n saveButton() {\n return this.saving === false ? 'Save Changes' : 'Saving...';\n },\n\n globalIgnored() {\n const {\n search\n } = this;\n return search.filters.ignored.map(x => x.toLowerCase());\n },\n\n globalRequired() {\n const {\n search\n } = this;\n return search.filters.required.map(x => x.toLowerCase());\n },\n\n effectiveIgnored() {\n const {\n globalIgnored\n } = this;\n const showIgnored = this.show.config.release.ignoredWords.map(x => x.toLowerCase());\n\n if (this.show.config.release.ignoredWordsExclude) {\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__[\"arrayExclude\"])(globalIgnored, showIgnored);\n }\n\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__[\"arrayUnique\"])(globalIgnored.concat(showIgnored));\n },\n\n effectiveRequired() {\n const {\n globalRequired\n } = this;\n const showRequired = this.show.config.release.requiredWords.map(x => x.toLowerCase());\n\n if (this.show.config.release.requiredWordsExclude) {\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__[\"arrayExclude\"])(globalRequired, showRequired);\n }\n\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__[\"arrayUnique\"])(globalRequired.concat(showRequired));\n }\n\n },\n\n created() {\n this.loadShow();\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])(['getShow', 'setShow', 'setCurrentShow']),\n\n loadShow() {\n const {\n setCurrentShow,\n id,\n indexer,\n getShow\n } = this; // Let's tell the store which show we currently want as current.\n\n setCurrentShow({\n indexer,\n id\n }); // We need detailed info for the xem / scene exceptions, so let's get it.\n\n getShow({\n id,\n indexer,\n detailed: true\n });\n },\n\n async saveShow(subject) {\n const {\n show,\n showLoaded\n } = this; // We want to wait until the page has been fully loaded, before starting to save stuff.\n\n if (!showLoaded) {\n return;\n }\n\n if (!['show', 'all'].includes(subject)) {\n return;\n } // Disable the save button until we're done.\n\n\n this.saving = true;\n const showConfig = show.config;\n const data = {\n config: {\n aliases: showConfig.aliases,\n defaultEpisodeStatus: showConfig.defaultEpisodeStatus,\n dvdOrder: showConfig.dvdOrder,\n seasonFolders: showConfig.seasonFolders,\n anime: showConfig.anime,\n scene: showConfig.scene,\n sports: showConfig.sports,\n paused: showConfig.paused,\n location: showConfig.location,\n airByDate: showConfig.airByDate,\n subtitlesEnabled: showConfig.subtitlesEnabled,\n release: {\n requiredWords: showConfig.release.requiredWords,\n ignoredWords: showConfig.release.ignoredWords,\n requiredWordsExclude: showConfig.release.requiredWordsExclude,\n ignoredWordsExclude: showConfig.release.ignoredWordsExclude\n },\n qualities: {\n preferred: showConfig.qualities.preferred,\n allowed: showConfig.qualities.allowed\n },\n airdateOffset: showConfig.airdateOffset\n },\n language: show.language\n };\n\n if (data.config.anime) {\n data.config.release.blacklist = showConfig.release.blacklist;\n data.config.release.whitelist = showConfig.release.whitelist;\n }\n\n const {\n indexer,\n id,\n setShow\n } = this;\n\n try {\n await setShow({\n indexer,\n id,\n data\n });\n this.$snotify.success('You may need to \"Re-scan files\" or \"Force Full Update\".', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error(`Error while trying to save ${this.show.title}: ${error.message || 'Unknown'}`, 'Error');\n } finally {\n // Re-enable the save button.\n this.saving = false;\n }\n },\n\n onChangeIgnoredWords(items) {\n this.show.config.release.ignoredWords = items.map(item => item.value);\n },\n\n onChangeRequiredWords(items) {\n this.show.config.release.requiredWords = items.map(item => item.value);\n },\n\n onChangeReleaseGroupsAnime(groupNames) {\n this.show.config.release.whitelist = groupNames.whitelist;\n this.show.config.release.blacklist = groupNames.blacklist;\n },\n\n updateLanguage(value) {\n this.show.language = value;\n },\n\n changeFormat(value, formatOption) {\n this.show.config[formatOption] = value;\n\n if (value) {\n // Check each format option, disable the other options.\n ['anime', 'sports', 'airByDate'].filter(item => item !== formatOption).forEach(option => {\n this.show.config[option] = false;\n });\n }\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/edit-show.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -176,7 +176,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../router */ \"./src/router/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'app-link',\n props: {\n to: [String, Object],\n href: String,\n indexerId: {\n type: String\n },\n placeholder: {\n type: String,\n default: 'indexer-to-name'\n }\n },\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])(['config']),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])(['indexerIdToName']),\n\n indexerName() {\n // Returns `undefined` if not found\n const {\n indexerId,\n indexerIdToName\n } = this;\n return indexerIdToName(indexerId);\n },\n\n computedBase() {\n return document.querySelector('base').getAttribute('href');\n },\n\n computedHref() {\n const {\n href,\n indexerId,\n placeholder,\n indexerName\n } = this;\n\n if (indexerId && placeholder) {\n return href.replace(placeholder, indexerName);\n }\n\n return href;\n },\n\n isIRC() {\n if (!this.computedHref) {\n return;\n }\n\n return this.computedHref.startsWith('irc://');\n },\n\n isAbsolute() {\n const href = this.computedHref;\n\n if (!href) {\n return;\n }\n\n return /^[a-z][\\d+.a-z-]*:/.test(href);\n },\n\n isExternal() {\n const base = this.computedBase;\n const href = this.computedHref;\n\n if (!href) {\n return;\n }\n\n return !href.startsWith(base) && !href.startsWith('webcal://');\n },\n\n isHashPath() {\n if (!this.computedHref) {\n return;\n }\n\n return this.computedHref.startsWith('#');\n },\n\n anonymisedHref() {\n const {\n anonRedirect\n } = this.config;\n const href = this.computedHref;\n\n if (!href) {\n return;\n }\n\n return anonRedirect ? anonRedirect + href : href;\n },\n\n matchingVueRoute() {\n const {\n isAbsolute,\n isExternal,\n computedHref\n } = this;\n\n if (isAbsolute && isExternal) {\n return;\n }\n\n const {\n route\n } = _router__WEBPACK_IMPORTED_MODULE_1__[\"default\"].resolve(_router__WEBPACK_IMPORTED_MODULE_1__[\"base\"] + computedHref);\n\n if (!route.name) {\n return;\n }\n\n return route;\n },\n\n linkProperties() {\n const {\n to,\n isIRC,\n isAbsolute,\n isExternal,\n isHashPath,\n anonymisedHref,\n matchingVueRoute\n } = this;\n const base = this.computedBase;\n const href = this.computedHref; // Return normal router-link\n\n if (to) {\n return {\n is: 'router-link',\n to\n };\n } // Just return a boring link with other attrs\n // @NOTE: This is for scroll anchors as it uses the id\n\n\n if (!href) {\n return {\n is: 'a',\n // Only tag this as a \"false-link\" if we passed a name in the props\n falseLink: Boolean(this.$attrs.name) || undefined\n };\n } // If current page and next page are both vue routes return router-link\n\n\n if (matchingVueRoute && this.$route && matchingVueRoute.meta.converted && this.$route.meta.converted) {\n // Allows us to skip when we're in a test\n if (window.loadMainApp) {\n return {\n is: 'router-link',\n to: matchingVueRoute.fullPath,\n // Add a `href` attribute to enable native mouse navigation (middle click, ctrl+click, etc.)\n href: new URL(matchingVueRoute.fullPath, base).href\n };\n }\n }\n\n return {\n is: 'a',\n target: isAbsolute && isExternal ? '_blank' : '_self',\n href: (() => {\n if (isHashPath) {\n const {\n location\n } = window;\n\n if (location.hash.length === 0) {\n // Current location might be `url#`\n const newHash = location.href.endsWith('#') ? href.slice(1) : href;\n return location.href + newHash;\n }\n\n return location.href.replace(location.hash, '') + href;\n }\n\n if (isIRC) {\n return href;\n }\n\n if (isAbsolute) {\n if (isExternal) {\n return anonymisedHref;\n }\n\n return href;\n }\n\n return new URL(href, base).href;\n })(),\n rel: isAbsolute && isExternal ? 'noreferrer' : undefined\n };\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/app-link.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../router */ \"./src/router/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'app-link',\n props: {\n to: [String, Object],\n href: String,\n indexerId: {\n type: String\n },\n placeholder: {\n type: String,\n default: 'indexer-to-name'\n }\n },\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n general: state => state.config.general\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])(['indexerIdToName']),\n\n indexerName() {\n // Returns `undefined` if not found\n const {\n indexerId,\n indexerIdToName\n } = this;\n return indexerIdToName(indexerId);\n },\n\n computedBase() {\n return document.querySelector('base').getAttribute('href');\n },\n\n computedHref() {\n const {\n href,\n indexerId,\n placeholder,\n indexerName\n } = this;\n\n if (indexerId && placeholder) {\n return href.replace(placeholder, indexerName);\n }\n\n return href;\n },\n\n isIRC() {\n if (!this.computedHref) {\n return;\n }\n\n return this.computedHref.startsWith('irc://');\n },\n\n isAbsolute() {\n const href = this.computedHref;\n\n if (!href) {\n return;\n }\n\n return /^[a-z][\\d+.a-z-]*:/.test(href);\n },\n\n isExternal() {\n const base = this.computedBase;\n const href = this.computedHref;\n\n if (!href) {\n return;\n }\n\n return !href.startsWith(base) && !href.startsWith('webcal://');\n },\n\n isHashPath() {\n if (!this.computedHref) {\n return;\n }\n\n return this.computedHref.startsWith('#');\n },\n\n anonymisedHref() {\n const {\n anonRedirect\n } = this.general;\n const href = this.computedHref;\n\n if (!href) {\n return;\n }\n\n return anonRedirect ? anonRedirect + href : href;\n },\n\n matchingVueRoute() {\n const {\n isAbsolute,\n isExternal,\n computedHref\n } = this;\n\n if (isAbsolute && isExternal) {\n return;\n }\n\n const {\n route\n } = _router__WEBPACK_IMPORTED_MODULE_1__[\"default\"].resolve(_router__WEBPACK_IMPORTED_MODULE_1__[\"base\"] + computedHref);\n\n if (!route.name) {\n return;\n }\n\n return route;\n },\n\n linkProperties() {\n const {\n to,\n isIRC,\n isAbsolute,\n isExternal,\n isHashPath,\n anonymisedHref,\n matchingVueRoute\n } = this;\n const base = this.computedBase;\n const href = this.computedHref; // Return normal router-link\n\n if (to) {\n return {\n is: 'router-link',\n to\n };\n } // Just return a boring link with other attrs\n // @NOTE: This is for scroll anchors as it uses the id\n\n\n if (!href) {\n return {\n is: 'a',\n // Only tag this as a \"false-link\" if we passed a name in the props\n falseLink: Boolean(this.$attrs.name) || undefined\n };\n } // If current page and next page are both vue routes return router-link\n\n\n if (matchingVueRoute && this.$route && matchingVueRoute.meta.converted && this.$route.meta.converted) {\n // Allows us to skip when we're in a test\n if (window.loadMainApp) {\n return {\n is: 'router-link',\n to: matchingVueRoute.fullPath,\n // Add a `href` attribute to enable native mouse navigation (middle click, ctrl+click, etc.)\n href: new URL(matchingVueRoute.fullPath, base).href\n };\n }\n }\n\n return {\n is: 'a',\n target: isAbsolute && isExternal ? '_blank' : '_self',\n href: (() => {\n if (isHashPath) {\n const {\n location\n } = window;\n\n if (location.hash.length === 0) {\n // Current location might be `url#`\n const newHash = location.href.endsWith('#') ? href.slice(1) : href;\n return location.href + newHash;\n }\n\n return location.href.replace(location.hash, '') + href;\n }\n\n if (isIRC) {\n return href;\n }\n\n if (isAbsolute) {\n if (isExternal) {\n return anonymisedHref;\n }\n\n return href;\n }\n\n return new URL(href, base).href;\n })(),\n rel: isAbsolute && isExternal ? 'noreferrer' : undefined\n };\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/app-link.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -188,7 +188,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _app_link_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./app-link.vue */ \"./src/components/helpers/app-link.vue\");\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'asset',\n components: {\n AppLink: _app_link_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n },\n props: {\n showSlug: {\n type: String\n },\n type: {\n type: String,\n required: true\n },\n default: {\n type: String,\n required: true\n },\n link: {\n type: Boolean,\n default: false\n },\n cls: {\n type: String\n },\n imgWidth: {\n type: Number\n },\n lazy: {\n type: Boolean\n }\n },\n\n data() {\n return {\n error: false\n };\n },\n\n computed: {\n src() {\n const {\n lazy,\n error,\n showSlug,\n type\n } = this;\n\n if (error || !showSlug || !type) {\n return this.default;\n }\n\n if (!lazy) {\n return _api__WEBPACK_IMPORTED_MODULE_0__[\"webRoot\"] + '/api/v2/series/' + showSlug + '/asset/' + type + '?api_key=' + _api__WEBPACK_IMPORTED_MODULE_0__[\"apiKey\"];\n }\n\n return this.default;\n },\n\n href() {\n // Compute a link to the full asset, if applicable\n if (this.link) {\n return this.src.replace('Thumb', '');\n }\n\n return undefined;\n },\n\n newCls() {\n const {\n cls,\n imgWidth\n } = this;\n let newClass = cls;\n\n if (imgWidth) {\n newClass += ` width-${imgWidth}`;\n }\n\n return newClass;\n },\n\n dataSrc() {\n const {\n lazy,\n error,\n showSlug,\n type\n } = this;\n\n if (error || !showSlug || !type) {\n return this.default;\n }\n\n if (lazy) {\n return _api__WEBPACK_IMPORTED_MODULE_0__[\"webRoot\"] + '/api/v2/series/' + showSlug + '/asset/' + type + '?api_key=' + _api__WEBPACK_IMPORTED_MODULE_0__[\"apiKey\"];\n }\n\n return '';\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/asset.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _app_link_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./app-link.vue */ \"./src/components/helpers/app-link.vue\");\n/* harmony import */ var _lazy_image_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lazy-image.vue */ \"./src/components/helpers/lazy-image.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'asset',\n components: {\n AppLink: _app_link_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n LazyImage: _lazy_image_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n },\n props: {\n showSlug: {\n type: String\n },\n type: {\n type: String,\n required: true\n },\n defaultSrc: {\n type: String,\n required: true\n },\n link: {\n type: Boolean,\n default: false\n },\n cls: {\n type: String\n },\n imgWidth: {\n type: Number\n },\n lazy: Boolean\n },\n\n data() {\n return {\n error: false\n };\n },\n\n computed: {\n src() {\n const {\n defaultSrc,\n error,\n showSlug,\n type\n } = this;\n\n if (error || !showSlug || !type) {\n return defaultSrc;\n }\n\n return `${_api__WEBPACK_IMPORTED_MODULE_0__[\"webRoot\"]}/api/v2/series/${showSlug}/asset/${type}?api_key=${_api__WEBPACK_IMPORTED_MODULE_0__[\"apiKey\"]}`;\n },\n\n href() {\n const {\n link,\n src\n } = this; // Compute a link to the full asset, if applicable\n\n if (link) {\n return src.replace('Thumb', '');\n }\n\n return undefined;\n },\n\n newCls() {\n const {\n cls,\n imgWidth\n } = this;\n let newClass = cls;\n\n if (imgWidth) {\n newClass += ` width-${imgWidth}`;\n }\n\n return newClass;\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/asset.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -276,6 +276,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ }), +/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./src/components/helpers/lazy-image.vue?vue&type=script&lang=js&": +/*!******************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options!./src/components/helpers/lazy-image.vue?vue&type=script&lang=js& ***! + \******************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var lozad__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lozad */ \"./node_modules/lozad/dist/lozad.min.js\");\n/* harmony import */ var lozad__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lozad__WEBPACK_IMPORTED_MODULE_0__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'lazy-image',\n props: {\n height: {\n type: Number,\n default: null\n },\n lazySrc: {\n type: String,\n default: null\n },\n lazySrcset: {\n type: String,\n default: null\n },\n lazyDefaultSrc: {\n type: String,\n default: null\n },\n lazyCls: {\n type: String,\n default: ''\n },\n width: {\n type: Number,\n default: null\n }\n },\n\n data() {\n return {\n loading: true,\n error: false\n };\n },\n\n computed: {\n aspectRatio() {\n // Calculate the aspect ratio of the image\n // if the width and the height are given.\n if (!this.width || !this.height) {\n return null;\n }\n\n return this.height / this.width * 100;\n },\n\n style() {\n const style = {};\n\n if (this.width) {\n style.width = `${this.width}px`;\n } // If the image is still loading and an\n // aspect ratio could be calculated, we\n // apply the calculated aspect ratio by\n // using padding top.\n\n\n const applyAspectRatio = this.loading && this.aspectRatio;\n\n if (applyAspectRatio) {\n // Prevent flash of unstyled image\n // after the image is loaded.\n style.height = 0; // Scale the image container according\n // to the aspect ratio.\n\n style.paddingTop = `${this.aspectRatio}%`;\n }\n\n return style;\n }\n\n },\n\n mounted() {\n // As soon as the element triggers\n // the `load` event, the loading state is\n // set to `false`, which removes the apsect\n // ratio we've applied earlier.\n const setLoadingState = () => {\n this.loading = false;\n };\n\n this.$el.addEventListener('load', setLoadingState); // We remove the event listener as soon as\n // the component is destroyed to prevent\n // potential memory leaks.\n\n this.$once('hook:destroyed', () => {\n this.$el.removeEventListener('load', setLoadingState);\n }); // We initialize Lozad.js on the root\n // element of our component.\n\n const observer = lozad__WEBPACK_IMPORTED_MODULE_0___default()(this.$el, {\n loaded: el => {\n el.classList.add('loaded');\n const img = new Image();\n img.src = el.getAttribute('data-src');\n img.addEventListener('error', () => {\n el.classList.add('error');\n\n if (this.lazyDefaultSrc) {\n el.setAttribute('src', this.lazyDefaultSrc);\n }\n }, false);\n }\n });\n observer.observe();\n },\n\n methods: {\n observe() {\n // We initialize Lozad.js on the root\n // element of our component.\n const observer = lozad__WEBPACK_IMPORTED_MODULE_0___default()(this.$el);\n observer.observe();\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/lazy-image.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./src/components/helpers/load-progress-bar.vue?vue&type=script&lang=js&": /*!*************************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options!./src/components/helpers/load-progress-bar.vue?vue&type=script&lang=js& ***! @@ -320,7 +332,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var v_to /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'poster-size-slider',\n props: {\n min: {\n type: Number,\n default: 75\n },\n max: {\n type: Number,\n default: 250\n }\n },\n\n mounted() {\n const {\n setPosterSize,\n min,\n max\n } = this; // Get poster size from localStorage\n\n let slidePosterSize;\n\n if (typeof Storage !== 'undefined') {\n slidePosterSize = Number.parseInt(localStorage.getItem('posterSize'), 10);\n }\n\n if (typeof slidePosterSize !== 'number' || Number.isNaN(slidePosterSize)) {\n slidePosterSize = 188;\n } // Update poster size to store\n\n\n setPosterSize({\n posterSize: slidePosterSize\n });\n $(this.$el).find('#posterSizeSlider').slider({\n min,\n max,\n value: slidePosterSize,\n\n change(e, ui) {\n // Save to localStorage\n if (typeof Storage !== 'undefined') {\n localStorage.setItem('posterSize', ui.value);\n } // Save to store\n\n\n setPosterSize({\n posterSize: ui.value\n });\n }\n\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setPosterSize: 'setPosterSize'\n })\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/helpers/poster-size-slider.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'poster-size-slider',\n props: {\n min: {\n type: Number,\n default: 75\n },\n max: {\n type: Number,\n default: 250\n }\n },\n\n mounted() {\n const {\n setLayoutLocal,\n min,\n max\n } = this; // Get poster size from localStorage\n\n let slidePosterSize;\n\n if (typeof Storage !== 'undefined') {\n slidePosterSize = Number.parseInt(localStorage.getItem('posterSize'), 10);\n }\n\n if (typeof slidePosterSize !== 'number' || Number.isNaN(slidePosterSize)) {\n slidePosterSize = 188;\n } // Update poster size to store\n\n\n setLayoutLocal({\n key: 'posterSize',\n value: slidePosterSize\n });\n $(this.$el).find('#posterSizeSlider').slider({\n min,\n max,\n value: slidePosterSize,\n\n change(e, ui) {\n // Save to localStorage\n if (typeof Storage !== 'undefined') {\n localStorage.setItem('posterSize', ui.value);\n } // Save to store\n\n\n setLayoutLocal({\n key: 'posterSize',\n value: ui.value\n });\n }\n\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setLayoutLocal: 'setLayoutLocal'\n })\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/helpers/poster-size-slider.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -344,7 +356,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n/* ha /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _app_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./app-link */ \"./src/components/helpers/app-link.vue\");\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//\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//\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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'quality-chooser',\n components: {\n AppLink: _app_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n },\n props: {\n overallQuality: {\n type: Number,\n default: window.qualityChooserInitialQuality\n },\n keep: {\n type: String,\n default: null,\n validator: value => ['keep', 'show'].includes(value)\n },\n showSlug: {\n type: String\n }\n },\n\n data() {\n return {\n // eslint-disable-next-line no-warning-comments\n lock: false,\n // FIXME: Remove this hack, see `watch.overallQuality` below\n allowedQualities: [],\n preferredQualities: [],\n curQualityPreset: null,\n archive: false,\n archivedStatus: '',\n archiveButton: {\n text: 'Archive episodes',\n disabled: false\n }\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n qualityValues: state => state.consts.qualities.values,\n qualityPresets: state => state.consts.qualities.presets,\n defaultQuality: state => state.config.showDefaults.quality\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])(['getQualityPreset', 'splitQuality']),\n\n initialQuality() {\n return this.overallQuality === undefined ? this.defaultQuality : this.overallQuality;\n },\n\n selectedQualityPreset: {\n get() {\n return this.curQualityPreset;\n },\n\n set(newValue) {\n const {\n curQualityPreset,\n setQualityFromPreset\n } = this; // If an array was provided - initial or update from parent: [newPreset, oldPreset]\n // If a single value was provided - updated using select box: [newPreset, currentPreset]\n\n const [newPreset, currentPreset] = Array.isArray(newValue) ? newValue : [newValue, curQualityPreset];\n setQualityFromPreset(newPreset, currentPreset);\n this.curQualityPreset = newPreset;\n }\n\n },\n\n explanation() {\n const {\n allowedQualities,\n preferredQualities,\n qualityValues\n } = this;\n return qualityValues.reduce((result, {\n value,\n name\n }) => {\n const isPreferred = preferredQualities.includes(value); // If this quality is preferred but not allowed, add it to allowed\n\n if (allowedQualities.includes(value) || isPreferred) {\n result.allowed.push(name);\n }\n\n if (isPreferred) {\n result.preferred.push(name);\n }\n\n return result;\n }, {\n allowed: [],\n preferred: []\n });\n },\n\n validQualities() {\n return this.qualityValues.filter(({\n key\n }) => key !== 'na');\n }\n\n },\n asyncComputed: {\n async backloggedEpisodes() {\n const {\n showSlug,\n allowedQualities,\n preferredQualities\n } = this; // Skip if no showSlug, as that means we're on a addShow page\n\n if (!showSlug) {\n return null;\n } // Skip if no qualities are selected\n\n\n if (allowedQualities.length + preferredQualities.length === 0) {\n return null;\n }\n\n const url = `series/${showSlug}/legacy/backlogged`;\n const params = {\n allowed: allowedQualities.join(','),\n preferred: preferredQualities.join(',')\n };\n let status = false; // Set to `false` for red text, `true` for normal color\n\n let response;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(url, {\n params\n });\n } catch (error) {\n return {\n status,\n html: 'Failed to get backlog prediction
' + String(error)\n };\n }\n\n const newBacklogged = response.data.new;\n const existingBacklogged = response.data.existing;\n const variation = Math.abs(newBacklogged - existingBacklogged);\n let html = 'Current backlog: ' + existingBacklogged + ' episodes
';\n\n if (newBacklogged === -1 || existingBacklogged === -1) {\n html = 'No qualities selected';\n } else if (newBacklogged === existingBacklogged) {\n html += \"This change won't affect your backlogged episodes\";\n status = true;\n } else {\n html += '
New backlog: ' + newBacklogged + ' episodes';\n html += '
';\n let change = '';\n\n if (newBacklogged > existingBacklogged) {\n html += 'WARNING: ';\n change = 'increase'; // Only show the archive action div if we have backlog increase\n\n this.archive = true;\n } else {\n change = 'decrease';\n }\n\n html += 'Backlog will ' + change + ' by ' + variation + ' episodes.';\n }\n\n return {\n status,\n html\n };\n }\n\n },\n\n mounted() {\n this.setInitialPreset(this.initialQuality);\n },\n\n methods: {\n isQualityPreset(quality) {\n return this.getQualityPreset({\n value: quality\n }) !== undefined;\n },\n\n setInitialPreset(preset) {\n const {\n isQualityPreset,\n keep\n } = this;\n const newPreset = keep === 'keep' ? 'keep' : isQualityPreset(preset) ? preset : 0;\n this.selectedQualityPreset = [newPreset, preset];\n },\n\n async archiveEpisodes() {\n this.archivedStatus = 'Archiving...';\n const url = `series/${this.showSlug}/operation`;\n const response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].post(url, {\n type: 'ARCHIVE_EPISODES'\n });\n\n if (response.status === 201) {\n this.archivedStatus = 'Successfully archived episodes'; // Recalculate backlogged episodes after we archive it\n\n this.$asyncComputed.backloggedEpisodes.update();\n } else if (response.status === 204) {\n this.archivedStatus = 'No episodes to be archived';\n } // Restore button text\n\n\n this.archiveButton.text = 'Finished';\n this.archiveButton.disabled = true;\n },\n\n setQualityFromPreset(preset, oldPreset) {\n // If empty skip\n if (preset === undefined || preset === null) {\n return;\n } // [Mass Edit] If changing to/from `keep`, restore the original value\n\n\n if ([preset, oldPreset].some(val => val === 'keep')) {\n preset = this.initialQuality; // If preset is custom, set to last preset (provided it's not null)\n } else if ((preset === 0 || !this.isQualityPreset(preset)) && oldPreset !== null) {\n preset = oldPreset;\n }\n\n const {\n allowed,\n preferred\n } = this.splitQuality(preset);\n this.allowedQualities = allowed;\n this.preferredQualities = preferred;\n }\n\n },\n watch: {\n // eslint-disable-next-line no-warning-comments\n\n /*\n FIXME: Remove this watch and the `this.lock` hack.\n This is causing the preset selector to change from `Custom` to a preset,\n when the correct qualities for that preset are selected.\n */\n overallQuality(newValue) {\n if (!this.lock) {\n this.setInitialPreset(newValue);\n }\n },\n\n /* eslint-disable no-warning-comments */\n allowedQualities(newQuality) {\n // Deselecting all allowed qualities clears the preferred selection\n if (newQuality.length === 0 && this.preferredQualities.length > 0) {\n this.preferredQualities = [];\n }\n\n this.lock = true; // FIXME: Remove this hack, see above\n\n this.$emit('update:quality:allowed', newQuality); // FIXME: Remove this hack, see above\n\n this.$nextTick(() => {\n this.lock = false;\n });\n },\n\n preferredQualities(newQuality) {\n this.lock = true; // FIXME: Remove this hack, see above\n\n this.$emit('update:quality:preferred', newQuality); // FIXME: Remove this hack, see above\n\n this.$nextTick(() => {\n this.lock = false;\n });\n }\n /* eslint-enable no-warning-comments */\n\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/quality-chooser.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _app_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./app-link */ \"./src/components/helpers/app-link.vue\");\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//\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//\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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'quality-chooser',\n components: {\n AppLink: _app_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n },\n props: {\n overallQuality: {\n type: Number,\n default: window.qualityChooserInitialQuality\n },\n keep: {\n type: String,\n default: null,\n validator: value => ['keep', 'show'].includes(value)\n },\n showSlug: {\n type: String\n }\n },\n\n data() {\n return {\n // eslint-disable-next-line no-warning-comments\n lock: false,\n // FIXME: Remove this hack, see `watch.overallQuality` below\n allowedQualities: [],\n preferredQualities: [],\n curQualityPreset: null,\n archive: false,\n archivedStatus: '',\n archiveButton: {\n text: 'Archive episodes',\n disabled: false\n }\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n qualityValues: state => state.config.consts.qualities.values,\n qualityPresets: state => state.config.consts.qualities.presets,\n defaultQuality: state => state.config.general.showDefaults.quality\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])(['getQualityPreset', 'splitQuality']),\n\n initialQuality() {\n return this.overallQuality === undefined ? this.defaultQuality : this.overallQuality;\n },\n\n selectedQualityPreset: {\n get() {\n return this.curQualityPreset;\n },\n\n set(newValue) {\n const {\n curQualityPreset,\n setQualityFromPreset\n } = this; // If an array was provided - initial or update from parent: [newPreset, oldPreset]\n // If a single value was provided - updated using select box: [newPreset, currentPreset]\n\n const [newPreset, currentPreset] = Array.isArray(newValue) ? newValue : [newValue, curQualityPreset];\n setQualityFromPreset(newPreset, currentPreset);\n this.curQualityPreset = newPreset;\n }\n\n },\n\n explanation() {\n const {\n allowedQualities,\n preferredQualities,\n qualityValues\n } = this;\n return qualityValues.reduce((result, {\n value,\n name\n }) => {\n const isPreferred = preferredQualities.includes(value); // If this quality is preferred but not allowed, add it to allowed\n\n if (allowedQualities.includes(value) || isPreferred) {\n result.allowed.push(name);\n }\n\n if (isPreferred) {\n result.preferred.push(name);\n }\n\n return result;\n }, {\n allowed: [],\n preferred: []\n });\n },\n\n validQualities() {\n return this.qualityValues.filter(({\n key\n }) => key !== 'na');\n }\n\n },\n asyncComputed: {\n async backloggedEpisodes() {\n const {\n showSlug,\n allowedQualities,\n preferredQualities\n } = this; // Skip if no showSlug, as that means we're on a addShow page\n\n if (!showSlug) {\n return null;\n } // Skip if no qualities are selected\n\n\n if (allowedQualities.length + preferredQualities.length === 0) {\n return null;\n }\n\n const url = `series/${showSlug}/legacy/backlogged`;\n const params = {\n allowed: allowedQualities.join(','),\n preferred: preferredQualities.join(',')\n };\n let status = false; // Set to `false` for red text, `true` for normal color\n\n let response;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(url, {\n params\n });\n } catch (error) {\n return {\n status,\n html: 'Failed to get backlog prediction
' + String(error)\n };\n }\n\n const newBacklogged = response.data.new;\n const existingBacklogged = response.data.existing;\n const variation = Math.abs(newBacklogged - existingBacklogged);\n let html = 'Current backlog: ' + existingBacklogged + ' episodes
';\n\n if (newBacklogged === -1 || existingBacklogged === -1) {\n html = 'No qualities selected';\n } else if (newBacklogged === existingBacklogged) {\n html += \"This change won't affect your backlogged episodes\";\n status = true;\n } else {\n html += '
New backlog: ' + newBacklogged + ' episodes';\n html += '
';\n let change = '';\n\n if (newBacklogged > existingBacklogged) {\n html += 'WARNING: ';\n change = 'increase'; // Only show the archive action div if we have backlog increase\n\n this.archive = true;\n } else {\n change = 'decrease';\n }\n\n html += 'Backlog will ' + change + ' by ' + variation + ' episodes.';\n }\n\n return {\n status,\n html\n };\n }\n\n },\n\n mounted() {\n this.setInitialPreset(this.initialQuality);\n },\n\n methods: {\n isQualityPreset(quality) {\n return this.getQualityPreset({\n value: quality\n }) !== undefined;\n },\n\n setInitialPreset(preset) {\n const {\n isQualityPreset,\n keep\n } = this;\n const newPreset = keep === 'keep' ? 'keep' : isQualityPreset(preset) ? preset : 0;\n this.selectedQualityPreset = [newPreset, preset];\n },\n\n async archiveEpisodes() {\n this.archivedStatus = 'Archiving...';\n const url = `series/${this.showSlug}/operation`;\n const response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].post(url, {\n type: 'ARCHIVE_EPISODES'\n });\n\n if (response.status === 201) {\n this.archivedStatus = 'Successfully archived episodes'; // Recalculate backlogged episodes after we archive it\n\n this.$asyncComputed.backloggedEpisodes.update();\n } else if (response.status === 204) {\n this.archivedStatus = 'No episodes to be archived';\n } // Restore button text\n\n\n this.archiveButton.text = 'Finished';\n this.archiveButton.disabled = true;\n },\n\n setQualityFromPreset(preset, oldPreset) {\n // If empty skip\n if (preset === undefined || preset === null) {\n return;\n } // [Mass Edit] If changing to/from `keep`, restore the original value\n\n\n if ([preset, oldPreset].some(val => val === 'keep')) {\n preset = this.initialQuality; // If preset is custom, set to last preset (provided it's not null)\n } else if ((preset === 0 || !this.isQualityPreset(preset)) && oldPreset !== null) {\n preset = oldPreset;\n }\n\n const {\n allowed,\n preferred\n } = this.splitQuality(preset);\n this.allowedQualities = allowed;\n this.preferredQualities = preferred;\n }\n\n },\n watch: {\n // eslint-disable-next-line no-warning-comments\n\n /*\n FIXME: Remove this watch and the `this.lock` hack.\n This is causing the preset selector to change from `Custom` to a preset,\n when the correct qualities for that preset are selected.\n */\n overallQuality(newValue) {\n if (!this.lock) {\n this.setInitialPreset(newValue);\n }\n },\n\n /* eslint-disable no-warning-comments */\n allowedQualities(newQuality) {\n // Deselecting all allowed qualities clears the preferred selection\n if (newQuality.length === 0 && this.preferredQualities.length > 0) {\n this.preferredQualities = [];\n }\n\n this.lock = true; // FIXME: Remove this hack, see above\n\n this.$emit('update:quality:allowed', newQuality); // FIXME: Remove this hack, see above\n\n this.$nextTick(() => {\n this.lock = false;\n });\n },\n\n preferredQualities(newQuality) {\n this.lock = true; // FIXME: Remove this hack, see above\n\n this.$emit('update:quality:preferred', newQuality); // FIXME: Remove this hack, see above\n\n this.$nextTick(() => {\n this.lock = false;\n });\n }\n /* eslint-enable no-warning-comments */\n\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/quality-chooser.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -356,7 +368,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'quality-pill',\n props: {\n allowed: {\n type: Array\n },\n preferred: {\n type: Array\n },\n quality: {\n type: Number,\n validator: value => value >>> 0 >= 0 // Unsigned int\n\n },\n showTitle: {\n type: Boolean,\n default: false\n },\n override: {\n type: Object,\n default: () => ({}),\n validator: value => {\n return Object.keys(value).every(key => ['class', 'title', 'text', 'style'].includes(key));\n }\n }\n },\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n qualityValues: state => state.consts.qualities.values\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])(['getQuality', 'getQualityAnySet', 'getQualityPreset', 'splitQuality']),\n\n qualities() {\n const {\n allowed,\n preferred,\n quality,\n splitQuality\n } = this; // Used for Vueified pages as they have the arrays already split\n\n if (allowed && preferred) {\n return {\n allowed,\n preferred\n };\n }\n\n return splitQuality(quality);\n },\n\n title() {\n const {\n override,\n qualities,\n getQuality,\n showTitle\n } = this;\n\n if (override.title) {\n return override.title;\n }\n\n if (!showTitle) {\n return undefined;\n }\n\n const getQualityName = value => getQuality({\n value\n }).name;\n\n let title = '';\n title += 'Allowed Qualities:\\n';\n\n if (qualities.allowed.length === 0) {\n title += ' None';\n } else {\n title += qualities.allowed.map(curQual => ` ${getQualityName(curQual)}`).join('\\n');\n }\n\n title += '\\n\\nPreferred Qualities:\\n';\n\n if (qualities.preferred.length === 0) {\n title += ' None';\n } else {\n title += qualities.preferred.map(curQual => ` ${getQualityName(curQual)}`).join('\\n');\n }\n\n return title;\n },\n\n pill() {\n let {\n quality,\n allowed,\n preferred\n } = this; // Combine allowed & preferred qualities\n\n if (allowed && preferred) {\n quality = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__[\"combineQualities\"])(allowed, preferred);\n } // If allowed and preferred qualities are the same, show pill as allowed quality\n\n\n const sumAllowed = (quality & 0xFFFF) >>> 0; // Unsigned int\n\n const sumPreferred = quality >> 16 >>> 0; // Unsigned int\n\n if (sumAllowed === sumPreferred) {\n quality = sumAllowed;\n }\n\n const matched = // Is quality a preset?\n this.getQualityPreset({\n value: quality\n }) || // Is quality an 'anySet'? (any HDTV, any WEB-DL, any BluRay)\n this.getQualityAnySet({\n value: quality\n }) || // Is quality a specific quality? (720p HDTV, 1080p WEB-DL, etc.)\n this.getQuality({\n value: quality\n });\n\n if (matched !== undefined) {\n return matched;\n }\n\n const customQualitySets = [// All sources are HDTV\n {\n name: 'HDTV',\n key: 'anyhdtv',\n elements: ['hdtv', 'rawhdtv', 'fullhdtv', 'uhd4ktv', 'uhd8ktv']\n }, // All sources are WEB-DL\n {\n name: 'WEB-DL',\n key: 'anywebdl',\n elements: ['hdwebdl', 'fullhdwebdl', 'uhd4kwebdl', 'uhd8kwebdl']\n }, // All sources are BluRay\n {\n name: 'BluRay',\n key: 'anybluray',\n elements: ['hdbluray', 'fullhdbluray', 'uhd4kbluray', 'uhd8kbluray']\n }, // All resolutions are 720p\n {\n name: '720p',\n key: 'hd720p',\n elements: ['hdtv', 'rawhdtv', 'hdwebdl', 'hdbluray']\n }, // All resolutions are 1080p\n {\n name: '1080p',\n key: 'hd1080p',\n elements: ['fullhdtv', 'fullhdwebdl', 'fullhdbluray']\n }, // All resolutions are 4K UHD\n {\n name: 'UHD-4K',\n key: 'anyuhd4k',\n elements: ['uhd4ktv', 'uhd4kwebdl', 'uhd4kbluray']\n }, // All resolutions are 8K UHD\n {\n name: 'UHD-8K',\n key: 'anyuhd8k',\n elements: ['uhd8ktv', 'uhd8kwebdl', 'uhd8kbluray']\n }];\n const {\n isSubsetOf,\n qualities,\n makeQualitySet\n } = this;\n\n for (const {\n name,\n key,\n elements\n } of customQualitySets) {\n const qualitySet = makeQualitySet(elements); // Check if both quality lists match the set.\n\n if (isSubsetOf(qualities.allowed, qualitySet) && isSubsetOf(qualities.preferred, qualitySet)) {\n return {\n name,\n key\n };\n }\n } // These are the fallback values, if none of the checks above matched\n\n\n return {\n key: 'custom',\n name: 'Custom'\n };\n }\n\n },\n methods: {\n /**\n * Make a quality set.\n * @param {string[]} keys - An array of quality keys to add their values to the set.\n * @returns {number[]} An array of the quality values.\n */\n makeQualitySet(keys) {\n return this.qualityValues.reduce((result, {\n key,\n value\n }) => {\n if (keys.includes(key)) {\n return result.concat(value);\n }\n\n return result;\n }, []);\n },\n\n /**\n * Check if all the items of `set1` are items of `set2`.\n * Note that when `set1` is empty, it returns `true`.\n * Assumption: Each array contains unique items only.\n * Source: https://stackoverflow.com/a/48211214/7597273\n *\n * @param {(Number[]|String[])} set1 - Array to be compared against `set2`.\n * @param {(Number[]|String[])} set2 - Array to compare `set1` against.\n * @returns {Boolean} - Whether or not `set1` is a subset of `set2`\n */\n isSubsetOf(set1, set2) {\n return set1.every(value => set2.includes(value));\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/quality-pill.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'quality-pill',\n props: {\n allowed: {\n type: Array\n },\n preferred: {\n type: Array\n },\n quality: {\n type: Number,\n validator: value => value >>> 0 >= 0 // Unsigned int\n\n },\n showTitle: {\n type: Boolean,\n default: false\n },\n override: {\n type: Object,\n default: () => ({}),\n validator: value => {\n return Object.keys(value).every(key => ['class', 'title', 'text', 'style'].includes(key));\n }\n }\n },\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n qualityValues: state => state.config.consts.qualities.values\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])(['getQuality', 'getQualityAnySet', 'getQualityPreset', 'splitQuality']),\n\n qualities() {\n const {\n allowed,\n preferred,\n quality,\n splitQuality\n } = this; // Used for Vueified pages as they have the arrays already split\n\n if (allowed && preferred) {\n return {\n allowed,\n preferred\n };\n }\n\n return splitQuality(quality);\n },\n\n title() {\n const {\n override,\n qualities,\n getQuality,\n showTitle\n } = this;\n\n if (override.title) {\n return override.title;\n }\n\n if (!showTitle) {\n return undefined;\n }\n\n const getQualityName = value => getQuality({\n value\n }).name;\n\n let title = '';\n title += 'Allowed Qualities:\\n';\n\n if (qualities.allowed.length === 0) {\n title += ' None';\n } else {\n title += qualities.allowed.map(curQual => ` ${getQualityName(curQual)}`).join('\\n');\n }\n\n title += '\\n\\nPreferred Qualities:\\n';\n\n if (qualities.preferred.length === 0) {\n title += ' None';\n } else {\n title += qualities.preferred.map(curQual => ` ${getQualityName(curQual)}`).join('\\n');\n }\n\n return title;\n },\n\n pill() {\n let {\n quality,\n allowed,\n preferred\n } = this; // Combine allowed & preferred qualities\n\n if (allowed && preferred) {\n quality = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__[\"combineQualities\"])(allowed, preferred);\n } // If allowed and preferred qualities are the same, show pill as allowed quality\n\n\n const sumAllowed = (quality & 0xFFFF) >>> 0; // Unsigned int\n\n const sumPreferred = quality >> 16 >>> 0; // Unsigned int\n\n if (sumAllowed === sumPreferred) {\n quality = sumAllowed;\n }\n\n const matched = // Is quality a preset?\n this.getQualityPreset({\n value: quality\n }) || // Is quality an 'anySet'? (any HDTV, any WEB-DL, any BluRay)\n this.getQualityAnySet({\n value: quality\n }) || // Is quality a specific quality? (720p HDTV, 1080p WEB-DL, etc.)\n this.getQuality({\n value: quality\n });\n\n if (matched !== undefined) {\n return matched;\n }\n\n const customQualitySets = [// All sources are HDTV\n {\n name: 'HDTV',\n key: 'anyhdtv',\n elements: ['hdtv', 'rawhdtv', 'fullhdtv', 'uhd4ktv', 'uhd8ktv']\n }, // All sources are WEB-DL\n {\n name: 'WEB-DL',\n key: 'anywebdl',\n elements: ['hdwebdl', 'fullhdwebdl', 'uhd4kwebdl', 'uhd8kwebdl']\n }, // All sources are BluRay\n {\n name: 'BluRay',\n key: 'anybluray',\n elements: ['hdbluray', 'fullhdbluray', 'uhd4kbluray', 'uhd8kbluray']\n }, // All resolutions are 720p\n {\n name: '720p',\n key: 'hd720p',\n elements: ['hdtv', 'rawhdtv', 'hdwebdl', 'hdbluray']\n }, // All resolutions are 1080p\n {\n name: '1080p',\n key: 'hd1080p',\n elements: ['fullhdtv', 'fullhdwebdl', 'fullhdbluray']\n }, // All resolutions are 4K UHD\n {\n name: 'UHD-4K',\n key: 'anyuhd4k',\n elements: ['uhd4ktv', 'uhd4kwebdl', 'uhd4kbluray']\n }, // All resolutions are 8K UHD\n {\n name: 'UHD-8K',\n key: 'anyuhd8k',\n elements: ['uhd8ktv', 'uhd8kwebdl', 'uhd8kbluray']\n }];\n const {\n isSubsetOf,\n qualities,\n makeQualitySet\n } = this;\n\n for (const {\n name,\n key,\n elements\n } of customQualitySets) {\n const qualitySet = makeQualitySet(elements); // Check if both quality lists match the set.\n\n if (isSubsetOf(qualities.allowed, qualitySet) && isSubsetOf(qualities.preferred, qualitySet)) {\n return {\n name,\n key\n };\n }\n } // These are the fallback values, if none of the checks above matched\n\n\n return {\n key: 'custom',\n name: 'Custom'\n };\n }\n\n },\n methods: {\n /**\n * Make a quality set.\n * @param {string[]} keys - An array of quality keys to add their values to the set.\n * @returns {number[]} An array of the quality values.\n */\n makeQualitySet(keys) {\n return this.qualityValues.reduce((result, {\n key,\n value\n }) => {\n if (keys.includes(key)) {\n return result.concat(value);\n }\n\n return result;\n }, []);\n },\n\n /**\n * Check if all the items of `set1` are items of `set2`.\n * Note that when `set1` is empty, it returns `true`.\n * Assumption: Each array contains unique items only.\n * Source: https://stackoverflow.com/a/48211214/7597273\n *\n * @param {(Number[]|String[])} set1 - Array to be compared against `set2`.\n * @param {(Number[]|String[])} set2 - Array to compare `set1` against.\n * @returns {Boolean} - Whether or not `set1` is a subset of `set2`\n */\n isSubsetOf(set1, set2) {\n return set1.every(value => set2.includes(value));\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/quality-pill.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -392,7 +404,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n/ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-selector',\n props: {\n showSlug: String,\n followSelection: {\n type: Boolean,\n default: false\n },\n placeholder: String,\n selectClass: {\n type: String,\n default: 'select-show form-control input-sm-custom'\n }\n },\n\n data() {\n const selectedShowSlug = this.showSlug || this.placeholder;\n return {\n selectedShowSlug\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n layout: state => state.layout,\n shows: state => state.shows.shows\n }),\n\n showLists() {\n const {\n layout,\n shows\n } = this;\n const {\n animeSplitHome,\n sortArticle\n } = layout;\n const lists = [{\n type: 'Shows',\n shows: []\n }, {\n type: 'Anime',\n shows: []\n }]; // We're still loading\n\n if (shows.length === 0) {\n return;\n }\n\n shows.forEach(show => {\n const type = Number(animeSplitHome && show.config.anime);\n lists[type].shows.push(show);\n });\n\n const sortKey = title => (sortArticle ? title : title.replace(/^((?:the|a|an)\\s)/i, '')).toLowerCase();\n\n lists.forEach(list => {\n list.shows.sort((showA, showB) => {\n const titleA = sortKey(showA.title);\n const titleB = sortKey(showB.title);\n\n if (titleA < titleB) {\n return -1;\n }\n\n if (titleA > titleB) {\n return 1;\n }\n\n return 0;\n });\n });\n return lists;\n },\n\n whichList() {\n const {\n showLists\n } = this;\n const shows = showLists[0].shows.length !== 0;\n const anime = showLists[1].shows.length !== 0;\n\n if (shows && anime) {\n return -1;\n }\n\n if (anime) {\n return 1;\n }\n\n return 0;\n },\n\n showForRoutes() {\n const {\n $route\n } = this;\n return ['show', 'editShow'].includes($route.name);\n }\n\n },\n watch: {\n showSlug(newSlug) {\n this.selectedShowSlug = newSlug;\n },\n\n selectedShowSlug(newSlug) {\n if (!this.followSelection) {\n return;\n }\n\n const {\n $store,\n shows\n } = this;\n const selectedShow = shows.find(show => show.id.slug === newSlug);\n\n if (!selectedShow) {\n return;\n }\n\n const indexerName = selectedShow.indexer;\n const seriesId = selectedShow.id[indexerName]; // TODO: Make sure the correct show, has been set as current show.\n\n console.debug(`Setting current show to ${selectedShow.title}`);\n $store.commit('currentShow', {\n indexer: indexerName,\n id: seriesId\n }); // To make it complete, make sure to switch route.\n\n this.$router.push({\n query: {\n indexername: indexerName,\n seriesid: String(seriesId)\n }\n });\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/show-selector.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-selector',\n props: {\n showSlug: String,\n followSelection: {\n type: Boolean,\n default: false\n },\n placeholder: String,\n selectClass: {\n type: String,\n default: 'select-show form-control input-sm-custom'\n }\n },\n\n data() {\n const selectedShowSlug = this.showSlug || this.placeholder;\n return {\n selectedShowSlug\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n layout: state => state.config.layout,\n shows: state => state.shows.shows\n }),\n\n showLists() {\n const {\n layout,\n shows\n } = this;\n const {\n animeSplitHome,\n sortArticle\n } = layout;\n const lists = [{\n type: 'Shows',\n shows: []\n }, {\n type: 'Anime',\n shows: []\n }]; // We're still loading\n\n if (shows.length === 0) {\n return;\n }\n\n shows.forEach(show => {\n const type = Number(animeSplitHome && show.config.anime);\n lists[type].shows.push(show);\n });\n\n const sortKey = title => (sortArticle ? title : title.replace(/^((?:the|a|an)\\s)/i, '')).toLowerCase();\n\n lists.forEach(list => {\n list.shows.sort((showA, showB) => {\n const titleA = sortKey(showA.title);\n const titleB = sortKey(showB.title);\n\n if (titleA < titleB) {\n return -1;\n }\n\n if (titleA > titleB) {\n return 1;\n }\n\n return 0;\n });\n });\n return lists;\n },\n\n whichList() {\n const {\n showLists\n } = this;\n const shows = showLists[0].shows.length !== 0;\n const anime = showLists[1].shows.length !== 0;\n\n if (shows && anime) {\n return -1;\n }\n\n if (anime) {\n return 1;\n }\n\n return 0;\n },\n\n showForRoutes() {\n const {\n $route\n } = this;\n return ['show', 'editShow'].includes($route.name);\n }\n\n },\n watch: {\n showSlug(newSlug) {\n this.selectedShowSlug = newSlug;\n },\n\n selectedShowSlug(newSlug) {\n if (!this.followSelection) {\n return;\n }\n\n const {\n $store,\n shows\n } = this;\n const selectedShow = shows.find(show => show.id.slug === newSlug);\n\n if (!selectedShow) {\n return;\n }\n\n const indexerName = selectedShow.indexer;\n const seriesId = selectedShow.id[indexerName]; // TODO: Make sure the correct show, has been set as current show.\n\n console.debug(`Setting current show to ${selectedShow.title}`);\n $store.commit('currentShow', {\n indexer: indexerName,\n id: seriesId\n }); // To make it complete, make sure to switch route.\n\n this.$router.push({\n query: {\n indexername: indexerName,\n seriesid: String(seriesId)\n }\n });\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/show-selector.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -416,7 +428,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n/* harmony defaul /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'history',\n template: '#history-template',\n\n data() {\n return {\n layoutOptions: [{\n value: 'compact',\n text: 'Compact'\n }, {\n value: 'detailed',\n text: 'Detailed'\n }]\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n // Renamed because of the computed property 'layout'.\n stateLayout: state => state.layout\n }),\n historyLayout: {\n get() {\n const {\n stateLayout\n } = this;\n return stateLayout.history;\n },\n\n set(layout) {\n const {\n setLayout\n } = this;\n const page = 'history';\n setLayout({\n page,\n layout\n });\n }\n\n }\n },\n\n mounted() {\n const unwatch = this.$watch('stateLayout.history', () => {\n unwatch();\n const {\n historyLayout: layout,\n config\n } = this;\n $('#historyTable:has(tbody tr)').tablesorter({\n widgets: ['saveSort', 'zebra', 'filter'],\n sortList: [[0, 1]],\n textExtraction: function () {\n if (layout === 'detailed') {\n return {\n // 0: Time, 1: Episode, 2: Action, 3: Provider, 4: Quality\n 0: node => $(node).find('time').attr('datetime'),\n 1: node => $(node).find('a').text(),\n 4: node => $(node).attr('quality')\n };\n } // 0: Time, 1: Episode, 2: Snatched, 3: Downloaded\n\n\n const compactExtract = {\n 0: node => $(node).find('time').attr('datetime'),\n 1: node => $(node).find('a').text(),\n 2: node => $(node).find('img').attr('title') === undefined ? '' : $(node).find('img').attr('title'),\n 3: node => $(node).text()\n };\n\n if (config.subtitles.enabled) {\n // 4: Subtitled, 5: Quality\n compactExtract[4] = node => $(node).find('img').attr('title') === undefined ? '' : $(node).find('img').attr('title');\n\n compactExtract[5] = node => $(node).attr('quality');\n } else {\n // 4: Quality\n compactExtract[4] = node => $(node).attr('quality');\n }\n\n return compactExtract;\n }(),\n headers: function () {\n if (layout === 'detailed') {\n return {\n 0: {\n sorter: 'realISODate'\n }\n };\n }\n\n return {\n 0: {\n sorter: 'realISODate'\n },\n 2: {\n sorter: 'text'\n }\n };\n }()\n });\n });\n $('#history_limit').on('change', function () {\n window.location.href = $('base').attr('href') + 'history/?limit=' + $(this).val();\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setLayout: 'setLayout'\n })\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'history',\n template: '#history-template',\n\n data() {\n return {\n layoutOptions: [{\n value: 'compact',\n text: 'Compact'\n }, {\n value: 'detailed',\n text: 'Detailed'\n }]\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config.general,\n // Renamed because of the computed property 'layout'.\n stateLayout: state => state.config.layout\n }),\n historyLayout: {\n get() {\n const {\n stateLayout\n } = this;\n return stateLayout.history;\n },\n\n set(layout) {\n const {\n setLayout\n } = this;\n const page = 'history';\n setLayout({\n page,\n layout\n });\n }\n\n }\n },\n\n mounted() {\n const unwatch = this.$watch('stateLayout.history', () => {\n unwatch();\n const {\n historyLayout: layout,\n config\n } = this;\n $('#historyTable:has(tbody tr)').tablesorter({\n widgets: ['saveSort', 'zebra', 'filter'],\n sortList: [[0, 1]],\n textExtraction: function () {\n if (layout === 'detailed') {\n return {\n // 0: Time, 1: Episode, 2: Action, 3: Provider, 4: Quality\n 0: node => $(node).find('time').attr('datetime'),\n 1: node => $(node).find('a').text(),\n 4: node => $(node).attr('quality')\n };\n } // 0: Time, 1: Episode, 2: Snatched, 3: Downloaded\n\n\n const compactExtract = {\n 0: node => $(node).find('time').attr('datetime'),\n 1: node => $(node).find('a').text(),\n 2: node => $(node).find('img').attr('title') === undefined ? '' : $(node).find('img').attr('title'),\n 3: node => $(node).text()\n };\n\n if (config.subtitles.enabled) {\n // 4: Subtitled, 5: Quality\n compactExtract[4] = node => $(node).find('img').attr('title') === undefined ? '' : $(node).find('img').attr('title');\n\n compactExtract[5] = node => $(node).attr('quality');\n } else {\n // 4: Quality\n compactExtract[4] = node => $(node).attr('quality');\n }\n\n return compactExtract;\n }(),\n headers: function () {\n if (layout === 'detailed') {\n return {\n 0: {\n sorter: 'realISODate'\n }\n };\n }\n\n return {\n 0: {\n sorter: 'realISODate'\n },\n 2: {\n sorter: 'text'\n }\n };\n }()\n });\n });\n $('#history_limit').on('change', function () {\n window.location.href = $('base').attr('href') + 'history/?limit=' + $(this).val();\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setLayout: 'setLayout'\n })\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -428,7 +440,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _show_list__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./show-list */ \"./src/components/show-list/index.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vanilla-lazyload */ \"./node_modules/vanilla-lazyload/dist/lazyload.min.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-nav-tabs/dist/vue-tabs.js */ \"./node_modules/vue-nav-tabs/dist/vue-tabs.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuedraggable */ \"./node_modules/vuedraggable/dist/vuedraggable.common.js\");\n/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vuedraggable__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\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//\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//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'home',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n ShowList: _show_list__WEBPACK_IMPORTED_MODULE_1__[\"ShowList\"],\n VueTabs: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__[\"VueTabs\"],\n VTab: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__[\"VTab\"],\n Draggable: (vuedraggable__WEBPACK_IMPORTED_MODULE_4___default())\n },\n\n data() {\n return {\n layoutOptions: [{\n value: 'poster',\n text: 'Poster'\n }, {\n value: 'small',\n text: 'Small Poster'\n }, {\n value: 'banner',\n text: 'Banner'\n }, {\n value: 'simple',\n text: 'Simple'\n }],\n selectedRootDir: 0\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n // We don't directly need this. But at some point we need to translate indexerName to id, which uses the state.indexers module.\n indexers: state => state.indexers,\n // Renamed because of the computed property 'layout'.\n stateLayout: state => state.layout,\n stats: state => state.stats\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n showsWithStats: 'showsWithStats'\n }),\n layout: {\n get() {\n const {\n stateLayout\n } = this;\n return stateLayout.home;\n },\n\n set(layout) {\n const {\n setLayout\n } = this;\n const page = 'home';\n setLayout({\n page,\n layout\n });\n }\n\n },\n filterByName: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n showFilterByName\n } = stateLayout;\n return showFilterByName;\n },\n\n set(value) {\n const {\n setShowFilterByName\n } = this;\n setShowFilterByName({\n filter: value\n });\n }\n\n },\n showList: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n show\n } = stateLayout;\n return show.showListOrder;\n },\n\n set(value) {\n const {\n setShowListOrder\n } = this;\n setShowListOrder({\n value\n });\n }\n\n },\n\n showLists() {\n const {\n config,\n indexers,\n filterByName,\n stateLayout,\n showsWithStats\n } = this;\n const {\n rootDirs\n } = config;\n const {\n animeSplitHome,\n selectedRootIndex,\n show\n } = stateLayout;\n\n if (!indexers.indexers) {\n return;\n }\n\n let shows = null; // Filter root dirs\n\n shows = showsWithStats.filter(show => selectedRootIndex === -1 || show.config.location.includes(rootDirs.slice(1)[selectedRootIndex])); // Filter by text\n\n shows = shows.filter(show => show.title.toLowerCase().includes(filterByName.toLowerCase()));\n\n if (animeSplitHome) {\n return show.showListOrder.map(listTitle => {\n return {\n listTitle,\n shows: shows.filter(show => show.config.anime === (listTitle === 'Anime'))\n };\n });\n }\n\n return [{\n listTitle: 'Series',\n shows\n }];\n },\n\n imgLazyLoad() {\n console.log('imgLazyLoad object constructud!');\n return new vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2___default.a({\n // Example of options object -> see options section\n threshold: 500\n });\n },\n\n selectedRootIndexOptions() {\n const {\n config\n } = this;\n const {\n rootDirs\n } = config;\n return [...[{\n value: -1,\n text: 'All Folders'\n }], ...rootDirs.slice(1).map((item, idx) => ({\n text: item,\n value: idx\n }))];\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setLayout: 'setLayout',\n setConfig: 'setConfig',\n setShowFilterByName: 'setShowFilterByName',\n setShowListOrder: 'setShowListOrder',\n setStoreLayout: 'setStoreLayout',\n getShows: 'getShows',\n getStats: 'getStats'\n }),\n\n async changePosterSortBy() {\n // Patch new posterSOrtBy value\n const {\n $snotify,\n posterSortby,\n setPosterSortBy\n } = this;\n\n try {\n await setPosterSortBy({\n section: 'layout',\n config: {\n posterSortby\n }\n });\n } catch (error) {\n $snotify.error('Error while trying to change poster sort option', 'Error');\n }\n },\n\n saveSelectedRootDir(value) {\n const {\n setStoreLayout\n } = this;\n setStoreLayout({\n key: 'selectedRootIndex',\n value\n });\n },\n\n updateTabContent(tabIndex, newTab) {\n const {\n setStoreLayout\n } = this;\n setStoreLayout({\n key: 'currentShowTab',\n value: newTab.title\n });\n }\n\n },\n\n mounted() {\n const {\n getStats\n } = this;\n getStats('show');\n }\n\n});\n\n//# sourceURL=webpack:///./src/components/home.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _show_list__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./show-list */ \"./src/components/show-list/index.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-nav-tabs/dist/vue-tabs.js */ \"./node_modules/vue-nav-tabs/dist/vue-tabs.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuedraggable */ \"./node_modules/vuedraggable/dist/vuedraggable.common.js\");\n/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vuedraggable__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\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//\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//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'home',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n ShowList: _show_list__WEBPACK_IMPORTED_MODULE_1__[\"ShowList\"],\n VueTabs: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2__[\"VueTabs\"],\n VTab: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_2__[\"VTab\"],\n Draggable: (vuedraggable__WEBPACK_IMPORTED_MODULE_3___default())\n },\n\n data() {\n return {\n layoutOptions: [{\n value: 'poster',\n text: 'Poster'\n }, {\n value: 'small',\n text: 'Small Poster'\n }, {\n value: 'banner',\n text: 'Banner'\n }, {\n value: 'simple',\n text: 'Simple'\n }],\n selectedRootDir: 0\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config.general,\n indexers: state => state.config.indexers,\n // Renamed because of the computed property 'layout'.\n stateLayout: state => state.config.layout,\n stats: state => state.stats\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n showsWithStats: 'showsWithStats'\n }),\n layout: {\n get() {\n const {\n stateLayout\n } = this;\n return stateLayout.home;\n },\n\n set(layout) {\n const {\n setLayout\n } = this;\n const page = 'home';\n setLayout({\n page,\n layout\n });\n }\n\n },\n filterByName: {\n get() {\n const {\n local\n } = this.stateLayout;\n const {\n showFilterByName\n } = local;\n return showFilterByName;\n },\n\n set(value) {\n const {\n setLayoutLocal\n } = this;\n setLayoutLocal({\n key: 'showFilterByName',\n value\n });\n }\n\n },\n showList: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n show\n } = stateLayout;\n return show.showListOrder;\n },\n\n set(value) {\n const {\n setShowListOrder\n } = this;\n setShowListOrder({\n value\n });\n }\n\n },\n\n showLists() {\n const {\n config,\n filterByName,\n indexers,\n stateLayout,\n showsWithStats\n } = this;\n const {\n rootDirs\n } = config;\n const {\n animeSplitHome,\n selectedRootIndex,\n show\n } = stateLayout;\n\n if (!indexers.indexers) {\n return;\n }\n\n let shows = null; // Filter root dirs\n\n shows = showsWithStats.filter(show => selectedRootIndex === -1 || show.config.location.includes(rootDirs.slice(1)[selectedRootIndex])); // Filter by text\n\n shows = shows.filter(show => show.title.toLowerCase().includes(filterByName.toLowerCase()));\n\n if (animeSplitHome) {\n return show.showListOrder.map(listTitle => {\n return {\n listTitle,\n shows: shows.filter(show => show.config.anime === (listTitle === 'Anime'))\n };\n });\n }\n\n return [{\n listTitle: 'Series',\n shows\n }];\n },\n\n selectedRootIndexOptions() {\n const {\n config\n } = this;\n const {\n rootDirs\n } = config;\n return [...[{\n value: -1,\n text: 'All Folders'\n }], ...rootDirs.slice(1).map((item, idx) => ({\n text: item,\n value: idx\n }))];\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setLayout: 'setLayout',\n setConfig: 'setConfig',\n setShowListOrder: 'setShowListOrder',\n setStoreLayout: 'setStoreLayout',\n setLayoutLocal: 'setLayoutLocal',\n getShows: 'getShows',\n getStats: 'getStats'\n }),\n\n async changePosterSortBy() {\n // Patch new posterSOrtBy value\n const {\n $snotify,\n posterSortby,\n setPosterSortBy\n } = this;\n\n try {\n await setPosterSortBy({\n section: 'layout',\n config: {\n posterSortby\n }\n });\n } catch (error) {\n $snotify.error('Error while trying to change poster sort option', 'Error');\n }\n },\n\n saveSelectedRootDir(value) {\n const {\n setStoreLayout\n } = this;\n setStoreLayout({\n key: 'selectedRootIndex',\n value\n });\n },\n\n updateTabContent(tabIndex, newTab) {\n const {\n setLayoutLocal\n } = this;\n setLayoutLocal({\n key: 'currentShowTab',\n value: newTab.title\n });\n }\n\n },\n\n mounted() {\n const {\n getStats\n } = this;\n getStats('show');\n }\n\n});\n\n//# sourceURL=webpack:///./src/components/home.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -452,7 +464,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n/* harmony defaul /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'irc',\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n configLoaded: state => state.config.pythonVersion !== null,\n gitUsername: state => state.config.gitUsername\n }),\n\n frameSrc() {\n const {\n configLoaded,\n gitUsername\n } = this;\n\n if (!configLoaded) {\n return undefined;\n }\n\n const username = gitUsername || 'MedusaUI|?';\n return `https://kiwiirc.com/client/irc.freenode.net/?nick=${username}&theme=basic#pymedusa`;\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/irc.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'irc',\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n configLoaded: state => state.config.system.pythonVersion !== null,\n gitUsername: state => state.config.general.git.username\n }),\n\n frameSrc() {\n const {\n configLoaded,\n gitUsername\n } = this;\n\n if (!configLoaded) {\n return undefined;\n }\n\n const username = gitUsername || 'MedusaUI|?';\n return `https://kiwiirc.com/client/irc.freenode.net/?nick=${username}&theme=basic#pymedusa`;\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/irc.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -476,7 +488,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n/ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/debounce */ \"./node_modules/lodash/debounce.js\");\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\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//\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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'logs',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"AppLink\"],\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n\n data() {\n return {\n minLevel: 'INFO',\n threadFilter: '',\n periodFilter: 'one_day',\n searchQuery: '',\n logLines: [],\n autoUpdate: true,\n autoUpdateTimer: null,\n filters: [{\n value: 'BACKLOG',\n title: 'Backlog'\n }, {\n value: 'CHECKVERSION',\n title: 'Check Version'\n }, {\n value: 'DAILYSEARCHER',\n title: 'Daily Searcher'\n }, {\n value: 'ERROR',\n title: 'Error'\n }, {\n value: 'EVENT',\n title: 'Event'\n }, {\n value: 'FINDPROPERS',\n title: 'Find Propers'\n }, {\n value: 'FINDSUBTITLES',\n title: 'Find Subtitles'\n }, {\n value: 'MAIN',\n title: 'Main'\n }, {\n value: 'POSTPROCESSOR',\n title: 'PostProcessor'\n }, {\n value: 'SEARCHQUEUE',\n title: 'Search Queue (All)'\n }, {\n value: 'SEARCHQUEUE-BACKLOG',\n title: 'Search Queue (Backlog)'\n }, {\n value: 'SEARCHQUEUE-DAILY-SEARCH',\n title: 'Search Queue (Daily Searcher)'\n }, {\n value: 'SEARCHQUEUE-FORCED',\n title: 'Search Queue (Forced)'\n }, {\n value: 'SEARCHQUEUE-MANUAL',\n title: 'Search Queue (Manual)'\n }, {\n value: 'SEARCHQUEUE-RETRY',\n title: 'Search Queue (Retry/Failed)'\n }, {\n value: 'SEARCHQUEUE-RSS',\n title: 'Search Queue (RSS)'\n }, {\n value: 'SHOWQUEUE',\n title: 'Show Queue (All)'\n }, {\n value: 'SHOWQUEUE-REFRESH',\n title: 'Show Queue (Refresh)'\n }, {\n value: 'SHOWQUEUE-SEASON-UPDATE',\n title: 'Show Season Queue (Update)'\n }, {\n value: 'SHOWQUEUE-UPDATE',\n title: 'Show Queue (Update)'\n }, {\n value: 'SHOWUPDATER',\n title: 'Show Updater'\n }, {\n value: 'Thread',\n title: 'Thread'\n }, {\n value: 'TORNADO',\n title: 'Tornado'\n }, {\n value: 'TORRENTCHECKER',\n title: 'Torrent Checker'\n }, {\n value: 'TRAKTCHECKER',\n title: 'Trakt Checker'\n }]\n };\n },\n\n filters: {\n formatLine(line) {\n let result = '';\n result += line.timestamp.replace('T', ' ').replace('Z', '');\n result += ` ${line.level}`;\n result += `\\t${line.thread}`;\n\n if (line.threadId) {\n result += `-${line.threadId}`;\n }\n\n result += ' :: ';\n\n if (line.extra) {\n result += `${line.extra} :: `;\n }\n\n if (line.commit) {\n result += `[${line.commit}] `;\n }\n\n result += line.message;\n\n if (line.traceback) {\n result += line.traceback.reduce((str, tbLine) => str.concat('\\n', tbLine), '');\n }\n\n return result;\n }\n\n },\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])(['config', 'layout']),\n\n rawViewLink() {\n const qs = new URLSearchParams();\n qs.set('level', this.minLevel);\n qs.set('thread', this.threadFilter);\n qs.set('period', this.periodFilter);\n qs.set('query', this.searchQuery);\n qs.set('limit', 1000);\n qs.set('api_key', _api__WEBPACK_IMPORTED_MODULE_2__[\"apiKey\"]);\n qs.set('raw', 'true');\n return `${_api__WEBPACK_IMPORTED_MODULE_2__[\"api\"].defaults.baseURL}log?${qs}`;\n },\n\n levels() {\n const {\n debug,\n dbDebug,\n loggingLevels\n } = this.config.logs;\n return Object.entries(loggingLevels).sort((a, b) => a[1] - b[1]) // Sort by level in ascending order\n .reduce((result, level) => {\n const key = level[0];\n\n if (key === 'debug' && !debug || key === 'db' && !dbDebug) {\n return result;\n }\n\n const levelName = key.length <= 2 ? key.toUpperCase() : key.charAt(0).toUpperCase() + key.slice(1);\n return result.concat(levelName);\n }, []);\n }\n\n },\n\n mounted() {\n const {\n query\n } = this.$route; // Map values from URL query\n\n this.minLevel = query.minLevel === undefined ? this.minLevel : query.minLevel;\n this.threadFilter = query.threadFilter === undefined ? this.threadFilter : query.threadFilter;\n this.periodFilter = query.periodFilter === undefined ? this.periodFilter : query.periodFilter;\n this.searchQuery = query.searchQuery === undefined ? this.searchQuery : query.searchQuery;\n\n if (this.autoUpdate) {\n this.autoUpdateTask();\n } else {\n this.fetchLogs(false, true);\n }\n\n this.fetchLogsDebounced = lodash_debounce__WEBPACK_IMPORTED_MODULE_0___default()(this.fetchLogs, 500);\n },\n\n destroyed() {\n if (this.autoUpdateTimer) {\n clearTimeout(this.autoUpdateTimer);\n }\n },\n\n methods: {\n async fetchLogs(pushState = true, cursor = true) {\n const {\n minLevel,\n threadFilter,\n periodFilter,\n searchQuery\n } = this;\n\n if (cursor) {\n document.body.style.cursor = 'wait';\n }\n\n const params = {\n level: minLevel,\n thread: threadFilter,\n period: periodFilter,\n query: searchQuery,\n limit: 1000\n };\n\n try {\n const resp = await _api__WEBPACK_IMPORTED_MODULE_2__[\"api\"].get('log', {\n params\n });\n this.logLines = resp.data;\n return true;\n } catch (error) {\n console.error(error);\n return false;\n } finally {\n if (cursor) {\n document.body.style.cursor = 'default';\n }\n\n if (pushState) {\n this.$router.push({\n query: {\n minLevel,\n threadFilter,\n periodFilter,\n searchQuery\n }\n });\n }\n }\n },\n\n async autoUpdateTask(errors = 0) {\n if (this.autoUpdate) {\n const result = await this.fetchLogs(false, false); // Increment if false\n\n errors += Number(!result); // Stop after 5 network errors\n\n if (errors < 5) {\n this.autoUpdateTimer = setTimeout(this.autoUpdateTask, 1500, errors);\n } else {\n this.autoUpdate = false;\n this.autoUpdateTimer = null;\n }\n } else {\n this.autoUpdateTimer = null;\n }\n }\n\n },\n watch: {\n autoUpdate() {\n this.autoUpdateTask();\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/logs.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/debounce */ \"./node_modules/lodash/debounce.js\");\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\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//\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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'logs',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"AppLink\"],\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n\n data() {\n return {\n minLevel: 'INFO',\n threadFilter: '',\n periodFilter: 'one_day',\n searchQuery: '',\n logLines: [],\n autoUpdate: true,\n autoUpdateTimer: null,\n filters: [{\n value: 'BACKLOG',\n title: 'Backlog'\n }, {\n value: 'CHECKVERSION',\n title: 'Check Version'\n }, {\n value: 'DAILYSEARCHER',\n title: 'Daily Searcher'\n }, {\n value: 'ERROR',\n title: 'Error'\n }, {\n value: 'EVENT',\n title: 'Event'\n }, {\n value: 'FINDPROPERS',\n title: 'Find Propers'\n }, {\n value: 'FINDSUBTITLES',\n title: 'Find Subtitles'\n }, {\n value: 'MAIN',\n title: 'Main'\n }, {\n value: 'POSTPROCESSOR',\n title: 'PostProcessor'\n }, {\n value: 'SEARCHQUEUE',\n title: 'Search Queue (All)'\n }, {\n value: 'SEARCHQUEUE-BACKLOG',\n title: 'Search Queue (Backlog)'\n }, {\n value: 'SEARCHQUEUE-DAILY-SEARCH',\n title: 'Search Queue (Daily Searcher)'\n }, {\n value: 'SEARCHQUEUE-FORCED',\n title: 'Search Queue (Forced)'\n }, {\n value: 'SEARCHQUEUE-MANUAL',\n title: 'Search Queue (Manual)'\n }, {\n value: 'SEARCHQUEUE-RETRY',\n title: 'Search Queue (Retry/Failed)'\n }, {\n value: 'SEARCHQUEUE-RSS',\n title: 'Search Queue (RSS)'\n }, {\n value: 'SHOWQUEUE',\n title: 'Show Queue (All)'\n }, {\n value: 'SHOWQUEUE-REFRESH',\n title: 'Show Queue (Refresh)'\n }, {\n value: 'SHOWQUEUE-SEASON-UPDATE',\n title: 'Show Season Queue (Update)'\n }, {\n value: 'SHOWQUEUE-UPDATE',\n title: 'Show Queue (Update)'\n }, {\n value: 'SHOWUPDATER',\n title: 'Show Updater'\n }, {\n value: 'Thread',\n title: 'Thread'\n }, {\n value: 'TORNADO',\n title: 'Tornado'\n }, {\n value: 'TORRENTCHECKER',\n title: 'Torrent Checker'\n }, {\n value: 'TRAKTCHECKER',\n title: 'Trakt Checker'\n }]\n };\n },\n\n filters: {\n formatLine(line) {\n let result = '';\n result += line.timestamp.replace('T', ' ').replace('Z', '');\n result += ` ${line.level}`;\n result += `\\t${line.thread}`;\n\n if (line.threadId) {\n result += `-${line.threadId}`;\n }\n\n result += ' :: ';\n\n if (line.extra) {\n result += `${line.extra} :: `;\n }\n\n if (line.commit) {\n result += `[${line.commit}] `;\n }\n\n result += line.message;\n\n if (line.traceback) {\n result += line.traceback.reduce((str, tbLine) => str.concat('\\n', tbLine), '');\n }\n\n return result;\n }\n\n },\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config.general,\n layout: state => state.config.layout\n }),\n\n rawViewLink() {\n const qs = new URLSearchParams();\n qs.set('level', this.minLevel);\n qs.set('thread', this.threadFilter);\n qs.set('period', this.periodFilter);\n qs.set('query', this.searchQuery);\n qs.set('limit', 1000);\n qs.set('api_key', _api__WEBPACK_IMPORTED_MODULE_2__[\"apiKey\"]);\n qs.set('raw', 'true');\n return `${_api__WEBPACK_IMPORTED_MODULE_2__[\"api\"].defaults.baseURL}log?${qs}`;\n },\n\n levels() {\n const {\n debug,\n dbDebug,\n loggingLevels\n } = this.config.logs;\n return Object.entries(loggingLevels).sort((a, b) => a[1] - b[1]) // Sort by level in ascending order\n .reduce((result, level) => {\n const key = level[0];\n\n if (key === 'debug' && !debug || key === 'db' && !dbDebug) {\n return result;\n }\n\n const levelName = key.length <= 2 ? key.toUpperCase() : key.charAt(0).toUpperCase() + key.slice(1);\n return result.concat(levelName);\n }, []);\n }\n\n },\n\n mounted() {\n const {\n query\n } = this.$route; // Map values from URL query\n\n this.minLevel = query.minLevel === undefined ? this.minLevel : query.minLevel;\n this.threadFilter = query.threadFilter === undefined ? this.threadFilter : query.threadFilter;\n this.periodFilter = query.periodFilter === undefined ? this.periodFilter : query.periodFilter;\n this.searchQuery = query.searchQuery === undefined ? this.searchQuery : query.searchQuery;\n\n if (this.autoUpdate) {\n this.autoUpdateTask();\n } else {\n this.fetchLogs(false, true);\n }\n\n this.fetchLogsDebounced = lodash_debounce__WEBPACK_IMPORTED_MODULE_0___default()(this.fetchLogs, 500);\n },\n\n destroyed() {\n if (this.autoUpdateTimer) {\n clearTimeout(this.autoUpdateTimer);\n }\n },\n\n methods: {\n async fetchLogs(pushState = true, cursor = true) {\n const {\n minLevel,\n threadFilter,\n periodFilter,\n searchQuery\n } = this;\n\n if (cursor) {\n document.body.style.cursor = 'wait';\n }\n\n const params = {\n level: minLevel,\n thread: threadFilter,\n period: periodFilter,\n query: searchQuery,\n limit: 1000\n };\n\n try {\n const resp = await _api__WEBPACK_IMPORTED_MODULE_2__[\"api\"].get('log', {\n params\n });\n this.logLines = resp.data;\n return true;\n } catch (error) {\n console.error(error);\n return false;\n } finally {\n if (cursor) {\n document.body.style.cursor = 'default';\n }\n\n if (pushState) {\n this.$router.push({\n query: {\n minLevel,\n threadFilter,\n periodFilter,\n searchQuery\n }\n });\n }\n }\n },\n\n async autoUpdateTask(errors = 0) {\n if (this.autoUpdate) {\n const result = await this.fetchLogs(false, false); // Increment if false\n\n errors += Number(!result); // Stop after 5 network errors\n\n if (errors < 5) {\n this.autoUpdateTimer = setTimeout(this.autoUpdateTask, 1500, errors);\n } else {\n this.autoUpdate = false;\n this.autoUpdateTimer = null;\n }\n } else {\n this.autoUpdateTimer = null;\n }\n }\n\n },\n watch: {\n autoUpdate() {\n this.autoUpdateTask();\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/logs.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -500,7 +512,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/**\n * An object representing a root dir\n * @typedef {Object} rootDir\n * @property {string} path - Root dir path\n * @property {boolean} selected - Is this root dir selected?\n * @property {boolean} default - Is this the default root dir?\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'root-dirs',\n inheritAttrs: false,\n\n data() {\n return {\n rootDirs: []\n };\n },\n\n beforeMount() {\n const {\n rawRootDirs,\n transformRaw\n } = this;\n this.rootDirs = transformRaw(rawRootDirs);\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n rawRootDirs: state => state.config.rootDirs\n }),\n\n paths() {\n return this.rootDirs.map(rd => rd.path);\n },\n\n selectedRootDir: {\n get() {\n const {\n rootDirs\n } = this;\n const selectedDir = rootDirs.find(rd => rd.selected);\n\n if (!selectedDir || rootDirs.length === 0) {\n return null;\n }\n\n return selectedDir.path;\n },\n\n set(newRootDir) {\n const {\n rootDirs\n } = this;\n this.rootDirs = rootDirs.map(rd => {\n rd.selected = rd.path === newRootDir;\n return rd;\n });\n }\n\n },\n defaultRootDir: {\n get() {\n const {\n rootDirs\n } = this;\n const defaultDir = rootDirs.find(rd => rd.default);\n\n if (!defaultDir || rootDirs.length === 0) {\n return null;\n }\n\n return defaultDir.path;\n },\n\n set(newRootDir) {\n const {\n rootDirs\n } = this;\n this.rootDirs = rootDirs.map(rd => {\n rd.default = rd.path === newRootDir;\n return rd;\n });\n }\n\n }\n },\n filters: {\n /**\n * Prefix the default root dir path with '* '\n * @param {rootDir} rootDir - Current root dir object\n * @returns {string} - Modified root dir path\n */\n markDefault(rootDir) {\n if (rootDir.default) {\n return `* ${rootDir.path}`;\n }\n\n return rootDir.path;\n }\n\n },\n methods: {\n /**\n * Transform raw root dirs to an array of objects\n * @param {string[]} rawRootDirs - [defaultIndex, rootDir0, rootDir1, ...]\n * @return {rootDir[]} - Root dir objects\n */\n transformRaw(rawRootDirs) {\n if (rawRootDirs.length < 2) {\n return [];\n } // Transform raw root dirs in the form of an array, to an array of objects\n\n\n const defaultDir = Number.parseInt(rawRootDirs[0], 10);\n return rawRootDirs.slice(1).map((path, index) => {\n return {\n path,\n default: index === defaultDir,\n selected: index === defaultDir\n };\n });\n },\n\n /**\n * Add a new root dir\n */\n add() {\n const {\n $el,\n rootDirs,\n selectedRootDir,\n defaultRootDir,\n saveRootDirs\n } = this;\n $($el).nFileBrowser(path => {\n if (path.length === 0) {\n return;\n } // If the path is already a root dir, select it\n\n\n const found = rootDirs.find(rd => rd.path === path);\n\n if (found && found.path !== selectedRootDir) {\n this.selectedRootDir = path;\n return;\n } // If this the first root dir, set it as default and select it\n\n\n const isFirst = defaultRootDir === null;\n rootDirs.push({\n path,\n default: isFirst,\n selected: isFirst\n });\n saveRootDirs();\n });\n },\n\n /**\n * Edit the selected root dir's path\n */\n edit() {\n const {\n $el,\n rootDirs,\n selectedRootDir,\n saveRootDirs\n } = this;\n $($el).nFileBrowser(path => {\n if (path.length === 0) {\n return;\n } // If the path is already a root dir, select it and remove the one being edited\n\n\n const found = rootDirs.find(rd => rd.path === path);\n\n if (found && found.path !== selectedRootDir) {\n const wasDefault = found.default;\n this.rootDirs = rootDirs.reduce((accumlator, rd) => {\n if (rd.path === selectedRootDir) {\n return accumlator;\n }\n\n const isNewRootDir = rd.path === path;\n rd.selected = isNewRootDir;\n rd.default = wasDefault && isNewRootDir;\n accumlator.push(rd);\n return accumlator;\n }, []);\n return;\n } // Update selected root dir path and select it\n\n\n rootDirs.find(rd => rd.selected).path = path;\n this.selectedRootDir = path;\n saveRootDirs();\n }, {\n initialDir: selectedRootDir\n });\n },\n\n /**\n * Remove the selected root dir\n */\n remove() {\n const {\n rootDirs,\n selectedRootDir,\n defaultRootDir,\n saveRootDirs\n } = this;\n const oldDirIndex = rootDirs.findIndex(rd => rd.selected);\n const oldDirPath = selectedRootDir; // What would the list be like without the root dir we're removing?\n\n const filteredRootDirs = rootDirs.filter(rd => !rd.selected); // Pick a new selection, or null\n\n if (filteredRootDirs.length > 0) {\n const newSelected = oldDirIndex > 0 ? oldDirIndex - 1 : 0;\n this.selectedRootDir = filteredRootDirs[newSelected].path;\n } else {\n this.selectedRootDir = null;\n } // If we're deleting the current default root dir, pick a new default, or null\n\n\n if (this.defaultRootDir !== null && oldDirPath === defaultRootDir) {\n this.defaultRootDir = selectedRootDir;\n } // Finally, remove the root dir from the list\n\n\n this.rootDirs = filteredRootDirs;\n saveRootDirs();\n },\n\n /**\n * Set the selected root dir as default\n */\n setDefault() {\n const {\n selectedRootDir,\n defaultRootDir,\n saveRootDirs\n } = this;\n\n if (selectedRootDir === defaultRootDir) {\n return;\n }\n\n this.defaultRootDir = selectedRootDir;\n saveRootDirs();\n },\n\n /**\n * Save the root dirs\n * @returns {Promise} - The axios Promise from the store action.\n */\n saveRootDirs() {\n const {\n $store,\n paths,\n defaultRootDir\n } = this;\n const rootDirs = paths.slice();\n\n if (defaultRootDir !== null && paths.length !== 0) {\n const defaultIndex = rootDirs.findIndex(path => path === defaultRootDir);\n rootDirs.splice(0, 0, defaultIndex.toString());\n }\n\n return $store.dispatch('setConfig', {\n section: 'main',\n config: {\n rootDirs\n }\n });\n }\n\n },\n watch: {\n rawRootDirs(newValue) {\n const {\n transformRaw\n } = this;\n this.rootDirs = transformRaw(newValue);\n },\n\n rootDirs: {\n handler(newValue) {\n this.$emit('update', newValue);\n this.$nextTick(() => {\n // @FIXME: Temporarily trigger a regular event as well\n $(this.$refs.rootDirs).trigger('change');\n });\n },\n\n deep: true,\n immediate: false\n },\n\n paths(newValue, oldValue) {\n if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) {\n this.$emit('update:paths', newValue);\n }\n }\n\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/root-dirs.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/**\n * An object representing a root dir\n * @typedef {Object} rootDir\n * @property {string} path - Root dir path\n * @property {boolean} selected - Is this root dir selected?\n * @property {boolean} default - Is this the default root dir?\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'root-dirs',\n inheritAttrs: false,\n\n data() {\n return {\n rootDirs: []\n };\n },\n\n beforeMount() {\n const {\n rawRootDirs,\n transformRaw\n } = this;\n this.rootDirs = transformRaw(rawRootDirs);\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n rawRootDirs: state => state.config.general.rootDirs\n }),\n\n paths() {\n return this.rootDirs.map(rd => rd.path);\n },\n\n selectedRootDir: {\n get() {\n const {\n rootDirs\n } = this;\n const selectedDir = rootDirs.find(rd => rd.selected);\n\n if (!selectedDir || rootDirs.length === 0) {\n return null;\n }\n\n return selectedDir.path;\n },\n\n set(newRootDir) {\n const {\n rootDirs\n } = this;\n this.rootDirs = rootDirs.map(rd => {\n rd.selected = rd.path === newRootDir;\n return rd;\n });\n }\n\n },\n defaultRootDir: {\n get() {\n const {\n rootDirs\n } = this;\n const defaultDir = rootDirs.find(rd => rd.default);\n\n if (!defaultDir || rootDirs.length === 0) {\n return null;\n }\n\n return defaultDir.path;\n },\n\n set(newRootDir) {\n const {\n rootDirs\n } = this;\n this.rootDirs = rootDirs.map(rd => {\n rd.default = rd.path === newRootDir;\n return rd;\n });\n }\n\n }\n },\n filters: {\n /**\n * Prefix the default root dir path with '* '\n * @param {rootDir} rootDir - Current root dir object\n * @returns {string} - Modified root dir path\n */\n markDefault(rootDir) {\n if (rootDir.default) {\n return `* ${rootDir.path}`;\n }\n\n return rootDir.path;\n }\n\n },\n methods: {\n /**\n * Transform raw root dirs to an array of objects\n * @param {string[]} rawRootDirs - [defaultIndex, rootDir0, rootDir1, ...]\n * @return {rootDir[]} - Root dir objects\n */\n transformRaw(rawRootDirs) {\n if (rawRootDirs.length < 2) {\n return [];\n } // Transform raw root dirs in the form of an array, to an array of objects\n\n\n const defaultDir = Number.parseInt(rawRootDirs[0], 10);\n return rawRootDirs.slice(1).map((path, index) => {\n return {\n path,\n default: index === defaultDir,\n selected: index === defaultDir\n };\n });\n },\n\n /**\n * Add a new root dir\n */\n add() {\n const {\n $el,\n rootDirs,\n selectedRootDir,\n defaultRootDir,\n saveRootDirs\n } = this;\n $($el).nFileBrowser(path => {\n if (path.length === 0) {\n return;\n } // If the path is already a root dir, select it\n\n\n const found = rootDirs.find(rd => rd.path === path);\n\n if (found && found.path !== selectedRootDir) {\n this.selectedRootDir = path;\n return;\n } // If this the first root dir, set it as default and select it\n\n\n const isFirst = defaultRootDir === null;\n rootDirs.push({\n path,\n default: isFirst,\n selected: isFirst\n });\n saveRootDirs();\n });\n },\n\n /**\n * Edit the selected root dir's path\n */\n edit() {\n const {\n $el,\n rootDirs,\n selectedRootDir,\n saveRootDirs\n } = this;\n $($el).nFileBrowser(path => {\n if (path.length === 0) {\n return;\n } // If the path is already a root dir, select it and remove the one being edited\n\n\n const found = rootDirs.find(rd => rd.path === path);\n\n if (found && found.path !== selectedRootDir) {\n const wasDefault = found.default;\n this.rootDirs = rootDirs.reduce((accumlator, rd) => {\n if (rd.path === selectedRootDir) {\n return accumlator;\n }\n\n const isNewRootDir = rd.path === path;\n rd.selected = isNewRootDir;\n rd.default = wasDefault && isNewRootDir;\n accumlator.push(rd);\n return accumlator;\n }, []);\n return;\n } // Update selected root dir path and select it\n\n\n rootDirs.find(rd => rd.selected).path = path;\n this.selectedRootDir = path;\n saveRootDirs();\n }, {\n initialDir: selectedRootDir\n });\n },\n\n /**\n * Remove the selected root dir\n */\n remove() {\n const {\n rootDirs,\n selectedRootDir,\n defaultRootDir,\n saveRootDirs\n } = this;\n const oldDirIndex = rootDirs.findIndex(rd => rd.selected);\n const oldDirPath = selectedRootDir; // What would the list be like without the root dir we're removing?\n\n const filteredRootDirs = rootDirs.filter(rd => !rd.selected); // Pick a new selection, or null\n\n if (filteredRootDirs.length > 0) {\n const newSelected = oldDirIndex > 0 ? oldDirIndex - 1 : 0;\n this.selectedRootDir = filteredRootDirs[newSelected].path;\n } else {\n this.selectedRootDir = null;\n } // If we're deleting the current default root dir, pick a new default, or null\n\n\n if (this.defaultRootDir !== null && oldDirPath === defaultRootDir) {\n this.defaultRootDir = selectedRootDir;\n } // Finally, remove the root dir from the list\n\n\n this.rootDirs = filteredRootDirs;\n saveRootDirs();\n },\n\n /**\n * Set the selected root dir as default\n */\n setDefault() {\n const {\n selectedRootDir,\n defaultRootDir,\n saveRootDirs\n } = this;\n\n if (selectedRootDir === defaultRootDir) {\n return;\n }\n\n this.defaultRootDir = selectedRootDir;\n saveRootDirs();\n },\n\n /**\n * Save the root dirs\n * @returns {Promise} - The axios Promise from the store action.\n */\n saveRootDirs() {\n const {\n $store,\n paths,\n defaultRootDir\n } = this;\n const rootDirs = paths.slice();\n\n if (defaultRootDir !== null && paths.length !== 0) {\n const defaultIndex = rootDirs.findIndex(path => path === defaultRootDir);\n rootDirs.splice(0, 0, defaultIndex.toString());\n }\n\n return $store.dispatch('setConfig', {\n section: 'main',\n config: {\n rootDirs\n }\n });\n }\n\n },\n watch: {\n rawRootDirs(newValue) {\n const {\n transformRaw\n } = this;\n this.rootDirs = transformRaw(newValue);\n },\n\n rootDirs: {\n handler(newValue) {\n this.$emit('update', newValue);\n this.$nextTick(() => {\n // @FIXME: Temporarily trigger a regular event as well\n $(this.$refs.rootDirs).trigger('change');\n });\n },\n\n deep: true,\n immediate: false\n },\n\n paths(newValue, oldValue) {\n if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) {\n this.$emit('update:paths', newValue);\n }\n }\n\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/root-dirs.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -512,7 +524,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'schedule',\n template: '#schedule-template',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__[\"AppLink\"]\n },\n\n data() {\n return {\n layoutOptions: [{\n value: 'poster',\n text: 'Poster'\n }, {\n value: 'calendar',\n text: 'Calendar'\n }, {\n value: 'banner',\n text: 'Banner'\n }, {\n value: 'list',\n text: 'List'\n }]\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n // Renamed because of the computed property 'layout'.\n stateLayout: state => state.layout\n }),\n\n header() {\n return this.$route.meta.header;\n },\n\n scheduleLayout: {\n get() {\n const {\n stateLayout\n } = this;\n return stateLayout.schedule;\n },\n\n set(layout) {\n const {\n setLayout\n } = this;\n const page = 'schedule';\n setLayout({\n page,\n layout\n });\n }\n\n },\n\n themeSpinner() {\n const {\n stateLayout\n } = this;\n return stateLayout.themeName === 'dark' ? '-dark' : '';\n }\n\n },\n\n mounted() {\n // $store.dispatch('getShows');\n this.$root.$once('loaded', () => {\n const {\n scheduleLayout,\n stateLayout,\n themeSpinner\n } = this;\n const {\n comingEps\n } = stateLayout;\n\n if (scheduleLayout === 'list') {\n const sortCodes = {\n date: 0,\n show: 2,\n network: 5\n };\n const {\n sort\n } = comingEps;\n const sortList = sort in sortCodes ? [[sortCodes[sort], 0]] : [[0, 0]];\n $('#showListTable:has(tbody tr)').tablesorter({\n widgets: ['stickyHeaders', 'filter', 'columnSelector', 'saveSort'],\n sortList,\n textExtraction: {\n 0: node => $(node).find('time').attr('datetime'),\n 1: node => $(node).find('time').attr('datetime'),\n 7: node => $(node).find('span').text().toLowerCase(),\n 8: node => $(node).find('a[data-indexer-name]').attr('data-indexer-name')\n },\n headers: {\n 0: {\n sorter: 'realISODate'\n },\n 1: {\n sorter: 'realISODate'\n },\n 2: {\n sorter: 'loadingNames'\n },\n 4: {\n sorter: 'loadingNames'\n },\n 7: {\n sorter: 'quality'\n },\n 8: {\n sorter: 'text'\n },\n 9: {\n sorter: false,\n filter: false\n }\n },\n widgetOptions: {\n filter_columnFilters: true,\n // eslint-disable-line camelcase\n filter_hideFilters: true,\n // eslint-disable-line camelcase\n filter_saveFilters: true,\n // eslint-disable-line camelcase\n columnSelector_mediaquery: false // eslint-disable-line camelcase\n\n }\n });\n $.ajaxEpSearch();\n }\n\n if (['banner', 'poster'].includes(scheduleLayout)) {\n $.ajaxEpSearch({\n size: 16,\n loadingImage: `loading16${themeSpinner}.gif`\n });\n $('.ep_summary').hide();\n $('.ep_summaryTrigger').on('click', function () {\n $(this).next('.ep_summary').slideToggle('normal', function () {\n $(this).prev('.ep_summaryTrigger').prop('src', function (i, src) {\n return $(this).next('.ep_summary').is(':visible') ? src.replace('plus', 'minus') : src.replace('minus', 'plus');\n });\n });\n });\n }\n\n $('#popover').popover({\n placement: 'bottom',\n html: true,\n // Required if content has HTML\n content: ''\n }).on('shown.bs.popover', () => {\n // Bootstrap popover event triggered when the popover opens\n // call this function to copy the column selection code into the popover\n $.tablesorter.columnSelector.attachTo($('#showListTable'), '#popover-target');\n });\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setLayout: 'setLayout'\n })\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/schedule.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'schedule',\n template: '#schedule-template',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__[\"AppLink\"]\n },\n\n data() {\n return {\n layoutOptions: [{\n value: 'poster',\n text: 'Poster'\n }, {\n value: 'calendar',\n text: 'Calendar'\n }, {\n value: 'banner',\n text: 'Banner'\n }, {\n value: 'list',\n text: 'List'\n }]\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config.general,\n // Renamed because of the computed property 'layout'.\n stateLayout: state => state.config.layout\n }),\n\n header() {\n return this.$route.meta.header;\n },\n\n scheduleLayout: {\n get() {\n const {\n stateLayout\n } = this;\n return stateLayout.schedule;\n },\n\n set(layout) {\n const {\n setLayout\n } = this;\n const page = 'schedule';\n setLayout({\n page,\n layout\n });\n }\n\n },\n\n themeSpinner() {\n const {\n stateLayout\n } = this;\n return stateLayout.themeName === 'dark' ? '-dark' : '';\n }\n\n },\n\n mounted() {\n // $store.dispatch('getShows');\n this.$root.$once('loaded', () => {\n const {\n scheduleLayout,\n stateLayout,\n themeSpinner\n } = this;\n const {\n comingEps\n } = stateLayout;\n\n if (scheduleLayout === 'list') {\n const sortCodes = {\n date: 0,\n show: 2,\n network: 5\n };\n const {\n sort\n } = comingEps;\n const sortList = sort in sortCodes ? [[sortCodes[sort], 0]] : [[0, 0]];\n $('#showListTable:has(tbody tr)').tablesorter({\n widgets: ['stickyHeaders', 'filter', 'columnSelector', 'saveSort'],\n sortList,\n textExtraction: {\n 0: node => $(node).find('time').attr('datetime'),\n 1: node => $(node).find('time').attr('datetime'),\n 7: node => $(node).find('span').text().toLowerCase(),\n 8: node => $(node).find('a[data-indexer-name]').attr('data-indexer-name')\n },\n headers: {\n 0: {\n sorter: 'realISODate'\n },\n 1: {\n sorter: 'realISODate'\n },\n 2: {\n sorter: 'loadingNames'\n },\n 4: {\n sorter: 'loadingNames'\n },\n 7: {\n sorter: 'quality'\n },\n 8: {\n sorter: 'text'\n },\n 9: {\n sorter: false,\n filter: false\n }\n },\n widgetOptions: {\n filter_columnFilters: true,\n // eslint-disable-line camelcase\n filter_hideFilters: true,\n // eslint-disable-line camelcase\n filter_saveFilters: true,\n // eslint-disable-line camelcase\n columnSelector_mediaquery: false // eslint-disable-line camelcase\n\n }\n });\n $.ajaxEpSearch();\n }\n\n if (['banner', 'poster'].includes(scheduleLayout)) {\n $.ajaxEpSearch({\n size: 16,\n loadingImage: `loading16${themeSpinner}.gif`\n });\n $('.ep_summary').hide();\n $('.ep_summaryTrigger').on('click', function () {\n $(this).next('.ep_summary').slideToggle('normal', function () {\n $(this).prev('.ep_summaryTrigger').prop('src', function (i, src) {\n return $(this).next('.ep_summary').is(':visible') ? src.replace('plus', 'minus') : src.replace('minus', 'plus');\n });\n });\n });\n }\n\n $('#popover').popover({\n placement: 'bottom',\n html: true,\n // Required if content has HTML\n content: ''\n }).on('shown.bs.popover', () => {\n // Bootstrap popover event triggered when the popover opens\n // call this function to copy the column selection code into the popover\n $.tablesorter.columnSelector.attachTo($('#showListTable'), '#popover-target');\n });\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setLayout: 'setLayout'\n })\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/schedule.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -524,7 +536,19 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-truncate-collapsed */ \"./node_modules/vue-truncate-collapsed/dist/vue-truncate-collapsed.es.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! country-language */ \"./node_modules/country-language/index.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(country_language__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-scrollto */ \"./node_modules/vue-scrollto/vue-scrollto.js\");\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n/**\n * Return the first item of `values` that is not `null`, `undefined` or `NaN`.\n * @param {...any} values - Values to check.\n * @returns {any} - The first item that fits the criteria, `undefined` otherwise.\n */\n\nconst resolveToValue = (...values) => {\n return values.find(value => {\n return !Number.isNaN(value) && value !== null && value !== undefined;\n });\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-header',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"AppLink\"],\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"Asset\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"QualityPill\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"StateSwitch\"],\n Truncate: vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n },\n props: {\n /**\n * Page type: show or snatch-selection\n */\n type: {\n type: String,\n default: 'show',\n validator: value => ['show', 'snatch-selection'].includes(value)\n },\n\n /**\n * Show indexer\n */\n showIndexer: {\n type: String\n },\n\n /**\n * Show id\n */\n showId: {\n type: Number\n },\n\n /**\n * Season\n */\n showSeason: {\n type: Number\n },\n\n /**\n * Episode\n */\n showEpisode: {\n type: Number\n },\n\n /**\n * Manual Search Type (snatch-selection)\n */\n manualSearchType: {\n type: String\n }\n },\n\n data() {\n return {\n jumpToSeason: 'jump',\n selectedStatus: 'Change status to:',\n selectedQuality: 'Change quality to:',\n overviewStatus: [{\n id: 'wanted',\n checked: true,\n name: 'Wanted'\n }, {\n id: 'allowed',\n checked: true,\n name: 'Allowed'\n }, {\n id: 'preferred',\n checked: true,\n name: 'Preferred'\n }, {\n id: 'skipped',\n checked: true,\n name: 'Skipped'\n }, {\n id: 'snatched',\n checked: true,\n name: 'Snatched'\n }]\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.layout,\n shows: state => state.shows.shows,\n indexerConfig: state => state.indexers.indexers,\n displaySpecials: state => state.layout.show.specials,\n qualities: state => state.consts.qualities.values,\n statuses: state => state.consts.statuses,\n search: state => state.search,\n configLoaded: state => state.layout.fanartBackground !== null\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapGetters\"])({\n show: 'getCurrentShow',\n getOverviewStatus: 'getOverviewStatus',\n getQualityPreset: 'getQualityPreset',\n getStatus: 'getStatus'\n }),\n\n indexer() {\n return this.showIndexer || this.$route.query.indexername;\n },\n\n id() {\n return this.showId || Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return resolveToValue(this.showSeason, Number(this.$route.query.season));\n },\n\n episode() {\n return resolveToValue(this.showEpisode, Number(this.$route.query.episode));\n },\n\n showIndexerUrl() {\n const {\n show,\n indexerConfig\n } = this;\n\n if (!show.indexer) {\n return;\n }\n\n const id = show.id[show.indexer];\n const indexerUrl = indexerConfig[show.indexer].showUrl;\n return `${indexerUrl}${id}`;\n },\n\n activeShowQueueStatuses() {\n const {\n showQueueStatus\n } = this.show;\n\n if (!showQueueStatus) {\n return [];\n }\n\n return showQueueStatus.filter(status => status.active === true);\n },\n\n showGenres() {\n const {\n show,\n dedupeGenres\n } = this;\n const {\n imdbInfo\n } = show;\n const {\n genres\n } = imdbInfo;\n let result = [];\n\n if (genres) {\n result = dedupeGenres(genres.split('|'));\n }\n\n return result;\n },\n\n episodeSummary() {\n const {\n getOverviewStatus,\n show\n } = this;\n const {\n seasons\n } = show;\n const summary = {\n Unaired: 0,\n Skipped: 0,\n Wanted: 0,\n Snatched: 0,\n Preferred: 0,\n Allowed: 0\n };\n seasons.forEach(season => {\n season.episodes.forEach(episode => {\n summary[getOverviewStatus(episode.status, episode.quality, show.config.qualities)] += 1;\n });\n });\n return summary;\n },\n\n changeStatusOptions() {\n const {\n search,\n getStatus,\n statuses\n } = this;\n const {\n general\n } = search;\n\n if (statuses.length === 0) {\n return [];\n } // Get status objects, in this order\n\n\n const defaultOptions = ['wanted', 'skipped', 'ignored', 'downloaded', 'archived'].map(key => getStatus({\n key\n }));\n\n if (general.failedDownloads.enabled) {\n defaultOptions.push(getStatus({\n key: 'failed'\n }));\n }\n\n return defaultOptions;\n },\n\n combinedQualities() {\n const {\n allowed,\n preferred\n } = this.show.config.qualities;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"combineQualities\"])(allowed, preferred);\n },\n\n seasons() {\n const {\n show\n } = this; // Only return an array with seasons (integers)\n\n return show.seasonCount.map(season => season.season);\n }\n\n },\n\n mounted() {\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.$nextTick(() => this.reflowLayout());\n });\n });\n this.$watch('show', function (slug) {\n // eslint-disable-line object-shorthand\n // Show has changed. Meaning we should reflow the layout.\n if (slug) {\n const {\n reflowLayout\n } = this;\n this.$nextTick(() => reflowLayout());\n }\n }, {\n deep: true\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapActions\"])(['setSpecials']),\n combineQualities: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"combineQualities\"],\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n\n changeStatusClicked() {\n const {\n changeStatusOptions,\n changeQualityOptions,\n selectedStatus,\n selectedQuality\n } = this;\n this.$emit('update', {\n newStatus: selectedStatus,\n newQuality: selectedQuality,\n statusOptions: changeStatusOptions,\n qualityOptions: changeQualityOptions\n });\n },\n\n toggleSpecials() {\n const {\n setSpecials\n } = this;\n setSpecials(!this.displaySpecials);\n },\n\n reverse(array) {\n return array ? array.slice().reverse() : [];\n },\n\n dedupeGenres(genres) {\n return genres ? [...new Set(genres.slice(0).map(genre => genre.replace('-', ' ')))] : [];\n },\n\n getCountryISO2ToISO3(country) {\n return Object(country_language__WEBPACK_IMPORTED_MODULE_1__[\"getLanguage\"])(country).iso639_2en;\n },\n\n toggleConfigOption(option) {\n const {\n show\n } = this;\n const {\n config\n } = show;\n this.show.config[option] = !this.show.config[option];\n const data = {\n config: {\n [option]: config[option]\n }\n };\n _api__WEBPACK_IMPORTED_MODULE_4__[\"api\"].patch('series/' + show.id.slug, data).then(_ => {\n this.$snotify.success(`${data.config[option] ? 'enabled' : 'disabled'} show option ${option}`, 'Saved', {\n timeout: 5000\n });\n }).catch(error => {\n this.$snotify.error('Error while trying to save \"' + show.title + '\": ' + error.message || false, 'Error');\n });\n },\n\n reflowLayout() {\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_6__[\"attachImdbTooltip\"])(); // eslint-disable-line no-undef\n }\n\n },\n watch: {\n jumpToSeason(season) {\n // Don't jump until an option is selected\n if (season !== 'jump') {\n // Calculate duration\n let duration = (this.seasons.length - season) * 50;\n duration = Math.max(500, Math.min(duration, 2000)); // Limit to (500ms <= duration <= 2000ms)\n // Calculate offset\n\n let offset = -50; // Navbar\n // Needs extra offset when the sub menu is \"fixed\".\n\n offset -= window.matchMedia('(min-width: 1281px)').matches ? 40 : 0;\n const name = `season-${season}`;\n console.debug(`Jumping to #${name} (${duration}ms)`);\n Object(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__[\"scrollTo\"])(`[name=\"${name}\"]`, duration, {\n container: 'body',\n easing: 'ease-in-out',\n offset\n }); // Update URL hash\n\n window.location.hash = name; // Reset jump\n\n this.jumpToSeason = 'jump';\n }\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-truncate-collapsed */ \"./node_modules/vue-truncate-collapsed/dist/vue-truncate-collapsed.es.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! country-language */ \"./node_modules/country-language/index.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(country_language__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-scrollto */ \"./node_modules/vue-scrollto/vue-scrollto.js\");\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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//\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 * Return the first item of `values` that is not `null`, `undefined` or `NaN`.\n * @param {...any} values - Values to check.\n * @returns {any} - The first item that fits the criteria, `undefined` otherwise.\n */\n\nconst resolveToValue = (...values) => {\n return values.find(value => {\n return !Number.isNaN(value) && value !== null && value !== undefined;\n });\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-header',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"AppLink\"],\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"Asset\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"QualityPill\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"StateSwitch\"],\n Truncate: vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n },\n props: {\n /**\n * Page type: show or snatch-selection\n */\n type: {\n type: String,\n default: 'show',\n validator: value => ['show', 'snatch-selection'].includes(value)\n },\n\n /**\n * Show indexer\n */\n showIndexer: {\n type: String\n },\n\n /**\n * Show id\n */\n showId: {\n type: Number\n },\n\n /**\n * Season\n */\n showSeason: {\n type: Number\n },\n\n /**\n * Episode\n */\n showEpisode: {\n type: Number\n },\n\n /**\n * Manual Search Type (snatch-selection)\n */\n manualSearchType: {\n type: String\n }\n },\n\n data() {\n return {\n jumpToSeason: 'jump',\n selectedStatus: 'Change status to:',\n selectedQuality: 'Change quality to:',\n overviewStatus: [{\n id: 'wanted',\n checked: true,\n name: 'Wanted'\n }, {\n id: 'allowed',\n checked: true,\n name: 'Allowed'\n }, {\n id: 'preferred',\n checked: true,\n name: 'Preferred'\n }, {\n id: 'skipped',\n checked: true,\n name: 'Skipped'\n }, {\n id: 'snatched',\n checked: true,\n name: 'Snatched'\n }]\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapState\"])({\n config: state => state.config.general,\n layout: state => state.config.layout,\n shows: state => state.shows.shows,\n indexers: state => state.config.indexers,\n indexerConfig: state => state.config.indexers.indexers,\n displaySpecials: state => state.config.layout.show.specials,\n qualities: state => state.config.consts.qualities.values,\n statuses: state => state.config.consts.statuses,\n search: state => state.config.search,\n configLoaded: state => state.config.layout.fanartBackground !== null\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapGetters\"])({\n show: 'getCurrentShow',\n getEpisode: 'getEpisode',\n getOverviewStatus: 'getOverviewStatus',\n getQualityPreset: 'getQualityPreset',\n getStatus: 'getStatus'\n }),\n\n indexer() {\n return this.showIndexer || this.$route.query.indexername;\n },\n\n id() {\n return this.showId || Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return resolveToValue(this.showSeason, Number(this.$route.query.season));\n },\n\n episode() {\n return resolveToValue(this.showEpisode, Number(this.$route.query.episode));\n },\n\n showIndexerUrl() {\n const {\n show,\n indexerConfig\n } = this;\n\n if (!show.indexer) {\n return;\n }\n\n const id = show.id[show.indexer];\n const indexerUrl = indexerConfig[show.indexer].showUrl;\n return `${indexerUrl}${id}`;\n },\n\n activeShowQueueStatuses() {\n const {\n showQueueStatus\n } = this.show;\n\n if (!showQueueStatus) {\n return [];\n }\n\n return showQueueStatus.filter(status => status.active === true);\n },\n\n showGenres() {\n const {\n show,\n dedupeGenres\n } = this;\n const {\n imdbInfo\n } = show;\n const {\n genres\n } = imdbInfo;\n let result = [];\n\n if (genres) {\n result = dedupeGenres(genres.split('|'));\n }\n\n return result;\n },\n\n episodeSummary() {\n const {\n getOverviewStatus,\n show\n } = this;\n const {\n seasons\n } = show;\n const summary = {\n Unaired: 0,\n Skipped: 0,\n Wanted: 0,\n Snatched: 0,\n Preferred: 0,\n Allowed: 0\n };\n seasons.forEach(season => {\n season.episodes.forEach(episode => {\n summary[getOverviewStatus(episode.status, episode.quality, show.config.qualities)] += 1;\n });\n });\n return summary;\n },\n\n changeStatusOptions() {\n const {\n search,\n getStatus,\n statuses\n } = this;\n const {\n general\n } = search;\n\n if (statuses.length === 0) {\n return [];\n } // Get status objects, in this order\n\n\n const defaultOptions = ['wanted', 'skipped', 'ignored', 'downloaded', 'archived'].map(key => getStatus({\n key\n }));\n\n if (general.failedDownloads.enabled) {\n defaultOptions.push(getStatus({\n key: 'failed'\n }));\n }\n\n return defaultOptions;\n },\n\n combinedQualities() {\n const {\n allowed,\n preferred\n } = this.show.config.qualities;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"combineQualities\"])(allowed, preferred);\n },\n\n seasons() {\n const {\n show\n } = this; // Only return an array with seasons (integers)\n\n return show.seasonCount.map(season => season.season);\n },\n\n episodeTitle() {\n const {\n getEpisode,\n show,\n season,\n episode\n } = this;\n\n if (!(show.id.slug && season && episode)) {\n return '';\n }\n\n const curEpisode = getEpisode({\n showSlug: show.id.slug,\n season,\n episode\n });\n\n if (curEpisode) {\n return curEpisode.title;\n }\n\n return '';\n }\n\n },\n\n mounted() {\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.$nextTick(() => this.reflowLayout());\n });\n });\n this.$watch('show', function (slug) {\n // eslint-disable-line object-shorthand\n // Show has changed. Meaning we should reflow the layout.\n if (slug) {\n const {\n reflowLayout\n } = this;\n this.$nextTick(() => reflowLayout());\n }\n }, {\n deep: true\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapActions\"])(['setSpecials']),\n combineQualities: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"combineQualities\"],\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n\n changeStatusClicked() {\n const {\n changeStatusOptions,\n changeQualityOptions,\n selectedStatus,\n selectedQuality\n } = this;\n this.$emit('update', {\n newStatus: selectedStatus,\n newQuality: selectedQuality,\n statusOptions: changeStatusOptions,\n qualityOptions: changeQualityOptions\n });\n },\n\n toggleSpecials() {\n const {\n setSpecials\n } = this;\n setSpecials(!this.displaySpecials);\n },\n\n reverse(array) {\n return array ? array.slice().reverse() : [];\n },\n\n dedupeGenres(genres) {\n return genres ? [...new Set(genres.slice(0).map(genre => genre.replace('-', ' ')))] : [];\n },\n\n getCountryISO2ToISO3(country) {\n return Object(country_language__WEBPACK_IMPORTED_MODULE_1__[\"getLanguage\"])(country).iso639_2en;\n },\n\n toggleConfigOption(option) {\n const {\n show\n } = this;\n const {\n config\n } = show;\n this.show.config[option] = !this.show.config[option];\n const data = {\n config: {\n [option]: config[option]\n }\n };\n _api__WEBPACK_IMPORTED_MODULE_4__[\"api\"].patch('series/' + show.id.slug, data).then(_ => {\n this.$snotify.success(`${data.config[option] ? 'enabled' : 'disabled'} show option ${option}`, 'Saved', {\n timeout: 5000\n });\n }).catch(error => {\n this.$snotify.error('Error while trying to save \"' + show.title + '\": ' + error.message || false, 'Error');\n });\n },\n\n reflowLayout() {\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_6__[\"attachImdbTooltip\"])(); // eslint-disable-line no-undef\n }\n\n },\n watch: {\n jumpToSeason(season) {\n // Don't jump until an option is selected\n if (season !== 'jump') {\n // Calculate duration\n let duration = (this.seasons.length - season) * 50;\n duration = Math.max(500, Math.min(duration, 2000)); // Limit to (500ms <= duration <= 2000ms)\n // Calculate offset\n\n let offset = -50; // Navbar\n // Needs extra offset when the sub menu is \"fixed\".\n\n offset -= window.matchMedia('(min-width: 1281px)').matches ? 40 : 0;\n const name = `season-${season}`;\n console.debug(`Jumping to #${name} (${duration}ms)`);\n Object(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__[\"scrollTo\"])(`[name=\"${name}\"]`, duration, {\n container: 'body',\n easing: 'ease-in-out',\n offset\n }); // Update URL hash\n\n window.location.hash = name; // Reset jump\n\n this.jumpToSeason = 'jump';\n }\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./src/components/show-history.vue?vue&type=script&lang=js&": +/*!************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options!./src/components/show-history.vue?vue&type=script&lang=js& ***! + \************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\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//\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//\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/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n mixins: [Object(_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_3__[\"manageCookieMixin\"])('showHistory')],\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n }\n },\n\n data() {\n const {\n getCookie\n } = this;\n const columns = [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n // E.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date',\n hidden: getCookie('Date')\n }, {\n label: 'Status',\n field: 'statusName',\n hidden: getCookie('Status')\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number',\n hidden: getCookie('Quality')\n }, {\n label: 'Provider/Group',\n field: 'provider.id',\n hidden: getCookie('Provider/Group')\n }, {\n label: 'Release',\n field: 'resource',\n hidden: getCookie('Release')\n }, {\n label: 'Season',\n field: 'season',\n type: 'number',\n hidden: getCookie('Season')\n }, {\n label: 'Episode',\n field: 'episode',\n type: 'number',\n hidden: getCookie('Episode')\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number',\n hidden: getCookie('Size')\n }];\n\n if (this.episode) {\n columns.find(column => column.label === 'Season').hidden = true;\n columns.find(column => column.label === 'Episode').hidden = true;\n }\n\n return {\n columns,\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_5__[\"addQTip\"])();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config.general,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory',\n getShowHistory: 'getHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowHistory,\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n if (episode) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } else {\n getShowHistory(show.id.slug);\n }\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season\n } = this;\n\n if (!show.id.slug) {\n return;\n }\n\n if (episode) {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } else {\n // As this is not an episode search, we're returning all results for the specific season.\n this.history = getSeasonHistory({\n showSlug: show.id.slug,\n season\n });\n }\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -536,7 +560,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _mixins_show_list__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../mixins/show-list */ \"./src/mixins/show-list.js\");\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//\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//\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//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'banner',\n components: {\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Asset\"],\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"AppLink\"],\n ProgressBar: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"ProgressBar\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"QualityPill\"],\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"]\n },\n mixins: [Object(_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_2__[\"manageCookieMixin\"])('home-hide-field'), _mixins_show_list__WEBPACK_IMPORTED_MODULE_3__[\"showlistTableMixin\"]],\n props: {\n layout: {\n validator: val => val === null || typeof val === 'string',\n required: true\n },\n shows: {\n type: Array,\n required: true\n },\n listTitle: {\n type: String\n },\n header: {\n type: Boolean\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-list/banner.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _mixins_show_list__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../mixins/show-list */ \"./src/mixins/show-list.js\");\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//\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//\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//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'banner',\n components: {\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Asset\"],\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"AppLink\"],\n ProgressBar: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"ProgressBar\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"QualityPill\"],\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"]\n },\n mixins: [Object(_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_2__[\"manageCookieMixin\"])('home-banner'), _mixins_show_list__WEBPACK_IMPORTED_MODULE_3__[\"showlistTableMixin\"]],\n props: {\n layout: {\n validator: val => val === null || typeof val === 'string',\n required: true\n },\n shows: {\n type: Array,\n required: true\n },\n listTitle: {\n type: String\n },\n header: {\n type: Boolean\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-list/banner.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -548,7 +572,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _banner_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./banner.vue */ \"./src/components/show-list/banner.vue\");\n/* harmony import */ var _simple_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./simple.vue */ \"./src/components/show-list/simple.vue\");\n/* harmony import */ var _poster_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./poster.vue */ \"./src/components/show-list/poster.vue\");\n/* harmony import */ var _smallposter_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./smallposter.vue */ \"./src/components/show-list/smallposter.vue\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../helpers */ \"./src/components/helpers/index.js\");\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//\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/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-list',\n components: {\n Banner: _banner_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n Simple: _simple_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n Poster: _poster_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n PosterSizeSlider: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"PosterSizeSlider\"],\n Smallposter: _smallposter_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"StateSwitch\"]\n },\n props: {\n layout: {\n validator: layout => [null, '', 'poster', 'banner', 'simple', 'small'].includes(layout),\n required: true\n },\n shows: {\n type: Array,\n required: true\n },\n listTitle: {\n type: String\n },\n header: {\n type: Boolean\n }\n },\n\n data() {\n return {\n postSortDirOptions: [{\n value: '0',\n text: 'Descending'\n }, {\n value: '1',\n text: 'Ascending'\n }],\n posterSortByOptions: [{\n text: 'Name',\n value: 'name'\n }, {\n text: 'Next episode',\n value: 'date'\n }, {\n text: 'Network',\n value: 'network'\n }, {\n text: 'Progress',\n value: 'progress'\n }, {\n text: 'Indexer',\n value: 'indexer'\n }]\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n stateLayout: state => state.layout,\n showsLoading: state => state.shows.loading\n }),\n\n mappedLayout() {\n const {\n layout\n } = this;\n\n if (layout === 'small') {\n return 'smallposter';\n }\n\n return layout;\n },\n\n posterUiSortBy: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n posterSortby\n } = stateLayout;\n return posterSortby;\n },\n\n set(value) {\n const {\n setPosterSortBy\n } = this;\n setPosterSortBy({\n value\n });\n }\n\n },\n posterUiSortDir: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n posterSortdir\n } = stateLayout;\n return posterSortdir;\n },\n\n set(value) {\n const {\n setPosterSortDir\n } = this;\n setPosterSortDir({\n value\n });\n }\n\n },\n\n sortedShows() {\n const {\n shows,\n stateLayout\n } = this;\n const {\n sortArticle\n } = stateLayout;\n\n const removeArticle = str => sortArticle ? str.replace(/^((?:a(?!\\s+to)n?)|the)\\s/i, '') : str;\n\n return shows.concat().sort((a, b) => removeArticle(a.title).toLowerCase().localeCompare(removeArticle(b.title).toLowerCase()));\n },\n\n test() {\n return this.showsLoading.finished;\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setPosterSortBy: 'setPosterSortBy',\n setPosterSortDir: 'setPosterSortDir'\n })\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-list/index.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _banner_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./banner.vue */ \"./src/components/show-list/banner.vue\");\n/* harmony import */ var _simple_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./simple.vue */ \"./src/components/show-list/simple.vue\");\n/* harmony import */ var _poster_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./poster.vue */ \"./src/components/show-list/poster.vue\");\n/* harmony import */ var _smallposter_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./smallposter.vue */ \"./src/components/show-list/smallposter.vue\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../helpers */ \"./src/components/helpers/index.js\");\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//\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/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-list',\n components: {\n Banner: _banner_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n Simple: _simple_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n Poster: _poster_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n PosterSizeSlider: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"PosterSizeSlider\"],\n Smallposter: _smallposter_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_5__[\"StateSwitch\"]\n },\n props: {\n layout: {\n validator: layout => [null, '', 'poster', 'banner', 'simple', 'small'].includes(layout),\n required: true\n },\n shows: {\n type: Array,\n required: true\n },\n listTitle: {\n type: String\n },\n header: {\n type: Boolean\n }\n },\n\n data() {\n return {\n postSortDirOptions: [{\n value: '0',\n text: 'Descending'\n }, {\n value: '1',\n text: 'Ascending'\n }],\n posterSortByOptions: [{\n text: 'Name',\n value: 'name'\n }, {\n text: 'Next episode',\n value: 'date'\n }, {\n text: 'Network',\n value: 'network'\n }, {\n text: 'Progress',\n value: 'progress'\n }, {\n text: 'Indexer',\n value: 'indexer'\n }]\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n stateLayout: state => state.config.layout,\n showsLoading: state => state.shows.loading\n }),\n\n mappedLayout() {\n const {\n layout\n } = this;\n\n if (layout === 'small') {\n return 'smallposter';\n }\n\n return layout;\n },\n\n posterUiSortBy: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n posterSortby\n } = stateLayout;\n return posterSortby;\n },\n\n set(value) {\n const {\n setPosterSortBy\n } = this;\n setPosterSortBy({\n value\n });\n }\n\n },\n posterUiSortDir: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n posterSortdir\n } = stateLayout;\n return posterSortdir;\n },\n\n set(value) {\n const {\n setPosterSortDir\n } = this;\n setPosterSortDir({\n value\n });\n }\n\n },\n\n sortedShows() {\n const {\n shows,\n stateLayout\n } = this;\n const {\n sortArticle\n } = stateLayout;\n\n const removeArticle = str => sortArticle ? str.replace(/^((?:a(?!\\s+to)n?)|the)\\s/i, '') : str;\n\n return shows.concat().sort((a, b) => removeArticle(a.title).toLowerCase().localeCompare(removeArticle(b.title).toLowerCase()));\n },\n\n test() {\n return this.showsLoading.finished;\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setPosterSortBy: 'setPosterSortBy',\n setPosterSortDir: 'setPosterSortDir'\n })\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-list/index.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -560,7 +584,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var pretty_bytes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! pretty-bytes */ \"./node_modules/pretty-bytes/index.js\");\n/* harmony import */ var pretty_bytes__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(pretty_bytes__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var vueisotope__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vueisotope */ \"./node_modules/vueisotope/dist/vue_isotope.min.js\");\n/* harmony import */ var vueisotope__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vueisotope__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vanilla-lazyload */ \"./node_modules/vanilla-lazyload/dist/lazyload.min.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vanilla_lazyload__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var vue_images_loaded__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vue-images-loaded */ \"./node_modules/vue-images-loaded/dist/vueimagesloaded.js\");\n/* harmony import */ var vue_images_loaded__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(vue_images_loaded__WEBPACK_IMPORTED_MODULE_5__);\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//\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\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'poster',\n directives: {\n imagesLoaded: (vue_images_loaded__WEBPACK_IMPORTED_MODULE_5___default())\n },\n components: {\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"Asset\"],\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ProgressBar: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ProgressBar\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"QualityPill\"],\n Isotope: (vueisotope__WEBPACK_IMPORTED_MODULE_3___default())\n },\n props: {\n layout: {\n validator: val => val === null || typeof val === 'string',\n required: true\n },\n shows: {\n type: Array,\n required: true\n },\n listTitle: {\n type: String\n },\n header: {\n type: Boolean\n }\n },\n\n data() {\n return {\n // Isotope stuff\n itemSelector: '.show-container',\n selected: null,\n option: {\n getSortData: {\n id: row => row.id.slug,\n name: 'title',\n date: row => {\n const {\n maxNextAirDate\n } = this;\n\n if (row.nextAirDate && Date.parse(row.nextAirDate) > Date.now()) {\n return Date.parse(row.nextAirDate) - Date.now();\n }\n\n if (row.prevAirDate) {\n return maxNextAirDate + Date.now() - Date.parse(row.prevAirDate);\n }\n\n return Date.now();\n },\n network: 'network',\n progress: row => {\n if (!row.stats) {\n return 0;\n }\n\n return Math.round(row.stats.episodes.downloaded / row.stats.episodes.total * 100);\n },\n indexer: row => {\n const {\n indexers\n } = this;\n return indexers[row.indexer].id;\n }\n },\n sortBy: () => this.posterSortBy,\n layoutMode: 'fitRows',\n sortAscending: () => this.posterSortDir\n },\n fontSize: null,\n logoWidth: null,\n borderRadius: null,\n borderWidth: null,\n isotopeLoaded: false,\n imgLazyLoad: null\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n stateLayout: state => state.layout,\n indexers: state => state.indexers.indexers,\n // Need to map these computed, as we need them in the $watch.\n posterSortBy: state => state.layout.posterSortby,\n posterSortDir: state => state.layout.posterSortdir,\n posterSize: state => state.layout.posterSize,\n currentShowTab: state => state.layout.currentShowTab\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n sortedShows() {\n const {\n shows,\n maxNextAirDate\n } = this;\n\n if (shows.length === 0 || !maxNextAirDate) {\n return [];\n }\n\n return shows;\n },\n\n showContainerStyle() {\n const {\n posterSize,\n borderWidth,\n borderRadius\n } = this;\n return {\n width: posterSize + 'px',\n borderWidth: borderWidth + 'px',\n borderRadius: borderRadius + 'px'\n };\n },\n\n maxNextAirDate() {\n const {\n shows\n } = this;\n return Math.max(...shows.filter(show => show.nextAirDate).map(show => Date.parse(show.nextAirDate)));\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setPosterSize: 'setPosterSize'\n }),\n prettyBytes: bytes => pretty_bytes__WEBPACK_IMPORTED_MODULE_1___default()(bytes),\n\n showIndexerUrl(show) {\n const {\n indexers\n } = this;\n\n if (!show.indexer) {\n return;\n }\n\n const id = show.id[show.indexer];\n const indexerUrl = indexers[show.indexer].showUrl;\n return `${indexerUrl}${id}`;\n },\n\n parsePrevDateFn(row) {\n const {\n fuzzyParseDateTime\n } = this;\n\n if (row.prevAirDate) {\n console.log(`Calculating time for show ${row.title} prev date: ${row.prevAirDate}`);\n return fuzzyParseDateTime(row.prevAirDate);\n }\n\n return '';\n },\n\n parseNextDateFn(row) {\n const {\n fuzzyParseDateTime\n } = this;\n\n if (row.nextAirDate) {\n console.log(`Calculating time for show ${row.title} next date: ${row.nextAirDate}`);\n return fuzzyParseDateTime(row.nextAirDate);\n }\n\n return '';\n },\n\n calculateSize() {\n const {\n posterSize\n } = this;\n\n if (posterSize < 125) {\n // Small\n this.fontSize = null;\n this.borderRadius = 3;\n this.borderWidth = 4;\n } else if (posterSize < 175) {\n // Medium\n this.fontSize = 9;\n this.logoWidth = 40;\n this.borderRadius = 4;\n this.borderWidth = 5;\n } else {\n // Large\n this.fontSize = 11;\n this.logoWidth = 50;\n this.borderRadius = 6;\n this.borderWidth = 6;\n }\n },\n\n updateLayout() {\n const {\n calculateSize,\n imgLazyLoad,\n listTitle,\n posterSortBy,\n posterSortDir\n } = this;\n this.isotopeLoaded = true;\n imgLazyLoad.update();\n calculateSize(); // Render layout (for sizing)\n\n this.$refs[`isotope-${listTitle}`].layout(); // Arrange & Sort\n\n this.$refs[`isotope-${listTitle}`].arrange({\n sortBy: posterSortBy,\n sortAscending: posterSortDir\n });\n console.log('isotope Layout loaded');\n },\n\n dateOrStatus(show) {\n if (show.nextAirDate) {\n const {\n fuzzyParseDateTime\n } = this;\n return fuzzyParseDateTime(show.nextAirDate);\n }\n\n if (!show.status.includes('nded') && show.config.paused) {\n return 'Paused';\n }\n\n return show.status;\n }\n\n },\n\n mounted() {\n this.imgLazyLoad = new vanilla_lazyload__WEBPACK_IMPORTED_MODULE_4___default.a({\n threshold: 500\n });\n },\n\n watch: {\n posterSortBy(key) {\n const {\n listTitle\n } = this;\n this.$refs[`isotope-${listTitle}`].sort(key);\n },\n\n posterSortDir(value) {\n const {\n listTitle,\n posterSortBy\n } = this;\n this.$refs[`isotope-${listTitle}`].arrange({\n sortBy: posterSortBy,\n sortAscending: value\n });\n },\n\n posterSize(oldSize, newSize) {\n const {\n calculateSize,\n isotopeLoaded,\n listTitle\n } = this;\n\n if (!isotopeLoaded || oldSize === newSize) {\n return;\n }\n\n calculateSize();\n this.$nextTick(() => {\n this.$refs[`isotope-${listTitle}`].arrange();\n });\n },\n\n currentShowTab() {\n const {\n isotopeLoaded,\n listTitle\n } = this;\n\n if (!isotopeLoaded) {\n return;\n }\n\n this.$nextTick(() => {\n this.$refs[`isotope-${listTitle}`].arrange();\n });\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-list/poster.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var pretty_bytes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! pretty-bytes */ \"./node_modules/pretty-bytes/index.js\");\n/* harmony import */ var pretty_bytes__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(pretty_bytes__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var vueisotope__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vueisotope */ \"./node_modules/vueisotope/dist/vue_isotope.min.js\");\n/* harmony import */ var vueisotope__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vueisotope__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var vue_images_loaded__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vue-images-loaded */ \"./node_modules/vue-images-loaded/dist/vueimagesloaded.js\");\n/* harmony import */ var vue_images_loaded__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vue_images_loaded__WEBPACK_IMPORTED_MODULE_4__);\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//\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\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'poster',\n directives: {\n imagesLoaded: (vue_images_loaded__WEBPACK_IMPORTED_MODULE_4___default())\n },\n components: {\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"Asset\"],\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ProgressBar: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ProgressBar\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"QualityPill\"],\n Isotope: (vueisotope__WEBPACK_IMPORTED_MODULE_3___default())\n },\n props: {\n layout: {\n validator: val => val === null || typeof val === 'string',\n required: true\n },\n shows: {\n type: Array,\n required: true\n },\n listTitle: {\n type: String\n },\n header: {\n type: Boolean\n }\n },\n\n data() {\n return {\n // Isotope stuff\n itemSelector: '.show-container',\n selected: null,\n option: {\n getSortData: {\n id: row => row.id.slug,\n name: 'title',\n date: row => {\n const {\n maxNextAirDate\n } = this;\n\n if (row.nextAirDate && Date.parse(row.nextAirDate) > Date.now()) {\n return Date.parse(row.nextAirDate) - Date.now();\n }\n\n if (row.prevAirDate) {\n return maxNextAirDate + Date.now() - Date.parse(row.prevAirDate);\n }\n\n return Date.now();\n },\n network: 'network',\n progress: row => {\n if (!row.stats) {\n return 0;\n }\n\n return Math.round(row.stats.episodes.downloaded / row.stats.episodes.total * 100);\n },\n indexer: row => {\n const {\n indexers\n } = this;\n return indexers.indexers[row.indexer].id;\n }\n },\n sortBy: () => this.posterSortBy,\n layoutMode: 'fitRows',\n sortAscending: () => this.posterSortDir\n },\n fontSize: null,\n logoWidth: null,\n borderRadius: null,\n borderWidth: null,\n isotopeLoaded: false,\n imgLazyLoad: null\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config.general,\n stateLayout: state => state.config.layout,\n indexers: state => state.config.indexers,\n // Need to map these computed, as we need them in the $watch.\n posterSortBy: state => state.config.layout.posterSortby,\n posterSortDir: state => state.config.layout.posterSortdir,\n posterSize: state => state.config.layout.local.posterSize,\n currentShowTab: state => state.config.layout.local.currentShowTab\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n sortedShows() {\n const {\n shows,\n maxNextAirDate\n } = this;\n\n if (shows.length === 0 || !maxNextAirDate) {\n return [];\n }\n\n return shows;\n },\n\n showContainerStyle() {\n const {\n posterSize,\n borderWidth,\n borderRadius\n } = this;\n return {\n width: posterSize + 'px',\n borderWidth: borderWidth + 'px',\n borderRadius: borderRadius + 'px'\n };\n },\n\n maxNextAirDate() {\n const {\n shows\n } = this;\n return Math.max(...shows.filter(show => show.nextAirDate).map(show => Date.parse(show.nextAirDate)));\n }\n\n },\n methods: {\n prettyBytes: bytes => pretty_bytes__WEBPACK_IMPORTED_MODULE_1___default()(bytes),\n\n showIndexerUrl(show) {\n const {\n indexers\n } = this;\n\n if (!show.indexer) {\n return;\n }\n\n const id = show.id[show.indexer];\n const indexerUrl = indexers.indexers[show.indexer].showUrl;\n return `${indexerUrl}${id}`;\n },\n\n parsePrevDateFn(row) {\n const {\n fuzzyParseDateTime\n } = this;\n\n if (row.prevAirDate) {\n console.log(`Calculating time for show ${row.title} prev date: ${row.prevAirDate}`);\n return fuzzyParseDateTime(row.prevAirDate);\n }\n\n return '';\n },\n\n parseNextDateFn(row) {\n const {\n fuzzyParseDateTime\n } = this;\n\n if (row.nextAirDate) {\n console.log(`Calculating time for show ${row.title} next date: ${row.nextAirDate}`);\n return fuzzyParseDateTime(row.nextAirDate);\n }\n\n return '';\n },\n\n calculateSize() {\n const {\n posterSize\n } = this;\n\n if (posterSize < 125) {\n // Small\n this.fontSize = null;\n this.borderRadius = 3;\n this.borderWidth = 4;\n } else if (posterSize < 175) {\n // Medium\n this.fontSize = 9;\n this.logoWidth = 40;\n this.borderRadius = 4;\n this.borderWidth = 5;\n } else {\n // Large\n this.fontSize = 11;\n this.logoWidth = 50;\n this.borderRadius = 6;\n this.borderWidth = 6;\n }\n },\n\n updateLayout() {\n const {\n calculateSize,\n listTitle,\n posterSortBy,\n posterSortDir\n } = this;\n this.isotopeLoaded = true;\n calculateSize(); // Render layout (for sizing)\n\n this.$refs[`isotope-${listTitle}`].layout(); // Arrange & Sort\n\n this.$refs[`isotope-${listTitle}`].arrange({\n sortBy: posterSortBy,\n sortAscending: posterSortDir\n });\n console.log('isotope Layout loaded');\n },\n\n dateOrStatus(show) {\n if (show.nextAirDate) {\n const {\n fuzzyParseDateTime\n } = this;\n return fuzzyParseDateTime(show.nextAirDate);\n }\n\n if (!show.status.includes('nded') && show.config.paused) {\n return 'Paused';\n }\n\n return show.status;\n }\n\n },\n watch: {\n posterSortBy(key) {\n const {\n listTitle\n } = this;\n this.$refs[`isotope-${listTitle}`].sort(key);\n },\n\n posterSortDir(value) {\n const {\n listTitle,\n posterSortBy\n } = this;\n this.$refs[`isotope-${listTitle}`].arrange({\n sortBy: posterSortBy,\n sortAscending: value\n });\n },\n\n posterSize(oldSize, newSize) {\n const {\n calculateSize,\n isotopeLoaded,\n listTitle\n } = this;\n\n if (!isotopeLoaded || oldSize === newSize) {\n return;\n }\n\n calculateSize();\n this.$nextTick(() => {\n this.$refs[`isotope-${listTitle}`].arrange();\n });\n },\n\n currentShowTab() {\n const {\n isotopeLoaded,\n listTitle\n } = this;\n\n if (!isotopeLoaded) {\n return;\n }\n\n this.$nextTick(() => {\n this.$refs[`isotope-${listTitle}`].arrange();\n });\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-list/poster.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -572,7 +596,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _mixins_show_list__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../mixins/show-list */ \"./src/mixins/show-list.js\");\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//\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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'simple',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"AppLink\"],\n ProgressBar: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"ProgressBar\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"QualityPill\"],\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"]\n },\n mixins: [Object(_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_2__[\"manageCookieMixin\"])('home'), _mixins_show_list__WEBPACK_IMPORTED_MODULE_3__[\"showlistTableMixin\"]],\n props: {\n layout: {\n validator: val => val === null || typeof val === 'string',\n required: true\n },\n shows: {\n type: Array,\n required: true\n },\n listTitle: {\n type: String\n },\n header: {\n type: Boolean\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-list/simple.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _mixins_show_list__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../mixins/show-list */ \"./src/mixins/show-list.js\");\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//\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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'simple',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"AppLink\"],\n ProgressBar: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"ProgressBar\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"QualityPill\"],\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"]\n },\n mixins: [Object(_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_2__[\"manageCookieMixin\"])('home-simple'), _mixins_show_list__WEBPACK_IMPORTED_MODULE_3__[\"showlistTableMixin\"]],\n props: {\n layout: {\n validator: val => val === null || typeof val === 'string',\n required: true\n },\n shows: {\n type: Array,\n required: true\n },\n listTitle: {\n type: String\n },\n header: {\n type: Boolean\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-list/simple.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -584,7 +608,19 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _mixins_show_list__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../mixins/show-list */ \"./src/mixins/show-list.js\");\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//\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//\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//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'smallposter',\n components: {\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Asset\"],\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"AppLink\"],\n ProgressBar: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"ProgressBar\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"QualityPill\"],\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"]\n },\n mixins: [Object(_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_2__[\"manageCookieMixin\"])('home-hide-field'), _mixins_show_list__WEBPACK_IMPORTED_MODULE_3__[\"showlistTableMixin\"]],\n props: {\n layout: {\n validator: val => val === null || typeof val === 'string',\n required: true\n },\n shows: {\n type: Array,\n required: true\n },\n listTitle: {\n type: String\n },\n header: {\n type: Boolean\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-list/smallposter.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _mixins_show_list__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../mixins/show-list */ \"./src/mixins/show-list.js\");\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//\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//\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//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'smallposter',\n components: {\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Asset\"],\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"AppLink\"],\n ProgressBar: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"ProgressBar\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_0__[\"QualityPill\"],\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"]\n },\n mixins: [Object(_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_2__[\"manageCookieMixin\"])('home-small-poster'), _mixins_show_list__WEBPACK_IMPORTED_MODULE_3__[\"showlistTableMixin\"]],\n props: {\n layout: {\n validator: val => val === null || typeof val === 'string',\n required: true\n },\n shows: {\n type: Array,\n required: true\n },\n listTitle: {\n type: String\n },\n header: {\n type: Boolean\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-list/smallposter.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./src/components/show-results.vue?vue&type=script&lang=js&": +/*!************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options!./src/components/show-results.vue?vue&type=script&lang=js& ***! + \************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../mixins/manage-cookie */ \"./src/mixins/manage-cookie.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\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//\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//\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\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_4__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"]\n },\n mixins: [Object(_mixins_manage_cookie__WEBPACK_IMPORTED_MODULE_3__[\"manageCookieMixin\"])('showResults')],\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n const {\n getCookie\n } = this;\n return {\n columns: [{\n label: 'Release',\n field: 'release',\n tdClass: 'release',\n hidden: getCookie('Release')\n }, {\n label: 'Group',\n field: 'releaseGroup',\n hidden: getCookie('Group')\n }, {\n label: 'Provider',\n field: 'provider.name',\n hidden: getCookie('Provider')\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number',\n hidden: getCookie('Quality')\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number',\n hidden: getCookie('Seeds')\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number',\n hidden: getCookie('Peers')\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_6__[\"humanFileSize\"],\n type: 'number',\n hidden: getCookie('Size')\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n // E.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss',\n hidden: getCookie('Added')\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n hidden: getCookie('Published')\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss',\n hidden: getCookie('Updated')\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n async mounted() {\n const {\n forceSearch,\n getProviders,\n getProviderCacheResults,\n show,\n season,\n episode\n } = this;\n await getProviders();\n const result = await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // TODO: put a modal in between\n\n if (result.providersSearched > 0 && result.totalSearchResults.length === 0) {\n forceSearch();\n }\n\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_7__[\"addQTip\"])();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config.general,\n layout: state => state.config.layout,\n search: state => state.config.search,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n const sortedHistory = episodeHistory.sort(item => item.actionDate).reverse();\n\n for (const historyRow of sortedHistory) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => {\n if (episode) {\n return searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode);\n }\n\n return searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.seasonPack;\n }).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode or season slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_6__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n const {\n episode,\n episodeSlug,\n season,\n show\n } = this;\n let data = {};\n data = {\n showSlug: show.id.slug,\n options: {},\n [episode ? 'episodes' : 'season']: [episodeSlug]\n };\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n const {\n effectiveIgnored,\n effectiveRequired,\n search,\n show\n } = this;\n const classes = [row.status || 'skipped'];\n\n const getReleaseNameClasses = name => {\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n\n return classes;\n };\n\n return [...classes, ...getReleaseNameClasses(row.release)].join(' ');\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode,\n episodeSlug\n } = this; // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n } // Update qTip\n\n\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_7__[\"addQTip\"])();\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -596,7 +632,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__[\"AppLink\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired'\n }),\n\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return Number(this.$route.query.season) || undefined;\n },\n\n episode() {\n return Number(this.$route.query.episode) || undefined;\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShow: 'getShow' // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n\n }),\n\n /**\n * Attaches IMDB tooltip,\n */\n reflowLayout() {\n attachImdbTooltip(); // eslint-disable-line no-undef\n },\n\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (this.$store.state.search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n /** Disabled for now. Because global + series ignored can be concatenated or excluded. So it's not that simple to color them. */\n // if (this.show.config.release.ignoredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-ignored');\n // }\n // if (this.show.config.release.requiredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-required');\n // }\n\n\n return classes.join(' ');\n }\n\n },\n\n mounted() {\n const {\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n }); // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n }\n\n this.$watch('show', () => {\n this.$nextTick(() => this.reflowLayout());\n });\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.reflowLayout();\n });\n });\n\n const updateSpinner = function (message, showSpinner) {\n // Get spinner object as needed\n const spinner = $('#searchNotification');\n\n if (showSpinner) {\n message = ' ' + message;\n }\n\n $(spinner).empty().append(message);\n }; // Check the previous status of the history table, for hidden or shown, through the data attribute\n // data-history-toggle-hidden\n\n\n function toggleHistoryTable() {\n // eslint-disable-line no-unused-vars\n // Get previous state which was saved on the wrapper\n const showOrHide = $('#wrapper').attr('data-history-toggle');\n $('#historydata').collapse(showOrHide);\n }\n\n $.fn.loadContainer = function (path, loadingTxt, errorTxt, callback) {\n updateSpinner(loadingTxt);\n $('#manualSearchMeta').load(path + ' #manualSearchMeta meta');\n $(this).load(path + ' #manualSearchTbody tr', (response, status) => {\n if (status === 'error') {\n updateSpinner(errorTxt, false);\n }\n\n if (typeof callback !== 'undefined') {\n callback();\n }\n });\n }; // Click event for the download button for snatching a result\n\n\n $(document.body).on('click', '.epManualSearch', event => {\n event.preventDefault();\n const link = event.currentTarget;\n $(link).children('img').prop('src', 'images/loading16.gif');\n $.getJSON(event.currentTarget.href, data => {\n if (data.result === 'success') {\n $(link).children('img').prop('src', 'images/save.png');\n } else {\n $(link).children('img').prop('src', 'images/no16.png');\n }\n });\n });\n\n function initTableSorter(table) {\n // Nasty hack to re-initialize tablesorter after refresh\n $(table).tablesorter({\n widgets: ['saveSort', 'stickyHeaders', 'columnSelector', 'filter'],\n widgetOptions: {\n filter_columnFilters: true,\n // eslint-disable-line camelcase\n filter_hideFilters: true,\n // eslint-disable-line camelcase\n filter_saveFilters: true,\n // eslint-disable-line camelcase\n columnSelector_saveColumns: true,\n // eslint-disable-line camelcase\n columnSelector_layout: '',\n // eslint-disable-line camelcase\n columnSelector_mediaquery: false,\n // eslint-disable-line camelcase\n columnSelector_cssChecked: 'checked' // eslint-disable-line camelcase\n\n },\n textExtraction: function () {\n return {\n // 2: Provider\n 2(node) {\n return $(node).find('img').attr('title');\n },\n\n // 6: The size column needs an explicit field for the filtering on raw size.\n 6(node) {\n return node.getAttribute('data-size');\n },\n\n // 9: Published date\n 9(node) {\n return node.getAttribute('data-datetime');\n },\n\n // 10: Added date\n 10(node) {\n return node.getAttribute('data-datetime');\n }\n\n };\n }(),\n headers: {\n 9: {\n sorter: 'realISODate'\n },\n // Published\n 10: {\n sorter: 'realISODate'\n },\n // Added\n 11: {\n sorter: false,\n parser: false\n } // Snatch link\n\n }\n });\n }\n\n function checkCacheUpdates(repeat) {\n let pollInterval = 5000;\n repeat = repeat || true;\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const data = $('meta[data-last-prov-updates]').data('last-prov-updates');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + ` indexerName: ${indexerName}, seriesId: ${seriesId}, season: ${season}, episode: ${episode}`);\n return;\n }\n\n let urlParams = '?indexername=' + indexerName + '&seriesid=' + seriesId + '&season=' + season + '&episode=' + episode;\n\n if (manualSearchType === 'season') {\n urlParams += '&manual_search_type=' + manualSearchType;\n }\n\n if (!$.isNumeric(seriesId) || !$.isNumeric(season) || !$.isNumeric(episode)) {\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 200);\n }\n\n $.ajax({\n url: 'home/manualSearchCheckCache' + urlParams,\n type: 'GET',\n data,\n contentType: 'application/json',\n\n error() {\n // Repeat = false;\n console.log('Error occurred!!');\n $('.manualSearchButton').removeAttr('disabled');\n },\n\n complete() {\n if (repeat) {\n setTimeout(checkCacheUpdates, pollInterval);\n }\n },\n\n timeout: 15000 // Timeout after 15s\n\n }).done(data => {\n // @TODO: Combine the lower if statements\n if (data === '') {\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n }\n\n if (data.result === 'refresh') {\n window.location.reload();\n updateSpinner('Refreshed results...', true);\n }\n\n if (data.result === 'searching') {\n // Ep is searched, you will get a results any minute now\n pollInterval = 5000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode is being searched, please wait......', true);\n }\n\n if (data.result === 'queued') {\n // Ep is queued, this might take some time to get results\n pollInterval = 7000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode has been queued, because another search is taking place. please wait..', true);\n }\n\n if (data.result === 'finished') {\n // Ep search is finished\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n $('#srchresults').trigger('update', true);\n $('[datetime]').timeago();\n }\n\n if (data.result === 'error') {\n // Ep search is finished but with an error\n console.log('Probably tried to call manualSelectCheckCache, while page was being refreshed.');\n $('.manualSearchButton').removeAttr('disabled');\n repeat = true;\n }\n });\n }\n\n setTimeout(checkCacheUpdates, 2000); // Click event for the reload results and force search buttons\n\n $(document.body).on('click', '.manualSearchButton', event => {\n event.preventDefault();\n $('.manualSearchButton').prop('disabled', true);\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const forceSearch = $(event.currentTarget).attr('data-force-search');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + ` indexerName: ${indexerName}, seriesId: ${seriesId}, season: ${season}, episode: ${episode}`);\n return;\n }\n\n if ($.isNumeric(seriesId) && $.isNumeric(season) && $.isNumeric(episode)) {\n updateSpinner('Started a forced manual search...', true);\n $.getJSON('home/snatchSelection', {\n indexername: indexerName,\n seriesid: seriesId,\n season,\n episode,\n manual_search_type: manualSearchType,\n // eslint-disable-line camelcase\n perform_search: forceSearch // eslint-disable-line camelcase\n\n }); // Force the search, but give the checkCacheUpdates the time to start up a search thread\n\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 2000);\n }\n }); // Moved and rewritten this from displayShow. This changes the button when clicked for collapsing/expanding the\n // \"Show History\" button to show or hide the snatch/download/failed history for a manual searched episode or pack.\n\n $('#popover').popover({\n placement: 'bottom',\n html: true,\n // Required if content has HTML\n content: ''\n }).on('shown.bs.popover', () => {\n // Bootstrap popover event triggered when the popover opens\n $.tablesorter.columnSelector.attachTo($('#srchresults'), '#popover-target');\n });\n $('#btnReset').click(() => {\n $('#showTable').trigger('saveSortReset') // Clear saved sort\n .trigger('sortReset'); // Reset current table sort\n\n return false;\n });\n initTableSorter('#srchresults');\n this.reflowLayout();\n $('body').on('hide.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Show History');\n $('#wrapper').prop('data-history-toggle', 'hide');\n });\n $('body').on('show.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Hide History');\n $('#wrapper').prop('data-history-toggle', 'show');\n });\n $(document.body).on('click', '.release-name-ellipses, .release-name-ellipses-toggled', event => {\n const target = $(event.currentTarget);\n\n if (target.hasClass('release-name-ellipses')) {\n target.switchClass('release-name-ellipses', 'release-name-ellipses-toggled', 100);\n } else {\n target.switchClass('release-name-ellipses-toggled', 'release-name-ellipses', 100);\n }\n });\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _show_results_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-results.vue */ \"./src/components/show-results.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\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/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n ShowHistory: _show_history_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n ShowResults: _show_results_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config.general,\n search: state => state.config.search,\n history: state => state.history\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired',\n getShowHistoryBySlug: 'getShowHistoryBySlug',\n getEpisode: 'getEpisode'\n }),\n\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid);\n },\n\n season() {\n return Number(this.$route.query.season);\n },\n\n episode() {\n if (this.$route.query.manual_search_type === 'season') {\n return;\n }\n\n return Number(this.$route.query.episode);\n },\n\n manualSearchType() {\n return this.$route.query.manual_search_type;\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getHistory: 'getHistory'\n }),\n\n // TODO: Move this to show-results!\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n search,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n\n return classes.join(' ');\n }\n\n },\n\n mounted() {\n const {\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n }); // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n }\n }\n\n});\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -608,7 +644,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'status',\n template: '#status-template',\n computed: Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])(['config']),\n\n mounted() {\n $('#schedulerStatusTable').tablesorter({\n widgets: ['saveSort', 'zebra'],\n textExtraction: {\n 5(node) {\n return $(node).data('seconds');\n },\n\n 6(node) {\n return $(node).data('seconds');\n }\n\n },\n headers: {\n 5: {\n sorter: 'digit'\n },\n 6: {\n sorter: 'digit'\n }\n }\n });\n $('#queueStatusTable').tablesorter({\n widgets: ['saveSort', 'zebra'],\n sortList: [[3, 0], [4, 0], [2, 1]]\n });\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/status.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'status',\n template: '#status-template',\n computed: Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config\n }),\n\n mounted() {\n $('#schedulerStatusTable').tablesorter({\n widgets: ['saveSort', 'zebra'],\n textExtraction: {\n 5(node) {\n return $(node).data('seconds');\n },\n\n 6(node) {\n return $(node).data('seconds');\n }\n\n },\n headers: {\n 5: {\n sorter: 'digit'\n },\n 6: {\n sorter: 'digit'\n }\n }\n });\n $('#queueStatusTable').tablesorter({\n widgets: ['saveSort', 'zebra'],\n sortList: [[3, 0], [4, 0], [2, 1]]\n });\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/status.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -632,7 +668,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'subtitle-search',\n components: {\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n episode: {\n type: Object,\n required: true\n },\n lang: {\n type: String,\n required: false\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Filename',\n field: 'filename'\n }, {\n label: 'Language',\n field: 'lang'\n }, {\n label: 'Provider',\n field: 'provider'\n }, {\n label: 'Score',\n field: 'score',\n type: 'number'\n }, {\n label: 'Sub Score',\n field: 'sub_score',\n type: 'number'\n }, {\n label: 'Missing Matches',\n field: rowObj => {\n if (rowObj.missing_guess) {\n return rowObj.missing_guess.join(', ');\n }\n },\n type: 'array'\n }, {\n label: 'Download',\n field: 'download',\n sortable: false\n }],\n subtitles: [],\n displayQuestion: false,\n loading: false,\n loadingMessage: ''\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getLastReleaseName: 'getLastReleaseName'\n }),\n\n releaseName() {\n const {\n episode,\n getLastReleaseName,\n show\n } = this;\n const lastKnownReleaseName = getLastReleaseName({\n showSlug: show.id.slug,\n episodeSlug: episode.slug\n });\n\n if (lastKnownReleaseName) {\n return `Select subtitle for release: ${lastKnownReleaseName}`;\n }\n\n return 'Could not get a downloaded release name from the history table';\n },\n\n subtitleParams() {\n const {\n episode,\n show\n } = this;\n const params = {\n indexername: show.indexer,\n seriesid: show.id[show.indexer],\n season: episode.season,\n episode: episode.episode\n };\n return params;\n }\n\n },\n\n mounted() {\n this.displayQuestion = true;\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])(['getShowEpisodeHistory']),\n\n autoSearch() {\n const {\n lang,\n subtitleParams\n } = this;\n const params = subtitleParams;\n\n if (lang !== undefined) {\n params.lang = lang;\n }\n\n this.displayQuestion = false;\n this.loadingMessage = 'Searching for subtitles and downloading if available... ';\n this.loading = true;\n Object(_api__WEBPACK_IMPORTED_MODULE_2__[\"apiRoute\"])('home/searchEpisodeSubtitles', {\n params\n }).then(response => {\n if (response.data.result !== 'failure') {\n // Update the show, as we have new information (subtitles)\n // Let's emit an event, telling the displayShow component, to update the show using the api/store.\n this.$emit('update', {\n reason: 'new subtitles found',\n codes: response.data.subtitles,\n languages: response.data.languages\n });\n }\n }).catch(error => {\n console.log(`Error trying to search for subtitles. Error: ${error}`);\n }).finally(() => {\n // Cleanup\n this.loadingMessage = '';\n this.loading = false;\n this.close();\n });\n },\n\n manualSearch() {\n const {\n episode,\n getShowEpisodeHistory,\n show,\n subtitleParams\n } = this;\n this.displayQuestion = false;\n this.loading = true;\n this.loadingMessage = 'Searching for subtitles... ';\n Object(_api__WEBPACK_IMPORTED_MODULE_2__[\"apiRoute\"])('home/manualSearchSubtitles', {\n params: subtitleParams\n }).then(response => {\n if (response.data.result === 'success') {\n this.subtitles.push(...response.data.subtitles); // Load episode history if we have subtitles.\n\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: episode.slug\n });\n }\n }).catch(error => {\n console.log(`Error trying to search for subtitles. Error: ${error}`);\n }).finally(() => {\n this.loading = false;\n });\n },\n\n redownloadLang() {\n const {\n subtitleParams\n } = this;\n Object(_api__WEBPACK_IMPORTED_MODULE_2__[\"apiRoute\"])('home/searchEpisodeSubtitles', {\n params: subtitleParams\n }).then(response => {\n if (response.data.result !== 'failure') {\n // Update the show, as we have new information (subtitles)\n // Let's emit an event, telling the displayShow component, to update the show using the api/store.\n this.$emit('update', {\n reason: 'new subtitles found',\n codes: response.data.subtitles,\n languages: response.data.languages\n });\n }\n }).catch(error => {\n console.log(`Error trying to search for subtitles. Error: ${error}`);\n }).finally(() => {\n // Cleanup\n this.loadingMessage = '';\n this.loading = false;\n this.close();\n });\n },\n\n pickSubtitle(subtitleId) {\n // Download and save this subtitle with the episode.\n const {\n subtitleParams\n } = this;\n const params = { ...subtitleParams,\n picked_id: subtitleId // eslint-disable-line camelcase\n\n };\n this.displayQuestion = false;\n this.loadingMessage = 'downloading subtitle... ';\n this.loading = true;\n Object(_api__WEBPACK_IMPORTED_MODULE_2__[\"apiRoute\"])('home/manualSearchSubtitles', {\n params\n }).then(response => {\n if (response.data.result === 'success') {\n // Update the show, as we have new information (subtitles)\n // Let's emit an event, telling the displayShow component, to update the show using the api/store.\n this.$emit('update', {\n reason: 'new subtitles found',\n codes: response.data.subtitles,\n languages: response.data.languages\n });\n }\n }).catch(error => {\n console.log(`Error trying to search for subtitles. Error: ${error}`);\n }).finally(() => {\n // Cleanup\n this.loadingMessage = '';\n this.loading = false;\n this.close();\n });\n },\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/subtitle-search.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\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//\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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'subtitle-search',\n components: {\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n episode: {\n type: Object,\n required: true\n },\n lang: {\n type: String,\n required: false\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Filename',\n field: 'filename'\n }, {\n label: 'Language',\n field: 'lang'\n }, {\n label: 'Provider',\n field: 'provider'\n }, {\n label: 'Score',\n field: 'score',\n type: 'number'\n }, {\n label: 'Sub Score',\n field: 'sub_score',\n type: 'number'\n }, {\n label: 'Missing Matches',\n field: rowObj => {\n if (rowObj.missing_guess) {\n return rowObj.missing_guess.join(', ');\n }\n },\n type: 'array'\n }, {\n label: 'Download',\n field: 'download',\n sortable: false\n }],\n subtitles: [],\n displayQuestion: false,\n searchType: null,\n loading: false,\n loadingMessage: ''\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n general: state => state.config.general\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getLastReleaseName: 'getLastReleaseName'\n }),\n\n releaseName() {\n const {\n episode,\n getLastReleaseName,\n show\n } = this;\n const lastKnownReleaseName = getLastReleaseName({\n showSlug: show.id.slug,\n episodeSlug: episode.slug\n });\n\n if (lastKnownReleaseName) {\n return `Select subtitle for release: ${lastKnownReleaseName}`;\n }\n\n return 'Could not get a downloaded release name from the history table';\n },\n\n subtitleParams() {\n const {\n episode,\n show\n } = this;\n const params = {\n indexername: show.indexer,\n seriesid: show.id[show.indexer],\n season: episode.season,\n episode: episode.episode\n };\n return params;\n }\n\n },\n\n mounted() {\n this.displayQuestion = true;\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])(['getShowEpisodeHistory']),\n\n autoSearch() {\n this.searchType = 'auto';\n const {\n lang,\n subtitleParams\n } = this;\n const params = subtitleParams;\n\n if (lang !== undefined) {\n params.lang = lang;\n }\n\n this.displayQuestion = false;\n this.loadingMessage = 'Searching for subtitles and downloading if available... ';\n this.loading = true;\n Object(_api__WEBPACK_IMPORTED_MODULE_2__[\"apiRoute\"])('home/searchEpisodeSubtitles', {\n params\n }).then(response => {\n if (response.data.result !== 'failure') {\n // Update the show, as we have new information (subtitles)\n // Let's emit an event, telling the displayShow component, to update the show using the api/store.\n this.$emit('update', {\n reason: 'new subtitles found',\n codes: response.data.subtitles,\n languages: response.data.languages\n });\n }\n }).catch(error => {\n console.log(`Error trying to search for subtitles. Error: ${error}`);\n }).finally(() => {\n // Cleanup\n this.loadingMessage = '';\n this.loading = false;\n this.close();\n });\n },\n\n manualSearch() {\n this.searchType = 'manual';\n const {\n episode,\n getShowEpisodeHistory,\n show,\n subtitleParams\n } = this;\n this.displayQuestion = false;\n this.loading = true;\n this.loadingMessage = 'Searching for subtitles... ';\n Object(_api__WEBPACK_IMPORTED_MODULE_2__[\"apiRoute\"])('home/manualSearchSubtitles', {\n params: subtitleParams\n }).then(response => {\n if (response.data.result === 'success') {\n this.subtitles.push(...response.data.subtitles); // Load episode history if we have subtitles.\n\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: episode.slug\n });\n }\n }).catch(error => {\n console.log(`Error trying to search for subtitles. Error: ${error}`);\n }).finally(() => {\n this.loading = false;\n });\n },\n\n redownloadLang() {\n const {\n subtitleParams\n } = this;\n Object(_api__WEBPACK_IMPORTED_MODULE_2__[\"apiRoute\"])('home/searchEpisodeSubtitles', {\n params: subtitleParams\n }).then(response => {\n if (response.data.result !== 'failure') {\n // Update the show, as we have new information (subtitles)\n // Let's emit an event, telling the displayShow component, to update the show using the api/store.\n this.$emit('update', {\n reason: 'new subtitles found',\n codes: response.data.subtitles,\n languages: response.data.languages\n });\n }\n }).catch(error => {\n console.log(`Error trying to search for subtitles. Error: ${error}`);\n }).finally(() => {\n // Cleanup\n this.loadingMessage = '';\n this.loading = false;\n this.close();\n });\n },\n\n pickSubtitle(subtitleId) {\n // Download and save this subtitle with the episode.\n const {\n subtitleParams\n } = this;\n const params = { ...subtitleParams,\n picked_id: subtitleId // eslint-disable-line camelcase\n\n };\n this.displayQuestion = false;\n this.loadingMessage = 'downloading subtitle... ';\n this.loading = true;\n Object(_api__WEBPACK_IMPORTED_MODULE_2__[\"apiRoute\"])('home/manualSearchSubtitles', {\n params\n }).then(response => {\n if (response.data.result === 'success') {\n // Update the show, as we have new information (subtitles)\n // Let's emit an event, telling the displayShow component, to update the show using the api/store.\n this.$emit('update', {\n reason: 'new subtitles found',\n codes: response.data.subtitles,\n languages: response.data.languages\n });\n }\n }).catch(error => {\n console.log(`Error trying to search for subtitles. Error: ${error}`);\n }).finally(() => {\n // Cleanup\n this.loadingMessage = '';\n this.loading = false;\n this.close();\n });\n },\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/subtitle-search.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -687,7 +723,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.vgt-global-search__input.vgt-pull-left[data-v-6dfe8938] {\\n float: left;\\n height: 40px;\\n}\\n.vgt-input[data-v-6dfe8938] {\\n border: 1px solid #ccc;\\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\\n height: 30px;\\n padding: 5px 10px;\\n font-size: 12px;\\n line-height: 1.5;\\n border-radius: 3px;\\n}\\ndiv.vgt-responsive > table tbody > tr > th.vgt-row-header > span[data-v-6dfe8938] {\\n font-size: 24px;\\n margin-top: 20px;\\n margin-bottom: 10px;\\n}\\n.fanartBackground.displayShow[data-v-6dfe8938] {\\n clear: both;\\n opacity: 0.9;\\n}\\n.defaultTable.displayShow[data-v-6dfe8938] {\\n clear: both;\\n}\\n.displayShowTable.displayShow[data-v-6dfe8938] {\\n clear: both;\\n}\\n.fanartBackground table[data-v-6dfe8938] {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.summaryFanArt[data-v-6dfe8938] {\\n opacity: 0.9;\\n}\\n.fanartBackground > table th.vgt-row-header[data-v-6dfe8938] {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.fanartBackground td.col-search[data-v-6dfe8938] {\\n text-align: center;\\n}\\n\\n/* Trying to migrate this from tablesorter */\\n\\n/* =======================================================================\\ntablesorter.css\\n========================================================================== */\\n.displayShow[data-v-6dfe8938] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n color: rgb(0, 0, 0);\\n text-align: left;\\n border-spacing: 0;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th,\\n.displayShow[data-v-6dfe8938] .vgt-table td {\\n padding: 4px;\\n border-top: rgb(34, 34, 34) 1px solid;\\n border-left: rgb(34, 34, 34) 1px solid;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.displayShow[data-v-6dfe8938] .vgt-table th:first-child,\\n.displayShow[data-v-6dfe8938] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th {\\n /* color: rgb(255, 255, 255); */\\n text-align: center;\\n text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);\\n background-color: rgb(51, 51, 51);\\n border-collapse: collapse;\\n font-weight: normal;\\n white-space: nowrap;\\n color: rgb(255, 255, 255);\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting.sorting-desc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting.sorting-asc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th {\\n background-image: none;\\n padding: 4px;\\n cursor: default;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tr.tablesorter-filter-row,\\n.displayShow[data-v-6dfe8938] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.displayShow[data-v-6dfe8938] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-6dfe8938] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tfoot tr {\\n color: rgb(255, 255, 255);\\n text-align: center;\\n text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);\\n background-color: rgb(51, 51, 51);\\n border-collapse: collapse;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tfoot a {\\n color: rgb(255, 255, 255);\\n text-decoration: none;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.displayShow[data-v-6dfe8938] .unaired {\\n background-color: rgb(245, 241, 228);\\n}\\n.displayShow[data-v-6dfe8938] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.displayShow[data-v-6dfe8938] .preferred {\\n background-color: rgb(195, 227, 200);\\n}\\n.displayShow[data-v-6dfe8938] .archived {\\n background-color: rgb(195, 227, 200);\\n}\\n.displayShow[data-v-6dfe8938] .allowed {\\n background-color: rgb(255, 218, 138);\\n}\\n.displayShow[data-v-6dfe8938] .wanted {\\n background-color: rgb(255, 176, 176);\\n}\\n.displayShow[data-v-6dfe8938] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.displayShow[data-v-6dfe8938] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.displayShow[data-v-6dfe8938] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.displayShow[data-v-6dfe8938] span.unaired {\\n color: rgb(88, 75, 32);\\n}\\n.displayShow[data-v-6dfe8938] span.skipped {\\n color: rgb(29, 80, 104);\\n}\\n.displayShow[data-v-6dfe8938] span.preffered {\\n color: rgb(41, 87, 48);\\n}\\n.displayShow[data-v-6dfe8938] span.allowed {\\n color: rgb(118, 81, 0);\\n}\\n.displayShow[data-v-6dfe8938] span.wanted {\\n color: rgb(137, 0, 0);\\n}\\n.displayShow[data-v-6dfe8938] span.snatched {\\n color: rgb(101, 33, 100);\\n}\\n.displayShow[data-v-6dfe8938] span.unaired b,\\n.displayShow[data-v-6dfe8938] span.skipped b,\\n.displayShow[data-v-6dfe8938] span.preferred b,\\n.displayShow[data-v-6dfe8938] span.allowed b,\\n.displayShow[data-v-6dfe8938] span.wanted b,\\n.displayShow[data-v-6dfe8938] span.snatched b {\\n color: rgb(0, 0, 0);\\n font-weight: 800;\\n}\\ntd.col-footer[data-v-6dfe8938] {\\n text-align: left !important;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer {\\n color: rgb(255, 255, 255);\\n padding: 1em;\\n background-color: rgb(51, 51, 51);\\n margin-bottom: 1em;\\n display: flex;\\n justify-content: space-between;\\n}\\n.displayShow[data-v-6dfe8938] .footer__row-count,\\n.displayShow[data-v-6dfe8938] .footer__navigation__page-info {\\n display: inline;\\n}\\n.displayShow[data-v-6dfe8938] .footer__row-count__label {\\n margin-right: 1em;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation {\\n font-size: 14px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-pull-right {\\n float: right !important;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__page-btn .chevron {\\n width: 24px;\\n height: 24px;\\n border-radius: 15%;\\n position: relative;\\n margin: 0 8px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__info,\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__page-info {\\n display: inline-flex;\\n color: #909399;\\n margin: 0 16px;\\n margin-top: 0;\\n margin-right: 16px;\\n margin-bottom: 0;\\n margin-left: 16px;\\n}\\n.select-info span[data-v-6dfe8938] {\\n margin-left: 5px;\\n line-height: 40px;\\n}\\n\\n/** Style the modal. This should be saved somewhere, where we create one modal template with slots, and style that. */\\n.modal-container[data-v-6dfe8938] {\\n border: 1px solid rgb(17, 17, 17);\\n box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.175);\\n border-radius: 0;\\n}\\n.modal-header[data-v-6dfe8938] {\\n padding: 9px 15px;\\n border-bottom: none;\\n border-radius: 0;\\n background-color: rgb(55, 55, 55);\\n}\\n.modal-content[data-v-6dfe8938] {\\n background: rgb(34, 34, 34);\\n border-radius: 0;\\n border: 1px solid rgba(0, 0, 0, 0.2);\\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\\n color: white;\\n}\\n.modal-body[data-v-6dfe8938] {\\n background: rgb(34, 34, 34);\\n overflow-y: auto;\\n}\\n.modal-footer[data-v-6dfe8938] {\\n border-top: none;\\n text-align: center;\\n}\\n.subtitles > div[data-v-6dfe8938] {\\n float: left;\\n}\\n.subtitles > div[data-v-6dfe8938]:not(:last-child) {\\n margin-right: 2px;\\n}\\n.align-center[data-v-6dfe8938] {\\n display: flex;\\n justify-content: center;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.vgt-global-search__input.vgt-pull-left[data-v-6dfe8938] {\\n float: left;\\n height: 40px;\\n}\\n.vgt-input[data-v-6dfe8938] {\\n border: 1px solid #ccc;\\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\\n height: 30px;\\n padding: 5px 10px;\\n font-size: 12px;\\n line-height: 1.5;\\n border-radius: 3px;\\n}\\ndiv.vgt-responsive > table tbody > tr > th.vgt-row-header > span[data-v-6dfe8938] {\\n font-size: 24px;\\n margin-top: 20px;\\n margin-bottom: 10px;\\n}\\n.defaultTable.displayShow[data-v-6dfe8938] {\\n clear: both;\\n}\\n.displayShowTable.displayShow[data-v-6dfe8938] {\\n clear: both;\\n}\\n.fanartBackground.displayShow[data-v-6dfe8938] {\\n clear: both;\\n opacity: 0.9;\\n}\\n.fanartBackground table[data-v-6dfe8938] {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.summaryFanArt[data-v-6dfe8938] {\\n opacity: 0.9;\\n}\\n.fanartBackground > table th.vgt-row-header[data-v-6dfe8938] {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.fanartBackground td.col-search[data-v-6dfe8938] {\\n text-align: center;\\n}\\n\\n/* Trying to migrate this from tablesorter */\\n\\n/* =======================================================================\\ntablesorter.css\\n========================================================================== */\\n.displayShow[data-v-6dfe8938] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n color: rgb(0, 0, 0);\\n text-align: left;\\n border-spacing: 0;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th,\\n.displayShow[data-v-6dfe8938] .vgt-table td {\\n padding: 4px;\\n border-top: rgb(34, 34, 34) 1px solid;\\n border-left: rgb(34, 34, 34) 1px solid;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.displayShow[data-v-6dfe8938] .vgt-table th:first-child,\\n.displayShow[data-v-6dfe8938] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th {\\n /* color: rgb(255, 255, 255); */\\n text-align: center;\\n text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);\\n background-color: rgb(51, 51, 51);\\n border-collapse: collapse;\\n font-weight: normal;\\n white-space: nowrap;\\n color: rgb(255, 255, 255);\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting.sorting-desc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting.sorting-asc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th {\\n background-image: none;\\n padding: 4px;\\n cursor: default;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tr.tablesorter-filter-row,\\n.displayShow[data-v-6dfe8938] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.displayShow[data-v-6dfe8938] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-6dfe8938] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tfoot tr {\\n color: rgb(255, 255, 255);\\n text-align: center;\\n text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);\\n background-color: rgb(51, 51, 51);\\n border-collapse: collapse;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tfoot a {\\n color: rgb(255, 255, 255);\\n text-decoration: none;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.displayShow[data-v-6dfe8938] .unaired {\\n background-color: rgb(245, 241, 228);\\n}\\n.displayShow[data-v-6dfe8938] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.displayShow[data-v-6dfe8938] .preferred {\\n background-color: rgb(195, 227, 200);\\n}\\n.displayShow[data-v-6dfe8938] .archived {\\n background-color: rgb(195, 227, 200);\\n}\\n.displayShow[data-v-6dfe8938] .allowed {\\n background-color: rgb(255, 218, 138);\\n}\\n.displayShow[data-v-6dfe8938] .wanted {\\n background-color: rgb(255, 176, 176);\\n}\\n.displayShow[data-v-6dfe8938] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.displayShow[data-v-6dfe8938] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.displayShow[data-v-6dfe8938] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.displayShow[data-v-6dfe8938] span.unaired {\\n color: rgb(88, 75, 32);\\n}\\n.displayShow[data-v-6dfe8938] span.skipped {\\n color: rgb(29, 80, 104);\\n}\\n.displayShow[data-v-6dfe8938] span.preffered {\\n color: rgb(41, 87, 48);\\n}\\n.displayShow[data-v-6dfe8938] span.allowed {\\n color: rgb(118, 81, 0);\\n}\\n.displayShow[data-v-6dfe8938] span.wanted {\\n color: rgb(137, 0, 0);\\n}\\n.displayShow[data-v-6dfe8938] span.snatched {\\n color: rgb(101, 33, 100);\\n}\\n.displayShow[data-v-6dfe8938] span.unaired b,\\n.displayShow[data-v-6dfe8938] span.skipped b,\\n.displayShow[data-v-6dfe8938] span.preferred b,\\n.displayShow[data-v-6dfe8938] span.allowed b,\\n.displayShow[data-v-6dfe8938] span.wanted b,\\n.displayShow[data-v-6dfe8938] span.snatched b {\\n color: rgb(0, 0, 0);\\n font-weight: 800;\\n}\\ntd.col-footer[data-v-6dfe8938] {\\n text-align: left !important;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer {\\n color: rgb(255, 255, 255);\\n padding: 1em;\\n background-color: rgb(51, 51, 51);\\n margin-bottom: 1em;\\n display: flex;\\n justify-content: space-between;\\n}\\n.displayShow[data-v-6dfe8938] .footer__row-count,\\n.displayShow[data-v-6dfe8938] .footer__navigation__page-info {\\n display: inline;\\n}\\n.displayShow[data-v-6dfe8938] .footer__row-count__label {\\n margin-right: 1em;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation {\\n font-size: 14px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-pull-right {\\n float: right !important;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__page-btn .chevron {\\n width: 24px;\\n height: 24px;\\n border-radius: 15%;\\n position: relative;\\n margin: 0 8px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__info,\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__page-info {\\n display: inline-flex;\\n color: #909399;\\n margin: 0 16px;\\n margin-top: 0;\\n margin-right: 16px;\\n margin-bottom: 0;\\n margin-left: 16px;\\n}\\n.select-info span[data-v-6dfe8938] {\\n margin-left: 5px;\\n line-height: 40px;\\n}\\n\\n/** Style the modal. This should be saved somewhere, where we create one modal template with slots, and style that. */\\n.modal-container[data-v-6dfe8938] {\\n border: 1px solid rgb(17, 17, 17);\\n box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.175);\\n border-radius: 0;\\n}\\n.modal-header[data-v-6dfe8938] {\\n padding: 9px 15px;\\n border-bottom: none;\\n border-radius: 0;\\n background-color: rgb(55, 55, 55);\\n}\\n.modal-content[data-v-6dfe8938] {\\n background: rgb(34, 34, 34);\\n border-radius: 0;\\n border: 1px solid rgba(0, 0, 0, 0.2);\\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\\n color: white;\\n}\\n.modal-body[data-v-6dfe8938] {\\n background: rgb(34, 34, 34);\\n overflow-y: auto;\\n}\\n.modal-footer[data-v-6dfe8938] {\\n border-top: none;\\n text-align: center;\\n}\\n.subtitles > div[data-v-6dfe8938] {\\n float: left;\\n}\\n.subtitles > div[data-v-6dfe8938]:not(:last-child) {\\n margin-right: 2px;\\n}\\n.align-center[data-v-6dfe8938] {\\n display: flex;\\n justify-content: center;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -698,7 +734,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\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\\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\\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\\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\\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\\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@NOTE: This fixes the header blocking elements when using a hash link\\ne.g. displayShow?indexername=tvdb&seriesid=83462#season-5\\n*/\\n[false-link]::before {\\n content: '';\\n display: block;\\n position: absolute;\\n height: 100px;\\n margin-top: -100px;\\n z-index: -100;\\n}\\n.router-link,\\n.router-link-active {\\n cursor: pointer;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/helpers/app-link.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\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\\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\\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\\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\\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\\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@NOTE: This fixes the header blocking elements when using a hash link\\ne.g. displayShow?indexername=tvdb&seriesid=83462#season-5\\n*/\\n[false-link]::before {\\n content: '';\\n display: block;\\n position: absolute;\\n height: 100px;\\n margin-top: -100px;\\n z-index: -100;\\n}\\n.router-link,\\n.router-link-active {\\n cursor: pointer;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/helpers/app-link.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -709,7 +745,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.width-40[data-v-77ce7ff4] {\\n width: 40px;\\n}\\n.width-50[data-v-77ce7ff4] {\\n width: 50px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/helpers/asset.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.width-40[data-v-77ce7ff4] {\\n width: 40px;\\n}\\n.width-50[data-v-77ce7ff4] {\\n width: 50px;\\n}\\n\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/helpers/asset.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -768,6 +804,17 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /***/ }), +/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./src/components/helpers/lazy-image.vue?vue&type=style&index=0&id=2a36af9c&scoped=true&lang=css&": +/*!*********************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./src/components/helpers/lazy-image.vue?vue&type=style&index=0&id=2a36af9c&scoped=true&lang=css& ***! + \*********************************************************************************************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.app-image[data-v-2a36af9c] {\\n max-width: 100%;\\n max-height: 100%;\\n width: auto;\\n height: auto;\\n vertical-align: middle;\\n}\\nimg[data-v-2a36af9c]:not([src]) {\\n visibility: hidden;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/helpers/lazy-image.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./src/components/helpers/load-progress-bar.vue?vue&type=style&index=0&lang=css&": /*!****************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./src/components/helpers/load-progress-bar.vue?vue&type=style&index=0&lang=css& ***! @@ -907,7 +954,18 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.summaryTable[data-v-2465ca06] {\\n overflow: hidden;\\n}\\n.summaryTable tr td[data-v-2465ca06] {\\n word-break: break-word;\\n}\\n.ver-spacer[data-v-2465ca06] {\\n width: 15px;\\n}\\n#show-specials-and-seasons[data-v-2465ca06] {\\n margin-bottom: 15px;\\n}\\nspan.required[data-v-2465ca06] {\\n color: green;\\n}\\nspan.preferred[data-v-2465ca06] {\\n color: rgb(41, 87, 48);\\n}\\nspan.undesired[data-v-2465ca06] {\\n color: orange;\\n}\\nspan.ignored[data-v-2465ca06] {\\n color: red;\\n}\\n.shadow-background[data-v-2465ca06] {\\n padding: 10px;\\n}\\n#col-show-summary[data-v-2465ca06] {\\n display: table;\\n}\\n#col-show-summary[data-v-2465ca06] img.show-image {\\n width: 180px;\\n}\\n.show-poster-container[data-v-2465ca06] {\\n margin-right: 10px;\\n display: table-cell;\\n width: 180px;\\n}\\n.show-info-container[data-v-2465ca06] {\\n overflow: hidden;\\n display: table-cell;\\n}\\n.showLegend[data-v-2465ca06] {\\n padding-right: 6px;\\n padding-bottom: 1px;\\n width: 150px;\\n}\\n.invalid-value[data-v-2465ca06] {\\n color: rgb(255, 0, 0);\\n}\\n@media (min-width: 768px) {\\n.display-specials[data-v-2465ca06],\\n .display-seasons[data-v-2465ca06] {\\n top: -60px;\\n}\\n#show-specials-and-seasons[data-v-2465ca06] {\\n bottom: 5px;\\n right: 15px;\\n position: absolute;\\n}\\n}\\n@media (max-width: 767px) {\\n.show-poster-container[data-v-2465ca06] {\\n display: inline-block;\\n width: 100%;\\n margin: 0 auto;\\n border-style: none;\\n}\\n.show-poster-container[data-v-2465ca06] img {\\n display: block;\\n margin: 0 auto;\\n max-width: 280px !important;\\n}\\n.show-info-container[data-v-2465ca06] {\\n display: block;\\n padding-top: 5px;\\n width: 100%;\\n}\\n}\\n@media (max-width: 991px) and (min-width: 768px) {\\n.show-poster-container[data-v-2465ca06] {\\n float: left;\\n display: inline-block;\\n width: 100%;\\n border-style: none;\\n}\\n.show-info-container[data-v-2465ca06] {\\n display: block;\\n width: 100%;\\n}\\n#col-show-summary[data-v-2465ca06] img.show-image {\\n width: 280px;\\n}\\n}\\n.unaired[data-v-2465ca06] {\\n background-color: rgb(245, 241, 228);\\n}\\n.skipped[data-v-2465ca06] {\\n background-color: rgb(190, 222, 237);\\n}\\n.preferred[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.archived[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.allowed[data-v-2465ca06] {\\n background-color: rgb(255, 218, 138);\\n}\\n.wanted[data-v-2465ca06] {\\n background-color: rgb(255, 176, 176);\\n}\\n.snatched[data-v-2465ca06] {\\n background-color: rgb(235, 193, 234);\\n}\\n.downloaded[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.failed[data-v-2465ca06] {\\n background-color: rgb(255, 153, 153);\\n}\\nspan.unaired[data-v-2465ca06] {\\n color: rgb(88, 75, 32);\\n}\\nspan.skipped[data-v-2465ca06] {\\n color: rgb(29, 80, 104);\\n}\\nspan.preffered[data-v-2465ca06] {\\n color: rgb(41, 87, 48);\\n}\\nspan.allowed[data-v-2465ca06] {\\n color: rgb(118, 81, 0);\\n}\\nspan.wanted[data-v-2465ca06] {\\n color: rgb(137, 0, 0);\\n}\\nspan.snatched[data-v-2465ca06] {\\n color: rgb(101, 33, 100);\\n}\\nspan.unaired b[data-v-2465ca06],\\nspan.skipped b[data-v-2465ca06],\\nspan.preferred b[data-v-2465ca06],\\nspan.allowed b[data-v-2465ca06],\\nspan.wanted b[data-v-2465ca06],\\nspan.snatched b[data-v-2465ca06] {\\n color: rgb(0, 0, 0);\\n font-weight: 800;\\n}\\nspan.global-filter[data-v-2465ca06] {\\n font-style: italic;\\n}\\n.show-status[data-v-2465ca06] {\\n font-size: 11px;\\n text-align: left;\\n display: block;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.summaryTable[data-v-2465ca06] {\\n overflow: hidden;\\n}\\n.summaryTable tr td[data-v-2465ca06] {\\n word-break: break-word;\\n}\\n.ver-spacer[data-v-2465ca06] {\\n width: 15px;\\n}\\n#showtitle[data-v-2465ca06] {\\n float: none;\\n}\\n#show-specials-and-seasons[data-v-2465ca06] {\\n bottom: 5px;\\n right: 15px;\\n position: absolute;\\n}\\n.episode-info span[data-v-2465ca06] {\\n display: block;\\n}\\nspan.required[data-v-2465ca06] {\\n color: green;\\n}\\nspan.preferred[data-v-2465ca06] {\\n color: rgb(41, 87, 48);\\n}\\nspan.undesired[data-v-2465ca06] {\\n color: orange;\\n}\\nspan.ignored[data-v-2465ca06] {\\n color: red;\\n}\\n.shadow-background[data-v-2465ca06] {\\n padding: 10px;\\n}\\n#col-show-summary[data-v-2465ca06] {\\n display: table;\\n}\\n#col-show-summary[data-v-2465ca06] img.show-image {\\n width: 180px;\\n}\\n.show-poster-container[data-v-2465ca06] {\\n margin-right: 10px;\\n display: table-cell;\\n width: 180px;\\n}\\n.show-info-container[data-v-2465ca06] {\\n overflow: hidden;\\n display: table-cell;\\n}\\n.showLegend[data-v-2465ca06] {\\n padding-right: 6px;\\n padding-bottom: 1px;\\n width: 150px;\\n}\\n.invalid-value[data-v-2465ca06] {\\n color: rgb(255, 0, 0);\\n}\\n@media (min-width: 768px) {\\n.display-specials[data-v-2465ca06],\\n .display-seasons[data-v-2465ca06] {\\n top: -60px;\\n}\\n}\\n@media (max-width: 767px) {\\n.show-poster-container[data-v-2465ca06] {\\n display: inline-block;\\n width: 100%;\\n margin: 0 auto;\\n border-style: none;\\n}\\n.show-poster-container[data-v-2465ca06] img {\\n display: block;\\n margin: 0 auto;\\n max-width: 280px !important;\\n}\\n.show-info-container[data-v-2465ca06] {\\n display: block;\\n padding-top: 5px;\\n width: 100%;\\n}\\n#showtitle[data-v-2465ca06] {\\n margin-bottom: 40px;\\n}\\n#show-specials-and-seasons[data-v-2465ca06] {\\n bottom: -40px;\\n left: 15px;\\n}\\n}\\n@media (max-width: 991px) and (min-width: 768px) {\\n.show-poster-container[data-v-2465ca06] {\\n float: left;\\n display: inline-block;\\n width: 100%;\\n border-style: none;\\n}\\n.show-info-container[data-v-2465ca06] {\\n display: block;\\n width: 100%;\\n}\\n#col-show-summary[data-v-2465ca06] img.show-image {\\n width: 280px;\\n}\\n}\\n.unaired[data-v-2465ca06] {\\n background-color: rgb(245, 241, 228);\\n}\\n.skipped[data-v-2465ca06] {\\n background-color: rgb(190, 222, 237);\\n}\\n.preferred[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.archived[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.allowed[data-v-2465ca06] {\\n background-color: rgb(255, 218, 138);\\n}\\n.wanted[data-v-2465ca06] {\\n background-color: rgb(255, 176, 176);\\n}\\n.snatched[data-v-2465ca06] {\\n background-color: rgb(235, 193, 234);\\n}\\n.downloaded[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.failed[data-v-2465ca06] {\\n background-color: rgb(255, 153, 153);\\n}\\nspan.unaired[data-v-2465ca06] {\\n color: rgb(88, 75, 32);\\n}\\nspan.skipped[data-v-2465ca06] {\\n color: rgb(29, 80, 104);\\n}\\nspan.preffered[data-v-2465ca06] {\\n color: rgb(41, 87, 48);\\n}\\nspan.allowed[data-v-2465ca06] {\\n color: rgb(118, 81, 0);\\n}\\nspan.wanted[data-v-2465ca06] {\\n color: rgb(137, 0, 0);\\n}\\nspan.snatched[data-v-2465ca06] {\\n color: rgb(101, 33, 100);\\n}\\nspan.unaired b[data-v-2465ca06],\\nspan.skipped b[data-v-2465ca06],\\nspan.preferred b[data-v-2465ca06],\\nspan.allowed b[data-v-2465ca06],\\nspan.wanted b[data-v-2465ca06],\\nspan.snatched b[data-v-2465ca06] {\\n color: rgb(0, 0, 0);\\n font-weight: 800;\\n}\\nspan.global-filter[data-v-2465ca06] {\\n font-style: italic;\\n}\\n.show-status[data-v-2465ca06] {\\n font-size: 11px;\\n text-align: left;\\n display: block;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./src/components/show-history.vue?vue&type=style&index=0&id=c645b858&scoped=true&lang=css&": +/*!***************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./src/components/show-history.vue?vue&type=style&index=0&id=c645b858&scoped=true&lang=css& ***! + \***************************************************************************************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\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\\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\\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\\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\\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\\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\\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\\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\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/* Make some room for the Select columns ul / dropdown. */\\n.component-margin[data-v-c645b858] {\\n margin-bottom: 50px;\\n}\\n.show-history-wrapper[data-v-c645b858] table.subtitle-table tr {\\n background-color: rgb(190, 222, 237);\\n}\\n.show-history-wrapper > td[data-v-c645b858] {\\n padding: 0;\\n}\\n.search-question[data-v-c645b858],\\n.loading-message[data-v-c645b858] {\\n background-color: rgb(51, 51, 51);\\n color: rgb(255, 255, 255);\\n padding: 10px;\\n line-height: 55px;\\n}\\nspan.subtitle-name[data-v-c645b858] {\\n color: rgb(0, 0, 0);\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -929,18 +987,18 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.show-container[data-v-54b453c4] {\\n display: inline-block;\\n margin: 4px;\\n border-width: 5px;\\n border-style: solid;\\n overflow: hidden;\\n box-shadow: 1px 1px 3px 0 rgba(0, 0, 0, 0.31);\\n}\\n.show-dlstats[data-v-54b453c4] {\\n font-size: 11px;\\n text-align: left;\\n display: block;\\n margin-left: 4px;\\n}\\n.show-quality[data-v-54b453c4] {\\n font-size: 11px;\\n text-align: right;\\n display: block;\\n margin-right: 4px;\\n}\\n.posterview[data-v-54b453c4] {\\n margin: 0 auto;\\n position: relative;\\n}\\n\\n/* Used by isotope scaling */\\n.show-image[data-v-54b453c4] {\\n max-width: 100%;\\n overflow: hidden;\\n border: 1px solid rgb(136, 136, 136);\\n}\\n.background-image img[data-v-54b453c4] {\\n width: 100%;\\n overflow: hidden;\\n}\\n.poster-overlay[data-v-54b453c4] {\\n position: absolute;\\n}\\n.show-container .ui-progressbar[data-v-54b453c4] {\\n height: 7px !important;\\n top: -2px;\\n}\\n.show-container .ui-corner-all[data-v-54b453c4],\\n.ui-corner-bottom[data-v-54b453c4],\\n.ui-corner-right[data-v-54b453c4],\\n.ui-corner-br[data-v-54b453c4] {\\n border-bottom-right-radius: 0;\\n}\\n.show-container .ui-corner-all[data-v-54b453c4],\\n.ui-corner-bottom[data-v-54b453c4],\\n.ui-corner-left[data-v-54b453c4],\\n.ui-corner-bl[data-v-54b453c4] {\\n border-bottom-left-radius: 0;\\n}\\n.show-container .ui-corner-all[data-v-54b453c4],\\n.ui-corner-top[data-v-54b453c4],\\n.ui-corner-right[data-v-54b453c4],\\n.ui-corner-tr[data-v-54b453c4] {\\n border-top-right-radius: 0;\\n}\\n.show-container .ui-corner-all[data-v-54b453c4],\\n.ui-corner-top[data-v-54b453c4],\\n.ui-corner-left[data-v-54b453c4],\\n.ui-corner-tl[data-v-54b453c4] {\\n border-top-left-radius: 0;\\n}\\n.show-container .ui-widget-content[data-v-54b453c4] {\\n border-top: 1px solid rgb(17, 17, 17);\\n border-bottom: 1px solid rgb(17, 17, 17);\\n border-left: 0;\\n border-right: 0;\\n}\\n.ui-progressbar .progress-20[data-v-54b453c4] {\\n border: none;\\n}\\n.show-container .progress-20[data-v-54b453c4],\\n.show-container .progress-40[data-v-54b453c4],\\n.show-container .progress-60[data-v-54b453c4],\\n.show-container .progress-80[data-v-54b453c4] {\\n border-radius: 0;\\n height: 7px;\\n}\\n.overlay-container[data-v-54b453c4] {\\n display: flex;\\n align-items: center;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/show-list/poster.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.show-container[data-v-54b453c4] {\\n display: inline-block;\\n margin: 4px;\\n border-width: 5px;\\n border-style: solid;\\n overflow: hidden;\\n box-shadow: 1px 1px 3px 0 rgba(0, 0, 0, 0.31);\\n}\\n.show-dlstats[data-v-54b453c4] {\\n font-size: 11px;\\n text-align: left;\\n display: block;\\n margin-left: 4px;\\n}\\n.show-quality[data-v-54b453c4] {\\n font-size: 11px;\\n text-align: right;\\n display: block;\\n margin-right: 4px;\\n}\\n.posterview[data-v-54b453c4] {\\n margin: 0 auto;\\n position: relative;\\n}\\n\\n/* Used by isotope scaling */\\n.show-image[data-v-54b453c4] {\\n max-width: 100%;\\n overflow: hidden;\\n border: 1px solid rgb(136, 136, 136);\\n}\\n.background-image img[data-v-54b453c4] {\\n width: 100%;\\n overflow: hidden;\\n}\\n.poster-overlay[data-v-54b453c4] {\\n position: absolute;\\n}\\n.show-container .ui-progressbar[data-v-54b453c4] {\\n height: 7px !important;\\n top: -2px;\\n}\\n.show-container .ui-corner-all[data-v-54b453c4],\\n.ui-corner-bottom[data-v-54b453c4],\\n.ui-corner-right[data-v-54b453c4],\\n.ui-corner-br[data-v-54b453c4] {\\n border-bottom-right-radius: 0;\\n}\\n.show-container .ui-corner-all[data-v-54b453c4],\\n.ui-corner-bottom[data-v-54b453c4],\\n.ui-corner-left[data-v-54b453c4],\\n.ui-corner-bl[data-v-54b453c4] {\\n border-bottom-left-radius: 0;\\n}\\n.show-container .ui-corner-all[data-v-54b453c4],\\n.ui-corner-top[data-v-54b453c4],\\n.ui-corner-right[data-v-54b453c4],\\n.ui-corner-tr[data-v-54b453c4] {\\n border-top-right-radius: 0;\\n}\\n.show-container .ui-corner-all[data-v-54b453c4],\\n.ui-corner-top[data-v-54b453c4],\\n.ui-corner-left[data-v-54b453c4],\\n.ui-corner-tl[data-v-54b453c4] {\\n border-top-left-radius: 0;\\n}\\n.show-container .ui-widget-content[data-v-54b453c4] {\\n border-top: 1px solid rgb(17, 17, 17);\\n border-bottom: 1px solid rgb(17, 17, 17);\\n border-left: 0;\\n border-right: 0;\\n}\\n.ui-progressbar .progress-20[data-v-54b453c4] {\\n border: none;\\n}\\n.show-container .progress-20[data-v-54b453c4],\\n.show-container .progress-40[data-v-54b453c4],\\n.show-container .progress-60[data-v-54b453c4],\\n.show-container .progress-80[data-v-54b453c4] {\\n border-radius: 0;\\n height: 7px;\\n}\\n.overlay-container[data-v-54b453c4] {\\n display: flex;\\n align-items: baseline;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/show-list/poster.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./src/components/snatch-selection.vue?vue&type=style&index=0&lang=css&": -/*!*******************************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./src/components/snatch-selection.vue?vue&type=style&index=0&lang=css& ***! - \*******************************************************************************************************************************************************************************************************************************/ +/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./src/components/snatch-selection.vue?vue&type=style&index=0&id=0ad4c7fc&scoped=true&lang=css&": +/*!*******************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./src/components/snatch-selection.vue?vue&type=style&index=0&id=0ad4c7fc&scoped=true&lang=css& ***! + \*******************************************************************************************************************************************************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\nspan.global-ignored {\\n color: red;\\n}\\nspan.show-ignored {\\n color: red;\\n font-style: italic;\\n}\\nspan.global-required {\\n color: green;\\n}\\nspan.show-required {\\n color: green;\\n font-style: italic;\\n}\\nspan.global-undesired {\\n color: orange;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\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\\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\\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\\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\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/** Use this as table styling for all table layouts */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th:first-child,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-0ad4c7fc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground {\\n clear: both;\\n opacity: 0.9;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground table {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground > table th.vgt-row-header {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground td.col-search {\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .subtitled {\\n background-color: rgb(190, 222, 237);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .global-ignored td.release span {\\n color: red;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .show-ignored td.release span {\\n color: red;\\n font-style: italic;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .global-required td.release span {\\n color: green;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .show-required td.release span {\\n color: green;\\n font-style: italic;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .global-undesired td.release span {\\n color: orange;\\n}\\n.show-history[data-v-0ad4c7fc] {\\n margin-bottom: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1046,7 +1104,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"config-genaral\" } }, [\n _c(\"div\", { attrs: { id: \"config-content\" } }, [\n _c(\n \"form\",\n {\n attrs: { id: \"configForm\", method: \"post\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.save()\n }\n }\n },\n [\n _c(\"div\", { attrs: { id: \"config-components\" } }, [\n _c(\"ul\", [\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#misc\" } }, [_vm._v(\"Misc\")])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#interface\" } }, [\n _vm._v(\"Interface\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#advanced-settings\" } }, [\n _vm._v(\"Advanced Settings\")\n ])\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"misc\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Launch browser\",\n id: \"launch_browser\"\n },\n model: {\n value: _vm.config.launchBrowser,\n callback: function($$v) {\n _vm.$set(_vm.config, \"launchBrowser\", $$v)\n },\n expression: \"config.launchBrowser\"\n }\n },\n [\n _c(\"span\", [\n _vm._v(\"open the Medusa home page on startup\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"default_page\",\n label: \"Initial page\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.config.defaultPage,\n expression: \"config.defaultPage\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"default_page\",\n name: \"default_page\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.config,\n \"defaultPage\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.defaultPageOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"when launching Medusa interface\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trash_remove_show\",\n label: \"Send to trash for actions\"\n }\n },\n [\n _c(\n \"label\",\n {\n staticClass: \"nextline-block\",\n attrs: { for: \"trash_remove_show\" }\n },\n [\n _c(\"toggle-button\", {\n attrs: {\n width: 45,\n height: 22,\n id: \"trash_remove_show\",\n name: \"trash_remove_show\",\n sync: \"\"\n },\n model: {\n value: _vm.config.trashRemoveShow,\n callback: function($$v) {\n _vm.$set(_vm.config, \"trashRemoveShow\", $$v)\n },\n expression: \"config.trashRemoveShow\"\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n 'when using show \"Remove\" and delete files'\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"label\",\n {\n staticClass: \"nextline-block\",\n attrs: { for: \"trash_rotate_logs\" }\n },\n [\n _c(\"toggle-button\", {\n attrs: {\n width: 45,\n height: 22,\n id: \"trash_rotate_logs\",\n name: \"trash_rotate_logs\",\n sync: \"\"\n },\n model: {\n value: _vm.config.trashRotateLogs,\n callback: function($$v) {\n _vm.$set(_vm.config, \"trashRotateLogs\", $$v)\n },\n expression: \"config.trashRotateLogs\"\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"on scheduled deletes of the oldest log files\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"selected actions use trash (recycle bin) instead of the default permanent delete\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Location for Log files\",\n id: \"log_id\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.config.logs.actualLogDir,\n callback: function($$v) {\n _vm.$set(_vm.config.logs, \"actualLogDir\", $$v)\n },\n expression: \"config.logs.actualLogDir\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Number of Log files saved\",\n id: \"log_nr\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.config.logs.nr,\n callback: function($$v) {\n _vm.$set(_vm.config.logs, \"nr\", $$v)\n },\n expression: \"config.logs.nr\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"number of log files saved when rotating logs (default: 5) \"\n ),\n _c(\"b\", [_vm._v(\"(REQUIRES RESTART)\")])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Size of Log files saved\",\n id: \"log_size\",\n min: 0.5,\n step: 0.1\n },\n model: {\n value: _vm.config.logs.size,\n callback: function($$v) {\n _vm.$set(_vm.config.logs, \"size\", $$v)\n },\n expression: \"config.logs.size\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"maximum size in MB of the log file (default: 1MB) \"\n ),\n _c(\"b\", [_vm._v(\"(REQUIRES RESTART)\")])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"show_root_dir\",\n label: \"Show root directories\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"where the files of shows are located\")\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\"These changes are automatically saved!\")\n ]),\n _vm._v(\" \"),\n _c(\"root-dirs\")\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(1),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"show_root_dir\",\n label: \"Default Indexer Language\"\n }\n },\n [\n _c(\"language-select\", {\n ref: \"indexerLanguage\",\n staticClass:\n \"form-control form-control-inline input-sm\",\n attrs: {\n language: _vm.config.indexerDefaultLanguage,\n available: _vm.indexers.main.validLanguages.join(\n \",\"\n )\n },\n on: {\n \"update-language\": function($event) {\n _vm.config.indexerDefaultLanguage = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"for adding shows and metadata providers\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Choose hour to update shows\",\n id: \"showupdate_hour\",\n min: 0,\n max: 23,\n step: 1\n },\n model: {\n value: _vm.config.showUpdateHour,\n callback: function($$v) {\n _vm.$set(_vm.config, \"showUpdateHour\", $$v)\n },\n expression: \"config.showUpdateHour\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"with information such as next air dates, show ended, etc. Use 15 for 3pm, 4 for 4am etc.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" minutes are randomized each time Medusa is started\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Timeout show indexer at\",\n id: \"indexer_timeout\",\n min: 10,\n step: 1\n },\n model: {\n value: _vm.config.indexerTimeout,\n callback: function($$v) {\n _vm.$set(_vm.config, \"indexerTimeout\", $$v)\n },\n expression: \"config.indexerTimeout\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"seconds of inactivity when finding new shows (default:20)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"indexer_default\",\n label: \"Use initial indexer set to\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.indexerDefault,\n expression: \"indexerDefault\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"indexer_default\",\n name: \"indexer_default\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.indexerDefault = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.indexerListOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable fallback to plex\",\n id: \"fallback_plex_enable\"\n },\n model: {\n value: _vm.config.plexFallBack.enable,\n callback: function($$v) {\n _vm.$set(_vm.config.plexFallBack, \"enable\", $$v)\n },\n expression: \"config.plexFallBack.enable\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Plex provides a tvdb mirror, that can be utilized when Tvdb's api is unavailable.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable fallback notifications\",\n id: \"fallback_plex_notifications\"\n },\n model: {\n value: _vm.config.plexFallBack.notifications,\n callback: function($$v) {\n _vm.$set(\n _vm.config.plexFallBack,\n \"notifications\",\n $$v\n )\n },\n expression: \"config.plexFallBack.notifications\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"When this settings has been enabled, you may receive frequent notifications when falling back to the plex mirror.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Timeout show indexer at\",\n id: \"Fallback duration\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.config.plexFallBack.timeout,\n callback: function($$v) {\n _vm.$set(_vm.config.plexFallBack, \"timeout\", $$v)\n },\n expression: \"config.plexFallBack.timeout\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Amount of hours after we try to revert back to the thetvdb.com api url (default:3).\"\n )\n ])\n ]\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(2),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Check software updates\",\n id: \"version_notify\"\n },\n model: {\n value: _vm.config.versionNotify,\n callback: function($$v) {\n _vm.$set(_vm.config, \"versionNotify\", $$v)\n },\n expression: \"config.versionNotify\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"and display notifications when updates are available.\\n Checks are run on startup and at the frequency set below*\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Automatically update\",\n id: \"auto_update\"\n },\n model: {\n value: _vm.config.autoUpdate,\n callback: function($$v) {\n _vm.$set(_vm.config, \"autoUpdate\", $$v)\n },\n expression: \"config.autoUpdate\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"fetch and install software updates.\\n Updates are run on startup and in the background at the frequency set below*\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Check the server every*\",\n id: \"update_frequency duration\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.config.updateFrequency,\n callback: function($$v) {\n _vm.$set(_vm.config, \"updateFrequency\", $$v)\n },\n expression: \"config.updateFrequency\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"hours for software updates (default:1)\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Notify on software update\",\n id: \"notify_on_update\"\n },\n model: {\n value: _vm.config.notifyOnUpdate,\n callback: function($$v) {\n _vm.$set(_vm.config, \"notifyOnUpdate\", $$v)\n },\n expression: \"config.notifyOnUpdate\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"send a message to all enabled notifiers when Medusa has been updated\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"interface\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(3),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"theme_name\",\n label: \"Display theme\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.themeName,\n expression: \"layout.themeName\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: { id: \"theme_name\", name: \"theme_name\" },\n on: {\n change: [\n function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.layout,\n \"themeName\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n },\n function($event) {\n return _vm.changeTheme(_vm.layout.themeName)\n }\n ]\n }\n },\n _vm._l(_vm.availableThemesOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use wider layout\",\n id: \"layout_wide\"\n },\n model: {\n value: _vm.layout.wide,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"wide\", $$v)\n },\n expression: \"layout.wide\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"uses all available space in the page\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Show fanart in the background\",\n id: \"fanart_background\"\n },\n model: {\n value: _vm.layout.fanartBackground,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"fanartBackground\", $$v)\n },\n expression: \"layout.fanartBackground\"\n }\n },\n [_c(\"p\", [_vm._v(\"on the show summary page\")])]\n ),\n _vm._v(\" \"),\n _vm.layout.fanartBackground\n ? _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Fanart transparency\",\n id: \"fanart_background_opacity duration\",\n step: 0.1,\n min: 0.1,\n max: 1.0\n },\n model: {\n value: _vm.layout.fanartBackgroundOpacity,\n callback: function($$v) {\n _vm.$set(\n _vm.layout,\n \"fanartBackgroundOpacity\",\n $$v\n )\n },\n expression: \"layout.fanartBackgroundOpacity\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Transparency of the fanart in the background\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Sort with 'The' 'A', 'An'\",\n id: \"sort_article\"\n },\n model: {\n value: _vm.layout.sortArticle,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"sortArticle\", $$v)\n },\n expression: \"layout.sortArticle\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'include articles (\"The\", \"A\", \"An\") when sorting show lists'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Missed episodes range\",\n id: \"coming_eps_missed_range duration\",\n step: 1,\n min: 7\n },\n model: {\n value: _vm.layout.comingEps.missedRange,\n callback: function($$v) {\n _vm.$set(_vm.layout.comingEps, \"missedRange\", $$v)\n },\n expression: \"layout.comingEps.missedRange\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Set the range in days of the missed episodes in the Schedule page\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Display fuzzy dates\",\n id: \"fuzzy_dating\"\n },\n model: {\n value: _vm.layout.fuzzyDating,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"fuzzyDating\", $$v)\n },\n expression: \"layout.fuzzyDating\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'move absolute dates into tooltips and display e.g. \"Last Thu\", \"On Tue\"'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Trim zero padding\",\n id: \"trim_zero\"\n },\n model: {\n value: _vm.layout.trimZero,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"trimZero\", $$v)\n },\n expression: \"layout.trimZero\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'remove the leading number \"0\" shown on hour of day, and date of month'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"date_preset\",\n label: \"Date style\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.dateStyle,\n expression: \"layout.dateStyle\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: { id: \"date_preset\", name: \"date_preset\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.layout,\n \"dateStyle\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.datePresetOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"time_preset\",\n label: \"Time style\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.timeStyle,\n expression: \"layout.timeStyle\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: { id: \"time_preset\", name: \"time_preset\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.layout,\n \"timeStyle\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.timePresetOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" seconds are only shown on the History page\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"timezone_display\",\n label: \"Timezone\"\n }\n },\n [\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.timezoneDisplay,\n expression: \"layout.timezoneDisplay\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"timezone_display_local\",\n id: \"timezone_display_local\",\n value: \"local\"\n },\n domProps: {\n checked: _vm._q(\n _vm.layout.timezoneDisplay,\n \"local\"\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.layout,\n \"timezoneDisplay\",\n \"local\"\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"local\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.timezoneDisplay,\n expression: \"layout.timezoneDisplay\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"timezone_display_network\",\n id: \"timezone_display_network\",\n value: \"network\"\n },\n domProps: {\n checked: _vm._q(\n _vm.layout.timezoneDisplay,\n \"network\"\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.layout,\n \"timezoneDisplay\",\n \"network\"\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"network\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"display dates and times in either your timezone or the shows network timezone\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Use local timezone to start searching for episodes minutes after show ends (depends on your dailysearch frequency)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: { label: \"Download url\", id: \"download_url\" },\n model: {\n value: _vm.config.downloadUrl,\n callback: function($$v) {\n _vm.$set(_vm.config, \"downloadUrl\", $$v)\n },\n expression: \"config.downloadUrl\"\n }\n },\n [\n _c(\"span\", { staticClass: \"component-desc\" }, [\n _vm._v(\"URL where the shows can be downloaded.\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Use table pagination\",\n id: \"show_pagination\"\n },\n model: {\n value: _vm.layout.show.pagination.enable,\n callback: function($$v) {\n _vm.$set(_vm.layout.show.pagination, \"enable\", $$v)\n },\n expression: \"layout.show.pagination.enable\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(4),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"API key\",\n id: \"api_key\",\n readonly: \"readonly\"\n },\n model: {\n value: _vm.config.webInterface.apiKey,\n callback: function($$v) {\n _vm.$set(_vm.config.webInterface, \"apiKey\", $$v)\n },\n expression: \"config.webInterface.apiKey\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n id: \"generate_new_apikey\",\n value: \"Generate\"\n },\n on: { click: _vm.generateApiKey }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"used to give 3rd party programs limited access to Medusa\"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"p\",\n [\n _vm._v(\n \"you can try all the features of the legacy API (v1) \"\n ),\n _c(\n \"app-link\",\n { attrs: { href: \"apibuilder/\" } },\n [_vm._v(\"here\")]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"HTTP logs\", id: \"web_log\" },\n model: {\n value: _vm.config.webInterface.log,\n callback: function($$v) {\n _vm.$set(_vm.config.webInterface, \"log\", $$v)\n },\n expression: \"config.webInterface.log\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable logs from the internal Tornado web server\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTP username\",\n id: \"web_username\",\n autocomplete: \"no\"\n },\n model: {\n value: _vm.config.webInterface.username,\n callback: function($$v) {\n _vm.$set(_vm.config.webInterface, \"username\", $$v)\n },\n expression: \"config.webInterface.username\"\n }\n },\n [_c(\"p\", [_vm._v(\"set blank for no login\")])]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTP password\",\n id: \"web_password\",\n type: \"password\",\n autocomplete: \"no\"\n },\n model: {\n value: _vm.config.webInterface.password,\n callback: function($$v) {\n _vm.$set(_vm.config.webInterface, \"password\", $$v)\n },\n expression: \"config.webInterface.password\"\n }\n },\n [_c(\"p\", [_vm._v(\"blank = no authentication\")])]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"HTTP port\",\n id: \"web_port\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.config.webInterface.port,\n callback: function($$v) {\n _vm.$set(_vm.config.webInterface, \"port\", $$v)\n },\n expression: \"config.webInterface.port\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"web port to browse and access Medusa (default:8081)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Notify on login\",\n id: \"notify_on_login\"\n },\n model: {\n value: _vm.config.webInterface.notifyOnLogin,\n callback: function($$v) {\n _vm.$set(\n _vm.config.webInterface,\n \"notifyOnLogin\",\n $$v\n )\n },\n expression: \"config.webInterface.notifyOnLogin\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable to be notified when a new login happens in webserver\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Listen on IPv6\", id: \"web_ipv6\" },\n model: {\n value: _vm.config.webInterface.ipv6,\n callback: function($$v) {\n _vm.$set(_vm.config.webInterface, \"ipv6\", $$v)\n },\n expression: \"config.webInterface.ipv6\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable to be notified when a new login happens in webserver\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Enable HTTPS\", id: \"enable_https\" },\n model: {\n value: _vm.config.webInterface.httpsEnable,\n callback: function($$v) {\n _vm.$set(\n _vm.config.webInterface,\n \"httpsEnable\",\n $$v\n )\n },\n expression: \"config.webInterface.httpsEnable\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable access to the web interface using a HTTPS address\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.config.webInterface.httpsEnable\n ? _c(\n \"div\",\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTPS certificate\",\n id: \"https_cert\"\n },\n model: {\n value: _vm.config.webInterface.httpsCert,\n callback: function($$v) {\n _vm.$set(\n _vm.config.webInterface,\n \"httpsCert\",\n $$v\n )\n },\n expression: \"config.webInterface.httpsCert\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"file name or path to HTTPS certificate\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTPS key\",\n id: \"https_key\"\n },\n model: {\n value: _vm.config.webInterface.httpsKey,\n callback: function($$v) {\n _vm.$set(\n _vm.config.webInterface,\n \"httpsKey\",\n $$v\n )\n },\n expression: \"config.webInterface.httpsKey\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"file name or path to HTTPS key\")\n ])\n ]\n )\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Reverse proxy headers\",\n id: \"handle_reverse_proxy\"\n },\n model: {\n value: _vm.config.webInterface.handleReverseProxy,\n callback: function($$v) {\n _vm.$set(\n _vm.config.webInterface,\n \"handleReverseProxy\",\n $$v\n )\n },\n expression: \"config.webInterface.handleReverseProxy\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"accept the following reverse proxy headers (advanced)...\"\n ),\n _c(\"br\"),\n _vm._v(\n \"(X-Forwarded-For, X-Forwarded-Host, and X-Forwarded-Proto)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTP web root\",\n id: \"web_root\",\n autocomplete: \"no\"\n },\n model: {\n value: _vm.config.webRoot,\n callback: function($$v) {\n _vm.$set(_vm.config, \"webRoot\", $$v)\n },\n expression: \"config.webRoot\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Set a base URL, for use in reverse proxies.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"blank = disabled\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Must restart to have effect. Keep in mind that any previously configured base URLs won't work, after this change.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"advanced-settings\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(5),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"cpu_presets\",\n label: \"CPU throttling\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.config.cpuPreset,\n expression: \"config.cpuPreset\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: { id: \"cpu_presets\", name: \"cpu_presets\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.config,\n \"cpuPreset\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.cpuPresetOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"Normal (default). High is lower and Low is higher CPU use\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Anonymous redirect\",\n id: \"anon_redirect\"\n },\n model: {\n value: _vm.config.anonRedirect,\n callback: function($$v) {\n _vm.$set(_vm.config, \"anonRedirect\", $$v)\n },\n expression: \"config.anonRedirect\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'backlink protection via anonymizer service, must end in \"?\"'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Verify SSL Certs\",\n id: \"ssl_verify\"\n },\n model: {\n value: _vm.config.sslVerify,\n callback: function($$v) {\n _vm.$set(_vm.config, \"sslVerify\", $$v)\n },\n expression: \"config.sslVerify\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Verify SSL Certificates (Disable this for broken SSL installs (Like QNAP))\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"SSL CA Bundle\",\n id: \"ssl_ca_bundle\"\n },\n model: {\n value: _vm.config.sslCaBundle,\n callback: function($$v) {\n _vm.$set(_vm.config, \"sslCaBundle\", $$v)\n },\n expression: \"config.sslCaBundle\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Path to an SSL CA Bundle. Will replace default bundle(certifi) with the one specified.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" This only apply to call made using Medusa's Requests implementation.\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"No Restart\", id: \"no_restart\" },\n model: {\n value: _vm.config.noRestart,\n callback: function($$v) {\n _vm.$set(_vm.config, \"noRestart\", $$v)\n },\n expression: \"config.noRestart\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Only shutdown when restarting Medusa.\\n Only select this when you have external software restarting Medusa automatically when it stops (like FireDaemon)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Encrypt passwords\",\n id: \"encryption_version\"\n },\n model: {\n value: _vm.config.encryptionVersion,\n callback: function($$v) {\n _vm.$set(_vm.config, \"encryptionVersion\", $$v)\n },\n expression: \"config.encryptionVersion\"\n }\n },\n [\n _c(\n \"p\",\n [\n _vm._v(\"in the \"),\n _c(\"code\", [_vm._v(\"config.ini\")]),\n _vm._v(\n \" file.\\n \"\n ),\n _c(\"b\", [_vm._v(\"Warning:\")]),\n _vm._v(\" Passwords must only contain \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters\"\n }\n },\n [_vm._v(\"ASCII characters\")]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Unprotected calendar\",\n id: \"calendar_unprotected\"\n },\n model: {\n value: _vm.config.calendarUnprotected,\n callback: function($$v) {\n _vm.$set(_vm.config, \"calendarUnprotected\", $$v)\n },\n expression: \"config.calendarUnprotected\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"allow subscribing to the calendar without user and password.\\n Some services like Google Calendar only work this way\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Google Calendar Icons\",\n id: \"calendar_icons\"\n },\n model: {\n value: _vm.config.calendarIcons,\n callback: function($$v) {\n _vm.$set(_vm.config, \"calendarIcons\", $$v)\n },\n expression: \"config.calendarIcons\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"show an icon next to exported calendar events in Google Calendar.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: { label: \"Proxy host\", id: \"proxy_setting\" },\n model: {\n value: _vm.config.proxySetting,\n callback: function($$v) {\n _vm.$set(_vm.config, \"proxySetting\", $$v)\n },\n expression: \"config.proxySetting\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"blank to disable or proxy to use when connecting to providers\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.config.proxySetting !== \"\"\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use proxy for indexers\",\n id: \"proxy_indexers\"\n },\n model: {\n value: _vm.config.proxyIndexers,\n callback: function($$v) {\n _vm.$set(_vm.config, \"proxyIndexers\", $$v)\n },\n expression: \"config.proxyIndexers\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"use proxy host for connecting to indexers (thetvdb)\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Skip Remove Detection\",\n id: \"skip_removed_files\"\n },\n model: {\n value: _vm.config.skipRemovedFiles,\n callback: function($$v) {\n _vm.$set(_vm.config, \"skipRemovedFiles\", $$v)\n },\n expression: \"config.skipRemovedFiles\"\n }\n },\n [\n _c(\"span\", [\n _c(\"p\", [\n _vm._v(\n \"Skip detection of removed files. If disabled the episode will be set to the default deleted status\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" This may mean Medusa misses renames as well\\n \"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"ep_default_deleted_status\",\n label: \"Default deleted episode status\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.config.epDefaultDeletedStatus,\n expression: \"config.epDefaultDeletedStatus\"\n }\n ],\n staticClass:\n \"form-control input-sm margin-bottom-5\",\n attrs: {\n id: \"ep_default_deleted_status\",\n name: \"ep_default_deleted_status\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.config,\n \"epDefaultDeletedStatus\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { disabled: \"\", value: \"\" } },\n [_vm._v(\"Please select a default status\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.defaultDeletedEpOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"Define the status to be set for media file that has been deleted.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Archived option will keep previous downloaded quality\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Example: Downloaded (1080p WEB-DL) ==> Archived (1080p WEB-DL)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(6),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Enable debug\", id: \"debug\" },\n model: {\n value: _vm.config.logs.debug,\n callback: function($$v) {\n _vm.$set(_vm.config.logs, \"debug\", $$v)\n },\n expression: \"config.logs.debug\"\n }\n },\n [_c(\"p\", [_vm._v(\"Enable debug logs\")])]\n ),\n _vm._v(\" \"),\n _vm.config.developer\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable DB debug\",\n id: \"dbdebug\"\n },\n model: {\n value: _vm.config.logs.dbDebug,\n callback: function($$v) {\n _vm.$set(_vm.config.logs, \"dbDebug\", $$v)\n },\n expression: \"config.logs.dbDebug\"\n }\n },\n [_c(\"p\", [_vm._v(\"Enable DB debug logs\")])]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Subliminal logs\",\n id: \"subliminal_log\"\n },\n model: {\n value: _vm.config.logs.subliminalLog,\n callback: function($$v) {\n _vm.$set(_vm.config.logs, \"subliminalLog\", $$v)\n },\n expression: \"config.logs.subliminalLog\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable logs from subliminal library (subtitles)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"privacy_level\",\n label: \"Privacy\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.config.logs.privacyLevel,\n expression: \"config.logs.privacyLevel\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"privacy_level\",\n name: \"privacy_level\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.config.logs,\n \"privacyLevel\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.privacyLevelOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n Set the level of log-filtering.\\n Normal (default).\\n \"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(7),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"github_remote_branches\",\n label: \"Branch version\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.system.branch,\n expression: \"system.branch\"\n }\n ],\n staticClass:\n \"form-control input-sm margin-bottom-5\",\n attrs: {\n id: \"github_remote_branches\",\n name: \"github_remote_branches\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.system,\n \"branch\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { disabled: \"\", value: \"\" } },\n [_vm._v(\"Please select a branch\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.githubRemoteBranchesOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n staticStyle: { \"margin-left\": \"6px\" },\n attrs: {\n disabled: !_vm.githubBranches.length > 0,\n type: \"button\",\n id: \"branchCheckout\",\n value: \"Checkout Branch\"\n }\n }),\n _vm._v(\" \"),\n !_vm.githubBranches.length > 0\n ? _c(\n \"span\",\n { staticStyle: { color: \"rgb(255, 0, 0)\" } },\n [_c(\"p\", [_vm._v(\"Error: No branches found.\")])]\n )\n : _c(\"p\", [\n _vm._v(\n \"select branch to use (restart required)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"date_presets\",\n label: \"GitHub authentication type\"\n }\n },\n [\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.config.git.authType,\n expression: \"config.git.authType\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"git_auth_type_basic\",\n id: \"git_auth_type_basic\"\n },\n domProps: {\n value: 0,\n checked: _vm._q(_vm.config.git.authType, 0)\n },\n on: {\n change: function($event) {\n return _vm.$set(_vm.config.git, \"authType\", 0)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"Username and password\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.config.git.authType,\n expression: \"config.git.authType\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"git_auth_type_token\",\n id: \"git_auth_type_token\"\n },\n domProps: {\n value: 1,\n checked: _vm._q(_vm.config.git.authType, 1)\n },\n on: {\n change: function($event) {\n return _vm.$set(_vm.config.git, \"authType\", 1)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"Personal access token\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n 'You must use a personal access token if you\\'re using \"two-factor authentication\" on GitHub.'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.config.git.authType === 0,\n expression: \"config.git.authType === 0\"\n }\n ]\n },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub username\",\n id: \"git_username\"\n },\n model: {\n value: _vm.config.git.username,\n callback: function($$v) {\n _vm.$set(_vm.config.git, \"username\", $$v)\n },\n expression: \"config.git.username\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"*** (REQUIRED FOR SUBMITTING ISSUES) ***\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub password\",\n id: \"git_password\",\n type: \"password\"\n },\n model: {\n value: _vm.config.git.password,\n callback: function($$v) {\n _vm.$set(_vm.config.git, \"password\", $$v)\n },\n expression: \"config.git.password\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"*** (REQUIRED FOR SUBMITTING ISSUES) ***\"\n )\n ])\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.config.git.authType !== 0,\n expression: \"config.git.authType !== 0\"\n }\n ]\n },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub personal access token\",\n id: \"git_token\",\n \"input-class\": \"display-inline margin-bottom-5\"\n },\n nativeOn: {\n focus: function($event) {\n return $event.target.select()\n }\n },\n model: {\n value: _vm.config.git.token,\n callback: function($$v) {\n _vm.$set(_vm.config.git, \"token\", $$v)\n },\n expression: \"config.git.token\"\n }\n },\n [\n _vm.config.git.token === \"\"\n ? [\n _c(\n \"v-popover\",\n {\n attrs: {\n trigger: \"click\",\n offset: \"16\",\n placement: \"right\",\n popoverBaseClass: \"tooltip-base\",\n popoverClass:\n \"tooltip-themed\" +\n (_vm.layout.themeName === \"dark\"\n ? \"-dark\"\n : \"-light\")\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n id: \"create_access_token\",\n value: \"Generate Token\"\n }\n }),\n _vm._v(\" \"),\n _c(\"template\", { slot: \"popover\" }, [\n _c(\n \"div\",\n { staticClass: \"tooltip-title\" },\n [_vm._v(\"Github Token\")]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"tooltip-content\" },\n [\n _c(\"p\", [\n _vm._v(\n \"Copy the generated token and paste it in the token input box.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\n \"a\",\n {\n attrs: {\n href:\n (_vm.config\n .anonRedirect || \"\") +\n \"https://github.com/settings/tokens/new?description=Medusa&scopes=gist,public_repo\",\n target: \"_blank\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value:\n \"Continue to Github...\"\n }\n })\n ]\n )\n ]),\n _c(\"br\")\n ]\n )\n ])\n ],\n 2\n )\n ]\n : [\n _c(\n \"a\",\n {\n attrs: {\n href:\n (_vm.config.anonRedirect || \"\") +\n \"https://github.com/settings/tokens\",\n target: \"_blank\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n id: \"manage_tokens\",\n value: \"Manage Tokens\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"*** (REQUIRED FOR SUBMITTING ISSUES) ***\"\n )\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub remote for branch\",\n id: \"git_remote\"\n },\n model: {\n value: _vm.config.git.remote,\n callback: function($$v) {\n _vm.$set(_vm.config.git, \"remote\", $$v)\n },\n expression: \"config.git.remote\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"default:origin. Access repo configured remotes (save then refresh browser)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Git executable path\",\n id: \"git_path\"\n },\n model: {\n value: _vm.config.git.path,\n callback: function($$v) {\n _vm.$set(_vm.config.git, \"path\", $$v)\n },\n expression: \"config.git.path\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"only needed if OS is unable to locate git from env\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.config.developer\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Git reset\", id: \"git_reset\" },\n model: {\n value: _vm.config.git.reset,\n callback: function($$v) {\n _vm.$set(_vm.config.git, \"reset\", $$v)\n },\n expression: \"config.git.reset\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"removes untracked files and performs a hard reset on git branch automatically to help resolve update issues\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.config.developer\n ? _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"git_reset_branches\",\n label: \"Branches to reset\"\n }\n },\n [\n _c(\"multiselect\", {\n attrs: {\n multiple: true,\n options: _vm.githubBranches\n },\n model: {\n value: _vm.config.git.resetBranches,\n callback: function($$v) {\n _vm.$set(\n _vm.config.git,\n \"resetBranches\",\n $$v\n )\n },\n expression: \"config.git.resetBranches\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n staticStyle: { \"margin-left\": \"6px\" },\n attrs: {\n type: \"button\",\n id: \"branch_force_update\",\n value: \"Update Branches\"\n },\n on: { click: _vm.githubBranchForceUpdate }\n }),\n _vm._v(\" \"),\n _c(\"span\", { staticClass: \"component-desc\" }, [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Empty selection means that any branch could be reset.\"\n )\n ])\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"h6\", { staticClass: \"pull-right\" }, [\n _c(\"b\", [\n _vm._v(\"All non-absolute folder locations are relative to \"),\n _c(\"span\", { staticClass: \"path\" }, [\n _vm._v(_vm._s(_vm.system.dataDir))\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa pull-left config_submitter button\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ])\n ]\n )\n ])\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Misc\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Startup options. Indexer options. Log and show file locations.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [\n _vm._v(\"Some options may require a manual restart to take effect.\")\n ])\n ])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Indexer\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for controlling the show indexers.\")])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Updates\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for software updates.\")])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"User Interface\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for visual appearance.\")])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Web Interface\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"It is recommended that you enable a username and password to secure Medusa from being tampered with remotely.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [\n _vm._v(\"These options require a manual restart to take effect.\")\n ])\n ])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [_c(\"h3\", [_vm._v(\"Advanced Settings\")])]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [_c(\"h3\", [_vm._v(\"Logging\")])]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"GitHub\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for github related features.\")])\n ]\n )\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/config-general.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"config-genaral\" } }, [\n _c(\"div\", { attrs: { id: \"config-content\" } }, [\n _c(\n \"form\",\n {\n attrs: { id: \"configForm\", method: \"post\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.save()\n }\n }\n },\n [\n _c(\"div\", { attrs: { id: \"config-components\" } }, [\n _c(\"ul\", [\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#misc\" } }, [_vm._v(\"Misc\")])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#interface\" } }, [\n _vm._v(\"Interface\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#advanced-settings\" } }, [\n _vm._v(\"Advanced Settings\")\n ])\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"misc\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Launch browser\",\n id: \"launch_browser\"\n },\n model: {\n value: _vm.general.launchBrowser,\n callback: function($$v) {\n _vm.$set(_vm.general, \"launchBrowser\", $$v)\n },\n expression: \"general.launchBrowser\"\n }\n },\n [\n _c(\"span\", [\n _vm._v(\"open the Medusa home page on startup\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"default_page\",\n label: \"Initial page\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.defaultPage,\n expression: \"general.defaultPage\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"default_page\",\n name: \"default_page\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.general,\n \"defaultPage\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.defaultPageOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"when launching Medusa interface\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trash_remove_show\",\n label: \"Send to trash for actions\"\n }\n },\n [\n _c(\n \"label\",\n {\n staticClass: \"nextline-block\",\n attrs: { for: \"trash_remove_show\" }\n },\n [\n _c(\"toggle-button\", {\n attrs: {\n width: 45,\n height: 22,\n id: \"trash_remove_show\",\n name: \"trash_remove_show\",\n sync: \"\"\n },\n model: {\n value: _vm.general.trashRemoveShow,\n callback: function($$v) {\n _vm.$set(\n _vm.general,\n \"trashRemoveShow\",\n $$v\n )\n },\n expression: \"general.trashRemoveShow\"\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n 'when using show \"Remove\" and delete files'\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"label\",\n {\n staticClass: \"nextline-block\",\n attrs: { for: \"trash_rotate_logs\" }\n },\n [\n _c(\"toggle-button\", {\n attrs: {\n width: 45,\n height: 22,\n id: \"trash_rotate_logs\",\n name: \"trash_rotate_logs\",\n sync: \"\"\n },\n model: {\n value: _vm.general.trashRotateLogs,\n callback: function($$v) {\n _vm.$set(\n _vm.general,\n \"trashRotateLogs\",\n $$v\n )\n },\n expression: \"general.trashRotateLogs\"\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"on scheduled deletes of the oldest log files\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"selected actions use trash (recycle bin) instead of the default permanent delete\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Location for Log files\",\n id: \"log_id\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.general.logs.actualLogDir,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"actualLogDir\", $$v)\n },\n expression: \"general.logs.actualLogDir\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Number of Log files saved\",\n id: \"log_nr\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.general.logs.nr,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"nr\", $$v)\n },\n expression: \"general.logs.nr\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"number of log files saved when rotating logs (default: 5) \"\n ),\n _c(\"b\", [_vm._v(\"(REQUIRES RESTART)\")])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Size of Log files saved\",\n id: \"log_size\",\n min: 0.5,\n step: 0.1\n },\n model: {\n value: _vm.general.logs.size,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"size\", $$v)\n },\n expression: \"general.logs.size\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"maximum size in MB of the log file (default: 1MB) \"\n ),\n _c(\"b\", [_vm._v(\"(REQUIRES RESTART)\")])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"show_root_dir\",\n label: \"Show root directories\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"where the files of shows are located\")\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\"These changes are automatically saved!\")\n ]),\n _vm._v(\" \"),\n _c(\"root-dirs\")\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(1),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"show_root_dir\",\n label: \"Default Indexer Language\"\n }\n },\n [\n _c(\"language-select\", {\n ref: \"indexerLanguage\",\n staticClass:\n \"form-control form-control-inline input-sm\",\n attrs: {\n language: _vm.general.indexerDefaultLanguage,\n available: _vm.indexers.main.validLanguages.join(\n \",\"\n )\n },\n on: {\n \"update-language\": function($event) {\n _vm.general.indexerDefaultLanguage = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"for adding shows and metadata providers\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Choose hour to update shows\",\n id: \"showupdate_hour\",\n min: 0,\n max: 23,\n step: 1\n },\n model: {\n value: _vm.general.showUpdateHour,\n callback: function($$v) {\n _vm.$set(_vm.general, \"showUpdateHour\", $$v)\n },\n expression: \"general.showUpdateHour\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"with information such as next air dates, show ended, etc. Use 15 for 3pm, 4 for 4am etc.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" minutes are randomized each time Medusa is started\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Timeout show indexer at\",\n id: \"indexer_timeout\",\n min: 10,\n step: 1\n },\n model: {\n value: _vm.general.indexerTimeout,\n callback: function($$v) {\n _vm.$set(_vm.general, \"indexerTimeout\", $$v)\n },\n expression: \"general.indexerTimeout\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"seconds of inactivity when finding new shows (default:20)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"indexer_default\",\n label: \"Use initial indexer set to\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.indexerDefault,\n expression: \"indexerDefault\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"indexer_default\",\n name: \"indexer_default\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.indexerDefault = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.indexerListOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable fallback to plex\",\n id: \"fallback_plex_enable\"\n },\n model: {\n value: _vm.general.plexFallBack.enable,\n callback: function($$v) {\n _vm.$set(_vm.general.plexFallBack, \"enable\", $$v)\n },\n expression: \"general.plexFallBack.enable\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Plex provides a tvdb mirror, that can be utilized when Tvdb's api is unavailable.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable fallback notifications\",\n id: \"fallback_plex_notifications\"\n },\n model: {\n value: _vm.general.plexFallBack.notifications,\n callback: function($$v) {\n _vm.$set(\n _vm.general.plexFallBack,\n \"notifications\",\n $$v\n )\n },\n expression: \"general.plexFallBack.notifications\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"When this settings has been enabled, you may receive frequent notifications when falling back to the plex mirror.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Timeout show indexer at\",\n id: \"Fallback duration\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.general.plexFallBack.timeout,\n callback: function($$v) {\n _vm.$set(_vm.general.plexFallBack, \"timeout\", $$v)\n },\n expression: \"general.plexFallBack.timeout\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Amount of hours after we try to revert back to the thetvdb.com api url (default:3).\"\n )\n ])\n ]\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(2),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Check software updates\",\n id: \"version_notify\"\n },\n model: {\n value: _vm.general.versionNotify,\n callback: function($$v) {\n _vm.$set(_vm.general, \"versionNotify\", $$v)\n },\n expression: \"general.versionNotify\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"and display notifications when updates are available.\\n Checks are run on startup and at the frequency set below*\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Automatically update\",\n id: \"auto_update\"\n },\n model: {\n value: _vm.general.autoUpdate,\n callback: function($$v) {\n _vm.$set(_vm.general, \"autoUpdate\", $$v)\n },\n expression: \"general.autoUpdate\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"fetch and install software updates.\\n Updates are run on startup and in the background at the frequency set below*\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Check the server every*\",\n id: \"update_frequency duration\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.general.updateFrequency,\n callback: function($$v) {\n _vm.$set(_vm.general, \"updateFrequency\", $$v)\n },\n expression: \"general.updateFrequency\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"hours for software updates (default:1)\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Notify on software update\",\n id: \"notify_on_update\"\n },\n model: {\n value: _vm.general.notifyOnUpdate,\n callback: function($$v) {\n _vm.$set(_vm.general, \"notifyOnUpdate\", $$v)\n },\n expression: \"general.notifyOnUpdate\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"send a message to all enabled notifiers when Medusa has been updated\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"interface\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(3),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"theme_name\",\n label: \"Display theme\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.themeName,\n expression: \"layout.themeName\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: { id: \"theme_name\", name: \"theme_name\" },\n on: {\n change: [\n function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.layout,\n \"themeName\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n },\n function($event) {\n return _vm.changeTheme(_vm.layout.themeName)\n }\n ]\n }\n },\n _vm._l(_vm.availableThemesOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use wider layout\",\n id: \"layout_wide\"\n },\n model: {\n value: _vm.layout.wide,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"wide\", $$v)\n },\n expression: \"layout.wide\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"uses all available space in the page\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Show fanart in the background\",\n id: \"fanart_background\"\n },\n model: {\n value: _vm.layout.fanartBackground,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"fanartBackground\", $$v)\n },\n expression: \"layout.fanartBackground\"\n }\n },\n [_c(\"p\", [_vm._v(\"on the show summary page\")])]\n ),\n _vm._v(\" \"),\n _vm.layout.fanartBackground\n ? _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Fanart transparency\",\n id: \"fanart_background_opacity duration\",\n step: 0.1,\n min: 0.1,\n max: 1.0\n },\n model: {\n value: _vm.layout.fanartBackgroundOpacity,\n callback: function($$v) {\n _vm.$set(\n _vm.layout,\n \"fanartBackgroundOpacity\",\n $$v\n )\n },\n expression: \"layout.fanartBackgroundOpacity\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Transparency of the fanart in the background\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Sort with 'The' 'A', 'An'\",\n id: \"sort_article\"\n },\n model: {\n value: _vm.layout.sortArticle,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"sortArticle\", $$v)\n },\n expression: \"layout.sortArticle\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'include articles (\"The\", \"A\", \"An\") when sorting show lists'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Missed episodes range\",\n id: \"coming_eps_missed_range duration\",\n step: 1,\n min: 7\n },\n model: {\n value: _vm.layout.comingEps.missedRange,\n callback: function($$v) {\n _vm.$set(_vm.layout.comingEps, \"missedRange\", $$v)\n },\n expression: \"layout.comingEps.missedRange\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Set the range in days of the missed episodes in the Schedule page\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Display fuzzy dates\",\n id: \"fuzzy_dating\"\n },\n model: {\n value: _vm.layout.fuzzyDating,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"fuzzyDating\", $$v)\n },\n expression: \"layout.fuzzyDating\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'move absolute dates into tooltips and display e.g. \"Last Thu\", \"On Tue\"'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Trim zero padding\",\n id: \"trim_zero\"\n },\n model: {\n value: _vm.layout.trimZero,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"trimZero\", $$v)\n },\n expression: \"layout.trimZero\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'remove the leading number \"0\" shown on hour of day, and date of month'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"date_preset\",\n label: \"Date style\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.dateStyle,\n expression: \"layout.dateStyle\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: { id: \"date_preset\", name: \"date_preset\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.layout,\n \"dateStyle\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.datePresetOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"time_preset\",\n label: \"Time style\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.timeStyle,\n expression: \"layout.timeStyle\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: { id: \"time_preset\", name: \"time_preset\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.layout,\n \"timeStyle\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.timePresetOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" seconds are only shown on the History page\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"timezone_display\",\n label: \"Timezone\"\n }\n },\n [\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.timezoneDisplay,\n expression: \"layout.timezoneDisplay\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"timezone_display_local\",\n id: \"timezone_display_local\",\n value: \"local\"\n },\n domProps: {\n checked: _vm._q(\n _vm.layout.timezoneDisplay,\n \"local\"\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.layout,\n \"timezoneDisplay\",\n \"local\"\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"local\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.timezoneDisplay,\n expression: \"layout.timezoneDisplay\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"timezone_display_network\",\n id: \"timezone_display_network\",\n value: \"network\"\n },\n domProps: {\n checked: _vm._q(\n _vm.layout.timezoneDisplay,\n \"network\"\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.layout,\n \"timezoneDisplay\",\n \"network\"\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"network\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"display dates and times in either your timezone or the shows network timezone\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Use local timezone to start searching for episodes minutes after show ends (depends on your dailysearch frequency)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: { label: \"Download url\", id: \"download_url\" },\n model: {\n value: _vm.general.downloadUrl,\n callback: function($$v) {\n _vm.$set(_vm.general, \"downloadUrl\", $$v)\n },\n expression: \"general.downloadUrl\"\n }\n },\n [\n _c(\"span\", { staticClass: \"component-desc\" }, [\n _vm._v(\"URL where the shows can be downloaded.\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Use table pagination\",\n id: \"show_pagination\"\n },\n model: {\n value: _vm.layout.show.pagination.enable,\n callback: function($$v) {\n _vm.$set(_vm.layout.show.pagination, \"enable\", $$v)\n },\n expression: \"layout.show.pagination.enable\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(4),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"API key\",\n id: \"api_key\",\n readonly: \"readonly\"\n },\n model: {\n value: _vm.general.webInterface.apiKey,\n callback: function($$v) {\n _vm.$set(_vm.general.webInterface, \"apiKey\", $$v)\n },\n expression: \"general.webInterface.apiKey\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n id: \"generate_new_apikey\",\n value: \"Generate\"\n },\n on: { click: _vm.generateApiKey }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"used to give 3rd party programs limited access to Medusa\"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"p\",\n [\n _vm._v(\n \"you can try all the features of the legacy API (v1) \"\n ),\n _c(\n \"app-link\",\n { attrs: { href: \"apibuilder/\" } },\n [_vm._v(\"here\")]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"HTTP logs\", id: \"web_log\" },\n model: {\n value: _vm.general.webInterface.log,\n callback: function($$v) {\n _vm.$set(_vm.general.webInterface, \"log\", $$v)\n },\n expression: \"general.webInterface.log\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable logs from the internal Tornado web server\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTP username\",\n id: \"web_username\",\n autocomplete: \"no\"\n },\n model: {\n value: _vm.general.webInterface.username,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"username\",\n $$v\n )\n },\n expression: \"general.webInterface.username\"\n }\n },\n [_c(\"p\", [_vm._v(\"set blank for no login\")])]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTP password\",\n id: \"web_password\",\n type: \"password\",\n autocomplete: \"no\"\n },\n model: {\n value: _vm.general.webInterface.password,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"password\",\n $$v\n )\n },\n expression: \"general.webInterface.password\"\n }\n },\n [_c(\"p\", [_vm._v(\"blank = no authentication\")])]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"HTTP port\",\n id: \"web_port\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.general.webInterface.port,\n callback: function($$v) {\n _vm.$set(_vm.general.webInterface, \"port\", $$v)\n },\n expression: \"general.webInterface.port\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"web port to browse and access Medusa (default:8081)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Notify on login\",\n id: \"notify_on_login\"\n },\n model: {\n value: _vm.general.webInterface.notifyOnLogin,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"notifyOnLogin\",\n $$v\n )\n },\n expression: \"general.webInterface.notifyOnLogin\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable to be notified when a new login happens in webserver\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Listen on IPv6\", id: \"web_ipv6\" },\n model: {\n value: _vm.general.webInterface.ipv6,\n callback: function($$v) {\n _vm.$set(_vm.general.webInterface, \"ipv6\", $$v)\n },\n expression: \"general.webInterface.ipv6\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable to be notified when a new login happens in webserver\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Enable HTTPS\", id: \"enable_https\" },\n model: {\n value: _vm.general.webInterface.httpsEnable,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"httpsEnable\",\n $$v\n )\n },\n expression: \"general.webInterface.httpsEnable\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable access to the web interface using a HTTPS address\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.general.webInterface.httpsEnable\n ? _c(\n \"div\",\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTPS certificate\",\n id: \"https_cert\"\n },\n model: {\n value: _vm.general.webInterface.httpsCert,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"httpsCert\",\n $$v\n )\n },\n expression: \"general.webInterface.httpsCert\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"file name or path to HTTPS certificate\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTPS key\",\n id: \"https_key\"\n },\n model: {\n value: _vm.general.webInterface.httpsKey,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"httpsKey\",\n $$v\n )\n },\n expression: \"general.webInterface.httpsKey\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"file name or path to HTTPS key\")\n ])\n ]\n )\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Reverse proxy headers\",\n id: \"handle_reverse_proxy\"\n },\n model: {\n value: _vm.general.webInterface.handleReverseProxy,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"handleReverseProxy\",\n $$v\n )\n },\n expression:\n \"general.webInterface.handleReverseProxy\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"accept the following reverse proxy headers (advanced)...\"\n ),\n _c(\"br\"),\n _vm._v(\n \"(X-Forwarded-For, X-Forwarded-Host, and X-Forwarded-Proto)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTP web root\",\n id: \"web_root\",\n autocomplete: \"no\"\n },\n model: {\n value: _vm.general.webRoot,\n callback: function($$v) {\n _vm.$set(_vm.general, \"webRoot\", $$v)\n },\n expression: \"general.webRoot\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Set a base URL, for use in reverse proxies.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"blank = disabled\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Must restart to have effect. Keep in mind that any previously configured base URLs won't work, after this change.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"advanced-settings\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(5),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"cpu_presets\",\n label: \"CPU throttling\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.cpuPreset,\n expression: \"general.cpuPreset\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: { id: \"cpu_presets\", name: \"cpu_presets\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.general,\n \"cpuPreset\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.cpuPresetOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"Normal (default). High is lower and Low is higher CPU use\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Anonymous redirect\",\n id: \"anon_redirect\"\n },\n model: {\n value: _vm.general.anonRedirect,\n callback: function($$v) {\n _vm.$set(_vm.general, \"anonRedirect\", $$v)\n },\n expression: \"general.anonRedirect\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'backlink protection via anonymizer service, must end in \"?\"'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Verify SSL Certs\",\n id: \"ssl_verify\"\n },\n model: {\n value: _vm.general.sslVerify,\n callback: function($$v) {\n _vm.$set(_vm.general, \"sslVerify\", $$v)\n },\n expression: \"general.sslVerify\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Verify SSL Certificates (Disable this for broken SSL installs (Like QNAP))\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"SSL CA Bundle\",\n id: \"ssl_ca_bundle\"\n },\n model: {\n value: _vm.general.sslCaBundle,\n callback: function($$v) {\n _vm.$set(_vm.general, \"sslCaBundle\", $$v)\n },\n expression: \"general.sslCaBundle\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Path to an SSL CA Bundle. Will replace default bundle(certifi) with the one specified.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" This only apply to call made using Medusa's Requests implementation.\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"No Restart\", id: \"no_restart\" },\n model: {\n value: _vm.general.noRestart,\n callback: function($$v) {\n _vm.$set(_vm.general, \"noRestart\", $$v)\n },\n expression: \"general.noRestart\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Only shutdown when restarting Medusa.\\n Only select this when you have external software restarting Medusa automatically when it stops (like FireDaemon)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Encrypt passwords\",\n id: \"encryption_version\"\n },\n model: {\n value: _vm.general.encryptionVersion,\n callback: function($$v) {\n _vm.$set(_vm.general, \"encryptionVersion\", $$v)\n },\n expression: \"general.encryptionVersion\"\n }\n },\n [\n _c(\n \"p\",\n [\n _vm._v(\"in the \"),\n _c(\"code\", [_vm._v(\"config.ini\")]),\n _vm._v(\n \" file.\\n \"\n ),\n _c(\"b\", [_vm._v(\"Warning:\")]),\n _vm._v(\" Passwords must only contain \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters\"\n }\n },\n [_vm._v(\"ASCII characters\")]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Unprotected calendar\",\n id: \"calendar_unprotected\"\n },\n model: {\n value: _vm.general.calendarUnprotected,\n callback: function($$v) {\n _vm.$set(_vm.general, \"calendarUnprotected\", $$v)\n },\n expression: \"general.calendarUnprotected\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"allow subscribing to the calendar without user and password.\\n Some services like Google Calendar only work this way\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Google Calendar Icons\",\n id: \"calendar_icons\"\n },\n model: {\n value: _vm.general.calendarIcons,\n callback: function($$v) {\n _vm.$set(_vm.general, \"calendarIcons\", $$v)\n },\n expression: \"general.calendarIcons\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"show an icon next to exported calendar events in Google Calendar.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: { label: \"Proxy host\", id: \"proxy_setting\" },\n model: {\n value: _vm.general.proxySetting,\n callback: function($$v) {\n _vm.$set(_vm.general, \"proxySetting\", $$v)\n },\n expression: \"general.proxySetting\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"blank to disable or proxy to use when connecting to providers\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.general.proxySetting !== \"\"\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use proxy for indexers\",\n id: \"proxy_indexers\"\n },\n model: {\n value: _vm.general.proxyIndexers,\n callback: function($$v) {\n _vm.$set(_vm.general, \"proxyIndexers\", $$v)\n },\n expression: \"general.proxyIndexers\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"use proxy host for connecting to indexers (thetvdb)\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Skip Remove Detection\",\n id: \"skip_removed_files\"\n },\n model: {\n value: _vm.general.skipRemovedFiles,\n callback: function($$v) {\n _vm.$set(_vm.general, \"skipRemovedFiles\", $$v)\n },\n expression: \"general.skipRemovedFiles\"\n }\n },\n [\n _c(\"span\", [\n _c(\"p\", [\n _vm._v(\n \"Skip detection of removed files. If disabled the episode will be set to the default deleted status\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" This may mean Medusa misses renames as well\\n \"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"ep_default_deleted_status\",\n label: \"Default deleted episode status\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.epDefaultDeletedStatus,\n expression: \"general.epDefaultDeletedStatus\"\n }\n ],\n staticClass:\n \"form-control input-sm margin-bottom-5\",\n attrs: {\n id: \"ep_default_deleted_status\",\n name: \"ep_default_deleted_status\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.general,\n \"epDefaultDeletedStatus\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { disabled: \"\", value: \"\" } },\n [_vm._v(\"Please select a default status\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.defaultDeletedEpOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"Define the status to be set for media file that has been deleted.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Archived option will keep previous downloaded quality\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Example: Downloaded (1080p WEB-DL) ==> Archived (1080p WEB-DL)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(6),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Enable debug\", id: \"debug\" },\n model: {\n value: _vm.general.logs.debug,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"debug\", $$v)\n },\n expression: \"general.logs.debug\"\n }\n },\n [_c(\"p\", [_vm._v(\"Enable debug logs\")])]\n ),\n _vm._v(\" \"),\n _vm.general.developer\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable DB debug\",\n id: \"dbdebug\"\n },\n model: {\n value: _vm.general.logs.dbDebug,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"dbDebug\", $$v)\n },\n expression: \"general.logs.dbDebug\"\n }\n },\n [_c(\"p\", [_vm._v(\"Enable DB debug logs\")])]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Subliminal logs\",\n id: \"subliminal_log\"\n },\n model: {\n value: _vm.general.logs.subliminalLog,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"subliminalLog\", $$v)\n },\n expression: \"general.logs.subliminalLog\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable logs from subliminal library (subtitles)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"privacy_level\",\n label: \"Privacy\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.logs.privacyLevel,\n expression: \"general.logs.privacyLevel\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"privacy_level\",\n name: \"privacy_level\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.general.logs,\n \"privacyLevel\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.privacyLevelOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n Set the level of log-filtering.\\n Normal (default).\\n \"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(7),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"github_remote_branches\",\n label: \"Branch version\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.system.branch,\n expression: \"system.branch\"\n }\n ],\n staticClass:\n \"form-control input-sm margin-bottom-5\",\n attrs: {\n id: \"github_remote_branches\",\n name: \"github_remote_branches\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.system,\n \"branch\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { disabled: \"\", value: \"\" } },\n [_vm._v(\"Please select a branch\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.githubRemoteBranchesOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n staticStyle: { \"margin-left\": \"6px\" },\n attrs: {\n disabled: !_vm.githubBranches.length > 0,\n type: \"button\",\n id: \"branchCheckout\",\n value: \"Checkout Branch\"\n }\n }),\n _vm._v(\" \"),\n !_vm.githubBranches.length > 0\n ? _c(\n \"span\",\n { staticStyle: { color: \"rgb(255, 0, 0)\" } },\n [_c(\"p\", [_vm._v(\"Error: No branches found.\")])]\n )\n : _c(\"p\", [\n _vm._v(\n \"select branch to use (restart required)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"date_presets\",\n label: \"GitHub authentication type\"\n }\n },\n [\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.git.authType,\n expression: \"general.git.authType\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"git_auth_type_basic\",\n id: \"git_auth_type_basic\"\n },\n domProps: {\n value: 0,\n checked: _vm._q(_vm.general.git.authType, 0)\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.general.git,\n \"authType\",\n 0\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"Username and password\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.git.authType,\n expression: \"general.git.authType\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"git_auth_type_token\",\n id: \"git_auth_type_token\"\n },\n domProps: {\n value: 1,\n checked: _vm._q(_vm.general.git.authType, 1)\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.general.git,\n \"authType\",\n 1\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"Personal access token\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n 'You must use a personal access token if you\\'re using \"two-factor authentication\" on GitHub.'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.general.git.authType === 0,\n expression: \"general.git.authType === 0\"\n }\n ]\n },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub username\",\n id: \"git_username\"\n },\n model: {\n value: _vm.general.git.username,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"username\", $$v)\n },\n expression: \"general.git.username\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"*** (REQUIRED FOR SUBMITTING ISSUES) ***\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub password\",\n id: \"git_password\",\n type: \"password\"\n },\n model: {\n value: _vm.general.git.password,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"password\", $$v)\n },\n expression: \"general.git.password\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"*** (REQUIRED FOR SUBMITTING ISSUES) ***\"\n )\n ])\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.general.git.authType !== 0,\n expression: \"general.git.authType !== 0\"\n }\n ]\n },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub personal access token\",\n id: \"git_token\",\n \"input-class\": \"display-inline margin-bottom-5\"\n },\n nativeOn: {\n focus: function($event) {\n return $event.target.select()\n }\n },\n model: {\n value: _vm.general.git.token,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"token\", $$v)\n },\n expression: \"general.git.token\"\n }\n },\n [\n _vm.general.git.token === \"\"\n ? [\n _c(\n \"v-popover\",\n {\n attrs: {\n trigger: \"click\",\n offset: \"16\",\n placement: \"right\",\n popoverBaseClass: \"tooltip-base\",\n popoverClass:\n \"tooltip-themed\" +\n (_vm.layout.themeName === \"dark\"\n ? \"-dark\"\n : \"-light\")\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n id: \"create_access_token\",\n value: \"Generate Token\"\n }\n }),\n _vm._v(\" \"),\n _c(\"template\", { slot: \"popover\" }, [\n _c(\n \"div\",\n { staticClass: \"tooltip-title\" },\n [_vm._v(\"Github Token\")]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"tooltip-content\" },\n [\n _c(\"p\", [\n _vm._v(\n \"Copy the generated token and paste it in the token input box.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\n \"a\",\n {\n attrs: {\n href:\n (_vm.general\n .anonRedirect || \"\") +\n \"https://github.com/settings/tokens/new?description=Medusa&scopes=gist,public_repo\",\n target: \"_blank\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value:\n \"Continue to Github...\"\n }\n })\n ]\n )\n ]),\n _c(\"br\")\n ]\n )\n ])\n ],\n 2\n )\n ]\n : [\n _c(\n \"a\",\n {\n attrs: {\n href:\n (_vm.general.anonRedirect || \"\") +\n \"https://github.com/settings/tokens\",\n target: \"_blank\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n id: \"manage_tokens\",\n value: \"Manage Tokens\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"*** (REQUIRED FOR SUBMITTING ISSUES) ***\"\n )\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub remote for branch\",\n id: \"git_remote\"\n },\n model: {\n value: _vm.general.git.remote,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"remote\", $$v)\n },\n expression: \"general.git.remote\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"default:origin. Access repo configured remotes (save then refresh browser)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Git executable path\",\n id: \"git_path\"\n },\n model: {\n value: _vm.general.git.path,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"path\", $$v)\n },\n expression: \"general.git.path\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"only needed if OS is unable to locate git from env\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.general.developer\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Git reset\", id: \"git_reset\" },\n model: {\n value: _vm.general.git.reset,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"reset\", $$v)\n },\n expression: \"general.git.reset\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"removes untracked files and performs a hard reset on git branch automatically to help resolve update issues\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.general.developer\n ? _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"git_reset_branches\",\n label: \"Branches to reset\"\n }\n },\n [\n _c(\"multiselect\", {\n attrs: {\n multiple: true,\n options: _vm.githubBranches\n },\n model: {\n value: _vm.general.git.resetBranches,\n callback: function($$v) {\n _vm.$set(\n _vm.general.git,\n \"resetBranches\",\n $$v\n )\n },\n expression: \"general.git.resetBranches\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n staticStyle: { \"margin-left\": \"6px\" },\n attrs: {\n type: \"button\",\n id: \"branch_force_update\",\n value: \"Update Branches\"\n },\n on: { click: _vm.githubBranchForceUpdate }\n }),\n _vm._v(\" \"),\n _c(\"span\", { staticClass: \"component-desc\" }, [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Empty selection means that any branch could be reset.\"\n )\n ])\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"h6\", { staticClass: \"pull-right\" }, [\n _c(\"b\", [\n _vm._v(\"All non-absolute folder locations are relative to \"),\n _c(\"span\", { staticClass: \"path\" }, [\n _vm._v(_vm._s(_vm.system.dataDir))\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa pull-left config_submitter button\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ])\n ]\n )\n ])\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Misc\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Startup options. Indexer options. Log and show file locations.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [\n _vm._v(\"Some options may require a manual restart to take effect.\")\n ])\n ])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Indexer\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for controlling the show indexers.\")])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Updates\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for software updates.\")])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"User Interface\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for visual appearance.\")])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Web Interface\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"It is recommended that you enable a username and password to secure Medusa from being tampered with remotely.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [\n _vm._v(\"These options require a manual restart to take effect.\")\n ])\n ])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [_c(\"h3\", [_vm._v(\"Advanced Settings\")])]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [_c(\"h3\", [_vm._v(\"Logging\")])]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"GitHub\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for github related features.\")])\n ]\n )\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/config-general.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1106,7 +1164,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"display-show-template\", class: _vm.theme },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _vm.show.id.slug\n ? _c(\"backstretch\", { attrs: { slug: _vm.show.id.slug } })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-id\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"indexer-name\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-slug\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"show-header\", {\n ref: \"show-header\",\n attrs: { type: \"show\", \"show-id\": _vm.id, \"show-indexer\": _vm.indexer },\n on: {\n reflow: _vm.reflowLayout,\n update: _vm.statusQualityUpdate,\n \"update-overview-status\": function($event) {\n _vm.filterByOverviewStatus = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\" },\n [\n _vm.show.seasons\n ? _c(\"vue-good-table\", {\n ref: \"table-seasons\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.orderSeasons,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: _vm.layout.show.pagination.enable,\n perPage: _vm.paginationPerPage,\n perPageDropdown: _vm.perPageDropdown\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search episodes\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"episode\", type: \"desc\" }\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: true\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n },\n \"on-per-page-change\": function($event) {\n return _vm.updatePaginationPerPage(\n $event.currentPerPage\n )\n },\n \"on-page-change\": _vm.onPageChange\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n {\n staticClass: \"season-header toggle collapse\"\n },\n [\n _c(\"app-link\", {\n attrs: {\n name: \"season-\" + props.row.season\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass:\n \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip:\n props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[\n props.column.field\n ],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.formattedRow[\n props.column.field\n ] || 0,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n props.formattedRow[\n props.column.field\n ],\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value: props.formattedRow[\n props.column.field\n ]\n ? props.formattedRow[\n props.column.field\n ]\n : \"\"\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description:\n props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.file.location\n }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Download\"\n ? _c(\n \"span\",\n [\n _vm.config.downloadUrl &&\n props.row.file.location &&\n [\"Downloaded\", \"Archived\"].includes(\n props.row.status\n )\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n _vm.config.downloadUrl +\n props.row.file.location\n }\n },\n [_vm._v(\"Download\")]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass:\n \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\n \"span\",\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 4204561448\n )\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.layout.show.specials &&\n _vm.specials &&\n _vm.specials.length > 0\n ? _c(\"vue-good-table\", {\n ref: \"table-specials\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.specials,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: false\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search specials\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"episode\", type: \"desc\" }\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: false\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n }\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n {\n staticClass: \"season-header toggle collapse\"\n },\n [\n _c(\"app-link\", {\n attrs: {\n name: \"season-\" + props.row.season\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass:\n \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip:\n props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[\n props.column.field\n ],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.formattedRow[\n props.column.field\n ] || 0,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n props.formattedRow[\n props.column.field\n ],\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value: props.formattedRow[\n props.column.field\n ]\n ? props.formattedRow[\n props.column.field\n ]\n : \"\"\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description:\n props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.file.location\n }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Download\"\n ? _c(\n \"span\",\n [\n _vm.config.downloadUrl &&\n props.row.file.location &&\n [\"Downloaded\", \"Archived\"].includes(\n props.row.status\n )\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n _vm.config.downloadUrl +\n props.row.file.location\n }\n },\n [_vm._v(\"Download\")]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass:\n \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\n \"span\",\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 4204561448\n )\n })\n : _vm._e()\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-start-backlog-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeBacklogSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-hidden\": \"true\"\n }\n },\n [_vm._v(\"Ã\")]\n ),\n _vm._v(\" \"),\n _c(\"h4\", { staticClass: \"modal-title\" }, [\n _vm._v(\"Start search?\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [\n _vm._v(\n \"Some episodes have been changed to 'Wanted'. Do you want to trigger a backlog search for these \" +\n _vm._s(_vm.backlogSearchEpisodes.length) +\n \" episode(s)\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search(_vm.backlogSearchEpisodes, \"backlog\")\n _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-mark-failed-and-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeFailedSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _vm._v(\n \"\\n Mark episode as failed and search?\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [_vm._v(\"Starting to search for the episode\")]),\n _vm._v(\" \"),\n _vm.failedSearchEpisode\n ? _c(\"p\", [\n _vm._v(\n \"Would you also like to mark episode \" +\n _vm._s(_vm.failedSearchEpisode.slug) +\n ' as \"failed\"? This will make sure the episode cannot be downloaded again'\n )\n ])\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search([_vm.failedSearchEpisode], \"backlog\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search([_vm.failedSearchEpisode], \"failed\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\n \"query-mark-failed-and-search\"\n )\n }\n }\n },\n [_vm._v(\"Cancel\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"display-show-template\", class: _vm.theme },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _vm.show.id.slug\n ? _c(\"backstretch\", { attrs: { slug: _vm.show.id.slug } })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-id\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"indexer-name\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-slug\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"show-header\", {\n ref: \"show-header\",\n attrs: { type: \"show\", \"show-id\": _vm.id, \"show-indexer\": _vm.indexer },\n on: {\n reflow: _vm.reflowLayout,\n update: _vm.statusQualityUpdate,\n \"update-overview-status\": function($event) {\n _vm.filterByOverviewStatus = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\" },\n [\n _vm.show.seasons\n ? _c(\"vue-good-table\", {\n ref: \"table-seasons\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.orderSeasons,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: _vm.layout.show.pagination.enable,\n perPage: _vm.paginationPerPage,\n perPageDropdown: _vm.perPageDropdown\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search episodes\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: _vm.getSortBy(\"episode\", \"desc\")\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: true\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n },\n \"on-per-page-change\": function($event) {\n return _vm.updatePaginationPerPage(\n $event.currentPerPage\n )\n },\n \"on-page-change\": _vm.onPageChange\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n {\n staticClass: \"season-header toggle collapse\"\n },\n [\n _c(\"app-link\", {\n attrs: {\n name: \"season-\" + props.row.season\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass:\n \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip:\n props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[\n props.column.field\n ],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.formattedRow[\n props.column.field\n ] || 0,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n props.formattedRow[\n props.column.field\n ],\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value: props.formattedRow[\n props.column.field\n ]\n ? props.formattedRow[\n props.column.field\n ]\n : \"\"\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description:\n props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.file.location\n }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Download\"\n ? _c(\n \"span\",\n [\n _vm.config.downloadUrl &&\n props.row.file.location &&\n [\"Downloaded\", \"Archived\"].includes(\n props.row.status\n )\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n _vm.config.downloadUrl +\n props.row.file.location\n }\n },\n [_vm._v(\"Download\")]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: flag,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass:\n \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: flag,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\n \"span\",\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 377733710\n )\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.layout.show.specials &&\n _vm.specials &&\n _vm.specials.length > 0\n ? _c(\"vue-good-table\", {\n ref: \"table-specials\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.specials,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: false\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search specials\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: _vm.getSortBy(\"episode\", \"desc\")\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: false\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n }\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n {\n staticClass: \"season-header toggle collapse\"\n },\n [\n _c(\"app-link\", {\n attrs: {\n name: \"season-\" + props.row.season\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass:\n \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip:\n props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[\n props.column.field\n ],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.formattedRow[\n props.column.field\n ] || 0,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n props.formattedRow[\n props.column.field\n ],\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value: props.formattedRow[\n props.column.field\n ]\n ? props.formattedRow[\n props.column.field\n ]\n : \"\"\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description:\n props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.file.location\n }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Download\"\n ? _c(\n \"span\",\n [\n _vm.config.downloadUrl &&\n props.row.file.location &&\n [\"Downloaded\", \"Archived\"].includes(\n props.row.status\n )\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n _vm.config.downloadUrl +\n props.row.file.location\n }\n },\n [_vm._v(\"Download\")]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass:\n \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\n \"span\",\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 1270435715\n )\n })\n : _vm._e()\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-start-backlog-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeBacklogSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-hidden\": \"true\"\n }\n },\n [_vm._v(\"Ã\")]\n ),\n _vm._v(\" \"),\n _c(\"h4\", { staticClass: \"modal-title\" }, [\n _vm._v(\"Start search?\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [\n _vm._v(\n \"Some episodes have been changed to 'Wanted'. Do you want to trigger a backlog search for these \" +\n _vm._s(_vm.backlogSearchEpisodes.length) +\n \" episode(s)\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search(_vm.backlogSearchEpisodes, \"backlog\")\n _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-mark-failed-and-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeFailedSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _vm._v(\n \"\\n Mark episode as failed and search?\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [_vm._v(\"Starting to search for the episode\")]),\n _vm._v(\" \"),\n _vm.failedSearchEpisode\n ? _c(\"p\", [\n _vm._v(\n \"Would you also like to mark episode \" +\n _vm._s(_vm.failedSearchEpisode.slug) +\n ' as \"failed\"? This will make sure the episode cannot be downloaded again'\n )\n ])\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search([_vm.failedSearchEpisode], \"backlog\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search([_vm.failedSearchEpisode], \"failed\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\n \"query-mark-failed-and-search\"\n )\n }\n }\n },\n [_vm._v(\"Cancel\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1142,7 +1200,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return !_vm.link\n ? _c(\n \"img\",\n _vm._b(\n {\n on: {\n error: function($event) {\n _vm.error = true\n }\n }\n },\n \"img\",\n {\n src: _vm.src,\n class: _vm.cls,\n \"data-src\": _vm.dataSrc,\n class: _vm.newCls\n },\n false\n )\n )\n : _c(\"app-link\", { attrs: { href: _vm.href } }, [\n _c(\n \"img\",\n _vm._b(\n {\n on: {\n error: function($event) {\n _vm.error = true\n }\n }\n },\n \"img\",\n {\n src: _vm.src,\n class: _vm.cls,\n \"data-src\": _vm.dataSrc,\n class: _vm.newCls\n },\n false\n )\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/helpers/asset.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return !_vm.lazy\n ? _c(\n \"div\",\n { staticStyle: { display: \"inherit\" } },\n [\n !_vm.link\n ? _c(\n \"img\",\n _vm._b(\n {\n on: {\n error: function($event) {\n _vm.error = true\n }\n }\n },\n \"img\",\n { src: _vm.src, class: _vm.cls, class: _vm.newCls },\n false\n )\n )\n : _c(\"app-link\", { attrs: { href: _vm.href } }, [\n _c(\n \"img\",\n _vm._b(\n {\n on: {\n error: function($event) {\n _vm.error = true\n }\n }\n },\n \"img\",\n { src: _vm.src, class: _vm.newCls },\n false\n )\n )\n ])\n ],\n 1\n )\n : _c(\n \"div\",\n { staticStyle: { display: \"inherit\" } },\n [\n !_vm.link\n ? _c(\"lazy-image\", {\n attrs: {\n \"lazy-src\": _vm.src,\n \"lazy-cls\": _vm.newCls,\n \"lazy-default-src\": _vm.defaultSrc\n }\n })\n : _c(\n \"app-link\",\n { attrs: { href: _vm.href } },\n [\n _c(\"lazy-image\", {\n attrs: {\n \"lazy-src\": _vm.src,\n \"lazy-cls\": _vm.newCls,\n \"lazy-default-src\": _vm.defaultSrc\n }\n })\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/helpers/asset.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1230,6 +1288,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ }), +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./src/components/helpers/lazy-image.vue?vue&type=template&id=2a36af9c&scoped=true&": +/*!************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/helpers/lazy-image.vue?vue&type=template&id=2a36af9c&scoped=true& ***! + \************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"img\", {\n staticClass: \"app-image\",\n class: _vm.lazyCls,\n style: _vm.style,\n attrs: { \"data-src\": _vm.lazySrc, \"data-srcset\": _vm.lazySrcset },\n on: {\n error: function($event) {\n _vm.error = true\n }\n }\n })\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/helpers/lazy-image.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./src/components/helpers/load-progress-bar.vue?vue&type=template&id=dbcb65e0&": /*!*******************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/helpers/load-progress-bar.vue?vue&type=template&id=dbcb65e0& ***! @@ -1442,7 +1512,19 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"show-header-container\" },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"col-lg-12\",\n attrs: { id: \"showtitle\", \"data-showname\": _vm.show.title }\n },\n [\n _c(\"div\", [\n _c(\n \"h1\",\n {\n staticClass: \"title\",\n attrs: {\n \"data-indexer-name\": _vm.show.indexer,\n \"data-series-id\": _vm.show.id[_vm.show.indexer],\n id: \"scene_exception_\" + _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _vm.type === \"snatch-selection\"\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\"\\n Manual search for:\"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n ),\n _vm._v(\" / Season \" + _vm._s(_vm.season)),\n _vm.episode !== undefined &&\n _vm.manualSearchType !== \"season\"\n ? [_vm._v(\" Episode \" + _vm._s(_vm.episode))]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.type !== \"snatch-selection\" && _vm.seasons.length >= 1\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _vm.seasons.includes(0)\n ? _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Display Specials: \"\n ),\n _c(\n \"a\",\n {\n staticClass: \"inner\",\n staticStyle: { cursor: \"pointer\" },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.toggleSpecials()\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n _vm.displaySpecials ? \"Hide\" : \"Show\"\n )\n )\n ]\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"h2footer display-seasons clear\" },\n [\n _c(\n \"span\",\n [\n _vm.seasons.length >= 15\n ? _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.jumpToSeason,\n expression: \"jumpToSeason\"\n }\n ],\n staticClass: \"form-control input-sm\",\n staticStyle: { position: \"relative\" },\n attrs: { id: \"seasonJump\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.jumpToSeason = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { value: \"jump\" } },\n [_vm._v(\"Jump to Season\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.seasons, function(\n seasonNumber\n ) {\n return _c(\n \"option\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n domProps: { value: seasonNumber }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : \"Season \" + seasonNumber\n ) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n )\n : _vm.seasons.length >= 1\n ? [\n _vm._v(\n \"\\n Season:\\n \"\n ),\n _vm._l(_vm.reverse(_vm.seasons), function(\n seasonNumber,\n index\n ) {\n return [\n _c(\n \"app-link\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n attrs: {\n href: \"#season-\" + seasonNumber\n },\n nativeOn: {\n click: function($event) {\n $event.preventDefault()\n _vm.jumpToSeason = seasonNumber\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : seasonNumber\n ) +\n \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n index !== _vm.seasons.length - 1\n ? _c(\n \"span\",\n {\n key: \"separator-\" + index,\n staticClass: \"separator\"\n },\n [_vm._v(\"| \")]\n )\n : _vm._e()\n ]\n })\n ]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _vm._l(_vm.activeShowQueueStatuses, function(queueItem) {\n return _c(\"div\", { key: queueItem.action, staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"alert alert-info\" }, [\n _vm._v(\"\\n \" + _vm._s(queueItem.message) + \"\\n \")\n ])\n ])\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"summaryBackground\" }\n },\n [\n _c(\"div\", { staticClass: \"row\", attrs: { id: \"row-show-summary\" } }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { id: \"col-show-summary\" } },\n [\n _c(\"div\", { staticClass: \"show-poster-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"image-flex-container col-md-12\" },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/poster.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"posterThumb\",\n cls: \"show-image shadow\",\n link: true\n }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"ver-spacer\" }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-info-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"pull-right col-lg-3 col-md-3 hidden-sm hidden-xs\"\n },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/banner.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"banner\",\n cls: \"show-banner pull-right shadow\",\n link: true\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"show-rating\" }\n },\n [\n _vm.show.rating.imdb && _vm.show.rating.imdb.rating\n ? _c(\n \"span\",\n {\n staticClass: \"imdbstars\",\n attrs: {\n \"qtip-content\":\n _vm.show.rating.imdb.rating +\n \" / 10 Stars
\" +\n _vm.show.rating.imdb.votes +\n \" Votes\"\n }\n },\n [\n _c(\"span\", {\n style: {\n width:\n Number(_vm.show.rating.imdb.rating) * 10 +\n \"%\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n !_vm.show.id.imdb\n ? [\n _vm.show.year.start\n ? _c(\"span\", [\n _vm._v(\n \"(\" +\n _vm._s(_vm.show.year.start) +\n \") - \" +\n _vm._s(_vm.show.runtime) +\n \" minutes - \"\n )\n ])\n : _vm._e()\n ]\n : [\n _vm._l(_vm.show.countryCodes, function(country) {\n return _c(\"img\", {\n key: \"flag-\" + country,\n class: [\"country-flag\", \"flag-\" + country],\n staticStyle: {\n \"margin-left\": \"3px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n src: \"images/blank.png\",\n width: \"16\",\n height: \"11\"\n }\n })\n }),\n _vm._v(\" \"),\n _vm.show.imdbInfo.year\n ? _c(\"span\", [\n _vm._v(\n \"\\n (\" +\n _vm._s(_vm.show.imdbInfo.year) +\n \") -\\n \"\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.imdbInfo.runtimes ||\n _vm.show.runtime\n ) +\n \" minutes\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb,\n title:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _vm.show.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[_vm.show.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl,\n title: _vm.showIndexerUrl\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[_vm.show.indexer].name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[_vm.show.indexer].icon\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.xemNumbering &&\n _vm.show.xemNumbering.length > 0\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://thexem.de/search?q=\" +\n _vm.show.title,\n title:\n \"http://thexem.de/search?q=\" +\n _vm.show.title\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[xem]\",\n height: \"16\",\n width: \"16\",\n src: \"images/xem.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.id.tvdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://fanart.tv/series/\" +\n _vm.show.id.tvdb,\n title:\n \"https://fanart.tv/series/\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\"img\", {\n staticClass: \"fanart\",\n attrs: {\n alt: \"[fanart.tv]\",\n height: \"16\",\n width: \"16\",\n src: \"images/fanart.tv.png\"\n }\n })\n ]\n )\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"tags\" }\n },\n [\n _vm.show.genres\n ? _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(\n _vm.dedupeGenres(_vm.show.genres),\n function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://trakt.tv/shows/popular/?genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on trakt.tv\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }\n ),\n 1\n )\n : _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(_vm.showGenres, function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://www.imdb.com/search/title?count=100&title_type=tv_series&genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on IMDB\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }),\n 1\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.configLoaded\n ? _c(\n \"div\",\n {\n ref: \"summary\",\n staticClass: \"col-md-12\",\n attrs: { id: \"summary\" }\n },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-9 col-md-8 col-sm-8 col-xs-12\",\n class: {\n summaryFanArt: _vm.layout.fanartBackground\n },\n attrs: { id: \"show-summary\" }\n },\n [\n _c(\n \"table\",\n { staticClass: \"summaryTable pull-left\" },\n [\n _vm.show.plot\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticStyle: {\n \"padding-bottom\": \"15px\"\n },\n attrs: { colspan: \"2\" }\n },\n [\n _c(\"truncate\", {\n attrs: {\n length: 250,\n clamp: \"show more...\",\n less: \"show less...\",\n text: _vm.show.plot\n },\n on: {\n toggle: function($event) {\n return _vm.$emit(\"reflow\")\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.getQualityPreset({\n value: _vm.combinedQualities\n }) !== undefined\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Quality:\")]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\"quality-pill\", {\n attrs: {\n quality:\n _vm.combinedQualities\n }\n })\n ],\n 1\n )\n ])\n : [\n _vm.combineQualities(\n _vm.show.config.qualities.allowed\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Allowed Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.allowed,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"allowed-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.combineQualities(\n _vm.show.config.qualities\n .preferred\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Preferred Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.preferred,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"preferred-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n _vm._v(\" \"),\n _vm.show.network && _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\n \" on \" +\n _vm._s(_vm.show.network)\n )\n ])\n ])\n : _vm.show.network\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.network))\n ])\n ])\n : _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Show Status: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.status))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Default EP Status: \")]\n ),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config\n .defaultEpisodeStatus\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [_vm._v(\"Location: \")]\n )\n ]\n ),\n _c(\"td\", [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [\n _vm._v(\n _vm._s(_vm.show.config.location)\n )\n ]\n ),\n _vm._v(\n _vm._s(\n _vm.show.config.locationValid\n ? \"\"\n : \" (Missing)\"\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _vm.show.config.aliases.filter(function(\n alias\n ) {\n return alias.season === -1\n }).length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [_vm._v(\"Scene Name:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.aliases\n .filter(function(alias) {\n return alias.season === -1\n })\n .map(function(alias) {\n return alias.title\n })\n .join(\", \")\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.requiredWords\n .length +\n _vm.search.filters.required.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n required:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Required Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .requiredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.requiredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.required\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .requiredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .requiredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.required.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.ignoredWords\n .length +\n _vm.search.filters.ignored.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n ignored:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Ignored Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .ignoredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.ignoredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.ignored\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .ignoredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .ignoredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.ignored.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.preferred.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n preferred:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Preferred Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.preferred.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.undesired.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n undesired:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Undesired Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.undesired.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.whitelist &&\n _vm.show.config.release.whitelist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Wanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.whitelist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.blacklist &&\n _vm.show.config.release.blacklist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Unwanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.blacklist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.airdateOffset !== 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Daily search offset:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.airdateOffset\n ) + \" hours\"\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.locationValid &&\n _vm.show.size > -1\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Size:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.humanFileSize(\n _vm.show.size\n )\n )\n )\n ])\n ])\n : _vm._e()\n ],\n 2\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-3 col-md-4 col-sm-4 col-xs-12 pull-xs-left\",\n attrs: { id: \"show-status\" }\n },\n [\n _c(\n \"table\",\n {\n staticClass:\n \"pull-xs-left pull-md-right pull-sm-right pull-lg-right\"\n },\n [\n _vm.show.language\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Info Language:\")]\n ),\n _c(\"td\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n _vm.getCountryISO2ToISO3(\n _vm.show.language\n ) +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: _vm.show.language,\n title: _vm.show.language,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.config.subtitles.enabled\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Subtitles: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .subtitlesEnabled\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"subtitlesEnabled\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Season Folders: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .seasonFolders ||\n _vm.config.namingForceFolders\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Paused: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.paused\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"paused\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Air-by-Date: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.airByDate\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"airByDate\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Sports: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.sports\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"sports\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Anime: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.anime\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"anime\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"DVD Order: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.dvdOrder\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"dvdOrder\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Scene Numbering: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.scene\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"scene\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n ]\n )\n ]\n )\n ])\n ]\n )\n : _vm._e()\n ])\n ])\n ]\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"episodes-controll-background\" }\n },\n [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"row\",\n attrs: { id: \"row-show-episodes-controls\" }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12\",\n attrs: { id: \"col-show-episodes-controls\" }\n },\n [\n _vm.type === \"show\"\n ? _c(\"div\", { staticClass: \"row key\" }, [\n _c(\n \"div\",\n {\n ref: \"checkboxControls\",\n staticClass: \"col-lg-12\",\n attrs: { id: \"checkboxControls\" }\n },\n [\n _vm.show.seasons\n ? _c(\n \"div\",\n {\n staticClass: \"pull-left top-5\",\n attrs: { id: \"key-padding\" }\n },\n _vm._l(_vm.overviewStatus, function(\n status\n ) {\n return _c(\n \"label\",\n {\n key: status.id,\n attrs: { for: status.id }\n },\n [\n _c(\"span\", { class: status.id }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: status.checked,\n expression: \"status.checked\"\n }\n ],\n attrs: {\n type: \"checkbox\",\n id: status.id\n },\n domProps: {\n checked: Array.isArray(\n status.checked\n )\n ? _vm._i(\n status.checked,\n null\n ) > -1\n : status.checked\n },\n on: {\n change: [\n function($event) {\n var $$a = status.checked,\n $$el = $event.target,\n $$c = $$el.checked\n ? true\n : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(\n status,\n \"checked\",\n $$a.concat([$$v])\n )\n } else {\n $$i > -1 &&\n _vm.$set(\n status,\n \"checked\",\n $$a\n .slice(0, $$i)\n .concat(\n $$a.slice(\n $$i + 1\n )\n )\n )\n }\n } else {\n _vm.$set(\n status,\n \"checked\",\n $$c\n )\n }\n },\n function($event) {\n return _vm.$emit(\n \"update-overview-status\",\n _vm.overviewStatus\n )\n }\n ]\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \": \"\n ),\n _c(\"b\", [\n _vm._v(\n _vm._s(\n _vm.episodeSummary[\n status.name\n ]\n )\n )\n ])\n ])\n ]\n )\n }),\n 0\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"pull-lg-right top-5\" },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedStatus,\n expression: \"selectedStatus\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"statusSelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedStatus = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change status to:\"\n }\n },\n [_vm._v(\"Change status to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(\n _vm.changeStatusOptions,\n function(status) {\n return _c(\n \"option\",\n {\n key: status.key,\n domProps: {\n value: status.value\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \"\\n \"\n )\n ]\n )\n }\n )\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedQuality,\n expression: \"selectedQuality\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"qualitySelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedQuality = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change quality to:\"\n }\n },\n [_vm._v(\"Change quality to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.qualities, function(\n quality\n ) {\n return _c(\n \"option\",\n {\n key: quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-slug\"\n },\n domProps: { value: _vm.show.id.slug }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-id\"\n },\n domProps: {\n value: _vm.show.id[_vm.show.indexer]\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"indexer\" },\n domProps: { value: _vm.show.indexer }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n id: \"changeStatus\",\n value: \"Go\"\n },\n on: { click: _vm.changeStatusClicked }\n })\n ]\n )\n ]\n )\n ])\n : _c(\"div\")\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"show-header-container\" },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"col-lg-12\",\n attrs: { id: \"showtitle\", \"data-showname\": _vm.show.title }\n },\n [\n _c(\"div\", [\n _c(\n \"h1\",\n {\n staticClass: \"title\",\n attrs: {\n \"data-indexer-name\": _vm.show.indexer,\n \"data-series-id\": _vm.show.id[_vm.show.indexer],\n id: \"scene_exception_\" + _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _vm.type === \"snatch-selection\"\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right episode-info\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Manual search for: Season \" +\n _vm._s(_vm.season)\n ),\n _vm.episode !== undefined &&\n _vm.manualSearchType !== \"season\"\n ? [_vm._v(\" Episode \" + _vm._s(_vm.episode))]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _vm.manualSearchType !== \"season\" && _vm.episodeTitle\n ? _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.episodeTitle) +\n \"\\n \"\n )\n ])\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.type !== \"snatch-selection\" && _vm.seasons.length >= 1\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _vm.seasons.includes(0)\n ? _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Display Specials: \"\n ),\n _c(\n \"a\",\n {\n staticClass: \"inner\",\n staticStyle: { cursor: \"pointer\" },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.toggleSpecials()\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n _vm.displaySpecials ? \"Hide\" : \"Show\"\n )\n )\n ]\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"h2footer display-seasons clear\" },\n [\n _c(\n \"span\",\n [\n _vm.seasons.length >= 15\n ? _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.jumpToSeason,\n expression: \"jumpToSeason\"\n }\n ],\n staticClass: \"form-control input-sm\",\n staticStyle: { position: \"relative\" },\n attrs: { id: \"seasonJump\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.jumpToSeason = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { value: \"jump\" } },\n [_vm._v(\"Jump to Season\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.seasons, function(\n seasonNumber\n ) {\n return _c(\n \"option\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n domProps: { value: seasonNumber }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : \"Season \" + seasonNumber\n ) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n )\n : _vm.seasons.length >= 1\n ? [\n _vm._v(\n \"\\n Season:\\n \"\n ),\n _vm._l(_vm.reverse(_vm.seasons), function(\n seasonNumber,\n index\n ) {\n return [\n _c(\n \"app-link\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n attrs: {\n href: \"#season-\" + seasonNumber\n },\n nativeOn: {\n click: function($event) {\n $event.preventDefault()\n _vm.jumpToSeason = seasonNumber\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : seasonNumber\n ) +\n \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n index !== _vm.seasons.length - 1\n ? _c(\n \"span\",\n {\n key: \"separator-\" + index,\n staticClass: \"separator\"\n },\n [_vm._v(\"| \")]\n )\n : _vm._e()\n ]\n })\n ]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _vm._l(_vm.activeShowQueueStatuses, function(queueItem) {\n return _c(\"div\", { key: queueItem.action, staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"alert alert-info\" }, [\n _vm._v(\"\\n \" + _vm._s(queueItem.message) + \"\\n \")\n ])\n ])\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"summaryBackground\" }\n },\n [\n _c(\"div\", { staticClass: \"row\", attrs: { id: \"row-show-summary\" } }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { id: \"col-show-summary\" } },\n [\n _c(\"div\", { staticClass: \"show-poster-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"image-flex-container col-md-12\" },\n [\n _c(\"asset\", {\n attrs: {\n \"default-src\": \"images/poster.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"posterThumb\",\n cls: \"show-image shadow\",\n link: true\n }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"ver-spacer\" }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-info-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"pull-right col-lg-3 col-md-3 hidden-sm hidden-xs\"\n },\n [\n _c(\"asset\", {\n attrs: {\n \"default-src\": \"images/banner.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"banner\",\n cls: \"show-banner pull-right shadow\",\n link: true\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"show-rating\" }\n },\n [\n _vm.show.rating.imdb && _vm.show.rating.imdb.rating\n ? _c(\n \"span\",\n {\n staticClass: \"imdbstars\",\n attrs: {\n \"qtip-content\":\n _vm.show.rating.imdb.rating +\n \" / 10 Stars
\" +\n _vm.show.rating.imdb.votes +\n \" Votes\"\n }\n },\n [\n _c(\"span\", {\n style: {\n width:\n Number(_vm.show.rating.imdb.rating) * 10 +\n \"%\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n !_vm.show.id.imdb\n ? [\n _vm.show.year.start\n ? _c(\"span\", [\n _vm._v(\n \"(\" +\n _vm._s(_vm.show.year.start) +\n \") - \" +\n _vm._s(_vm.show.runtime) +\n \" minutes - \"\n )\n ])\n : _vm._e()\n ]\n : [\n _vm._l(_vm.show.countryCodes, function(country) {\n return _c(\"img\", {\n key: \"flag-\" + country,\n class: [\"country-flag\", \"flag-\" + country],\n staticStyle: {\n \"margin-left\": \"3px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n src: \"images/blank.png\",\n width: \"16\",\n height: \"11\"\n }\n })\n }),\n _vm._v(\" \"),\n _vm.show.imdbInfo.year\n ? _c(\"span\", [\n _vm._v(\n \"\\n (\" +\n _vm._s(_vm.show.imdbInfo.year) +\n \") -\\n \"\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.imdbInfo.runtimes ||\n _vm.show.runtime\n ) +\n \" minutes\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb,\n title:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _vm.show.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[_vm.show.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl,\n title: _vm.showIndexerUrl\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[_vm.show.indexer].name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[_vm.show.indexer].icon\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.xemNumbering &&\n _vm.show.xemNumbering.length > 0\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://thexem.de/search?q=\" +\n _vm.show.title,\n title:\n \"http://thexem.de/search?q=\" +\n _vm.show.title\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[xem]\",\n height: \"16\",\n width: \"16\",\n src: \"images/xem.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.id.tvdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://fanart.tv/series/\" +\n _vm.show.id.tvdb,\n title:\n \"https://fanart.tv/series/\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\"img\", {\n staticClass: \"fanart\",\n attrs: {\n alt: \"[fanart.tv]\",\n height: \"16\",\n width: \"16\",\n src: \"images/fanart.tv.png\"\n }\n })\n ]\n )\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"tags\" }\n },\n [\n _vm.show.genres\n ? _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(\n _vm.dedupeGenres(_vm.show.genres),\n function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://trakt.tv/shows/popular/?genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on trakt.tv\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }\n ),\n 1\n )\n : _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(_vm.showGenres, function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://www.imdb.com/search/title?count=100&title_type=tv_series&genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on IMDB\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }),\n 1\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.configLoaded\n ? _c(\n \"div\",\n {\n ref: \"summary\",\n staticClass: \"col-md-12\",\n attrs: { id: \"summary\" }\n },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-9 col-md-8 col-sm-8 col-xs-12\",\n class: {\n summaryFanArt: _vm.layout.fanartBackground\n },\n attrs: { id: \"show-summary\" }\n },\n [\n _c(\n \"table\",\n { staticClass: \"summaryTable pull-left\" },\n [\n _vm.show.plot\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticStyle: {\n \"padding-bottom\": \"15px\"\n },\n attrs: { colspan: \"2\" }\n },\n [\n _c(\"truncate\", {\n attrs: {\n length: 250,\n clamp: \"show more...\",\n less: \"show less...\",\n text: _vm.show.plot\n },\n on: {\n toggle: function($event) {\n return _vm.$emit(\"reflow\")\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.getQualityPreset({\n value: _vm.combinedQualities\n }) !== undefined\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Quality:\")]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\"quality-pill\", {\n attrs: {\n quality:\n _vm.combinedQualities\n }\n })\n ],\n 1\n )\n ])\n : [\n _vm.combineQualities(\n _vm.show.config.qualities.allowed\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Allowed Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.allowed,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"allowed-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.combineQualities(\n _vm.show.config.qualities\n .preferred\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Preferred Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.preferred,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"preferred-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n _vm._v(\" \"),\n _vm.show.network && _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\n \" on \" +\n _vm._s(_vm.show.network)\n )\n ])\n ])\n : _vm.show.network\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.network))\n ])\n ])\n : _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Show Status: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.status))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Default EP Status: \")]\n ),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config\n .defaultEpisodeStatus\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [_vm._v(\"Location: \")]\n )\n ]\n ),\n _c(\"td\", [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [\n _vm._v(\n _vm._s(_vm.show.config.location)\n )\n ]\n ),\n _vm._v(\n _vm._s(\n _vm.show.config.locationValid\n ? \"\"\n : \" (Missing)\"\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _vm.show.config.aliases.filter(function(\n alias\n ) {\n return alias.season === -1\n }).length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [_vm._v(\"Scene Name:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.aliases\n .filter(function(alias) {\n return alias.season === -1\n })\n .map(function(alias) {\n return alias.title\n })\n .join(\", \")\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.requiredWords\n .length +\n _vm.search.filters.required.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n required:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Required Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .requiredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.requiredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.required\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .requiredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .requiredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.required.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.ignoredWords\n .length +\n _vm.search.filters.ignored.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n ignored:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Ignored Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .ignoredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.ignoredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.ignored\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .ignoredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .ignoredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.ignored.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.preferred.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n preferred:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Preferred Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.preferred.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.undesired.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n undesired:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Undesired Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.undesired.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.whitelist &&\n _vm.show.config.release.whitelist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Wanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.whitelist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.blacklist &&\n _vm.show.config.release.blacklist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Unwanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.blacklist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.airdateOffset !== 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Daily search offset:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.airdateOffset\n ) + \" hours\"\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.locationValid &&\n _vm.show.size > -1\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Size:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.humanFileSize(\n _vm.show.size\n )\n )\n )\n ])\n ])\n : _vm._e()\n ],\n 2\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-3 col-md-4 col-sm-4 col-xs-12 pull-xs-left\",\n attrs: { id: \"show-status\" }\n },\n [\n _c(\n \"table\",\n {\n staticClass:\n \"pull-xs-left pull-md-right pull-sm-right pull-lg-right\"\n },\n [\n _vm.show.language\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Info Language:\")]\n ),\n _c(\"td\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n _vm.getCountryISO2ToISO3(\n _vm.show.language\n ) +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: _vm.show.language,\n title: _vm.show.language,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.config.subtitles.enabled\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Subtitles: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .subtitlesEnabled\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"subtitlesEnabled\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Season Folders: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .seasonFolders ||\n _vm.config.namingForceFolders\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Paused: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.paused\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"paused\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Air-by-Date: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.airByDate\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"airByDate\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Sports: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.sports\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"sports\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Anime: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.anime\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"anime\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"DVD Order: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.dvdOrder\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"dvdOrder\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Scene Numbering: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.scene\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"scene\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n ]\n )\n ]\n )\n ])\n ]\n )\n : _vm._e()\n ])\n ])\n ]\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"episodes-controll-background\" }\n },\n [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"row\",\n attrs: { id: \"row-show-episodes-controls\" }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12\",\n attrs: { id: \"col-show-episodes-controls\" }\n },\n [\n _vm.type === \"show\"\n ? _c(\"div\", { staticClass: \"row key\" }, [\n _c(\n \"div\",\n {\n ref: \"checkboxControls\",\n staticClass: \"col-lg-12\",\n attrs: { id: \"checkboxControls\" }\n },\n [\n _vm.show.seasons\n ? _c(\n \"div\",\n {\n staticClass: \"pull-left top-5\",\n attrs: { id: \"key-padding\" }\n },\n _vm._l(_vm.overviewStatus, function(\n status\n ) {\n return _c(\n \"label\",\n {\n key: status.id,\n attrs: { for: status.id }\n },\n [\n _c(\"span\", { class: status.id }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: status.checked,\n expression: \"status.checked\"\n }\n ],\n attrs: {\n type: \"checkbox\",\n id: status.id\n },\n domProps: {\n checked: Array.isArray(\n status.checked\n )\n ? _vm._i(\n status.checked,\n null\n ) > -1\n : status.checked\n },\n on: {\n change: [\n function($event) {\n var $$a = status.checked,\n $$el = $event.target,\n $$c = $$el.checked\n ? true\n : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(\n status,\n \"checked\",\n $$a.concat([$$v])\n )\n } else {\n $$i > -1 &&\n _vm.$set(\n status,\n \"checked\",\n $$a\n .slice(0, $$i)\n .concat(\n $$a.slice(\n $$i + 1\n )\n )\n )\n }\n } else {\n _vm.$set(\n status,\n \"checked\",\n $$c\n )\n }\n },\n function($event) {\n return _vm.$emit(\n \"update-overview-status\",\n _vm.overviewStatus\n )\n }\n ]\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \": \"\n ),\n _c(\"b\", [\n _vm._v(\n _vm._s(\n _vm.episodeSummary[\n status.name\n ]\n )\n )\n ])\n ])\n ]\n )\n }),\n 0\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"pull-lg-right top-5\" },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedStatus,\n expression: \"selectedStatus\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"statusSelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedStatus = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change status to:\"\n }\n },\n [_vm._v(\"Change status to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(\n _vm.changeStatusOptions,\n function(status) {\n return _c(\n \"option\",\n {\n key: status.key,\n domProps: {\n value: status.value\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \"\\n \"\n )\n ]\n )\n }\n )\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedQuality,\n expression: \"selectedQuality\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"qualitySelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedQuality = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change quality to:\"\n }\n },\n [_vm._v(\"Change quality to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.qualities, function(\n quality\n ) {\n return _c(\n \"option\",\n {\n key: quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-slug\"\n },\n domProps: { value: _vm.show.id.slug }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-id\"\n },\n domProps: {\n value: _vm.show.id[_vm.show.indexer]\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"indexer\" },\n domProps: { value: _vm.show.indexer }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n id: \"changeStatus\",\n value: \"Go\"\n },\n on: { click: _vm.changeStatusClicked }\n })\n ]\n )\n ]\n )\n ])\n : _c(\"div\")\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./src/components/show-history.vue?vue&type=template&id=c645b858&scoped=true&": +/*!******************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/show-history.vue?vue&type=template&id=c645b858&scoped=true& ***! + \******************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"show-history-wrapper\",\n class: { \"component-margin\": !_vm.hideHistory }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15\" },\n [\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.history.length > 0,\n expression: \"history.length > 0\"\n }\n ],\n staticClass: \"button-row\"\n },\n [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n \"column-filter-options\": {\n enabled: true\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider/Group\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n [\"Snatched\", \"Failed\"].includes(\n props.row.statusName\n )\n ? [\n _c(\"img\", {\n staticClass: \"addQTip\",\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\",\n title: props.row.provider.name,\n onError:\n \"this.onerror=null;this.src='images/providers/missing.png';\"\n }\n })\n ]\n : _vm._e(),\n _vm._v(\" \"),\n props.row.statusName === \"Downloaded\"\n ? _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.row.statusName === \"Subtitled\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/subtitles/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\",\n title: props.row.provider.name\n }\n })\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.provider.name) +\n \"\\n \"\n )\n ])\n ],\n 2\n )\n : props.column.label === \"Release\" &&\n props.row.statusName === \"Subtitled\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.resource !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n props.row.resource +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: props.row.resource,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n : _c(\"img\", {\n staticClass: \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n props.row.resource +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: props.row.resource,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1454,7 +1536,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"horizontal-scroll\" },\n [\n _vm.shows.length > 0\n ? _c(\"vue-good-table\", {\n class: { fanartOpacity: _vm.stateLayout.fanartBackground },\n attrs: {\n columns: _vm.columns,\n rows: _vm.shows,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"title\", type: \"asc\" }\n },\n \"column-filter-options\": {\n enabled: true\n }\n },\n on: { \"on-sort-change\": _vm.saveSorting },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label == \"Next Ep\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.nextAirDate\n ? _vm.fuzzyParseDateTime(\n props.row.nextAirDate\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Prev Ep\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.prevAirDate\n ? _vm.fuzzyParseDateTime(\n props.row.prevAirDate\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Show\"\n ? _c(\"span\", { staticClass: \"tvShow\" }, [\n _c(\"span\", { staticStyle: { display: \"none\" } }, [\n _vm._v(_vm._s(props.row.title))\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"imgbanner banner\" },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n props.row.indexer +\n \"&seriesid=\" +\n props.row.id[props.row.indexer]\n }\n },\n [\n _c(\"asset\", {\n staticClass: \"banner\",\n attrs: {\n default: \"images/banner.png\",\n \"show-slug\": props.row.id.slug,\n type: \"banner\",\n alt: props.row.title,\n title: props.row.title\n }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n : props.column.label == \"Network\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.network\n ? [\n _c(\n \"span\",\n {\n staticClass: \"hidden-print\",\n attrs: { title: props.row.network }\n },\n [\n _c(\"asset\", {\n attrs: {\n default:\n \"images/network/nonetwork.png\",\n \"show-slug\":\n props.row.indexer +\n props.row.id[props.row.indexer],\n type: \"network\",\n cls: \"show-network-image\",\n link: false,\n width: \"54\",\n height: \"27\",\n alt: props.row.network,\n title: props.row.network\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"span\",\n { staticClass: \"visible-print-inline\" },\n [_vm._v(_vm._s(props.row.network))]\n )\n ]\n : [\n _c(\n \"span\",\n {\n staticClass: \"hidden-print\",\n attrs: { title: \"No Network\" }\n },\n [\n _c(\"img\", {\n attrs: {\n id: \"network\",\n width: \"54\",\n height: \"27\",\n src: \"images/network/nonetwork.png\",\n alt: \"No Network\",\n title: \"No Network\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"span\",\n { staticClass: \"visible-print-inline\" },\n [_vm._v(\"No Network\")]\n )\n ]\n ],\n 2\n )\n : props.column.label == \"Indexer\"\n ? _c(\n \"span\",\n { staticClass: \"align-center indexer-image\" },\n [\n props.row.id.imdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://www.imdb.com/title/\" +\n props.row.id.imdb,\n title:\n \"http://www.imdb.com/title/\" +\n props.row.id.imdb\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n props.row.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n props.row.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n props.row.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[props.row.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl(props.row),\n title: _vm.showIndexerUrl(props.row)\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[props.row.indexer]\n .name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[props.row.indexer]\n .icon\n }\n })\n ]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n _c(\"quality-pill\", {\n attrs: {\n allowed: props.row.config.qualities.allowed,\n preferred:\n props.row.config.qualities.preferred,\n \"show-title\": \"\"\n }\n })\n ],\n 1\n )\n : props.column.label == \"Downloads\"\n ? _c(\n \"span\",\n [\n _c(\n \"progress-bar\",\n _vm._b(\n {},\n \"progress-bar\",\n props.row.stats.tooltip,\n false\n )\n )\n ],\n 1\n )\n : props.column.label == \"Size\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.prettyBytes(props.row.stats.episodes.size)\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Active\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.config &&\n !props.row.config.paused &&\n props.row.status === \"Continuing\"\n ? \"yes\"\n : \"no\") +\n \"16.png\",\n alt:\n props.row.config &&\n !props.row.config.paused &&\n props.row.status === \"Continuing\"\n ? \"yes\"\n : \"no\",\n width: \"16\",\n height: \"16\"\n }\n })\n ])\n : props.column.label === \"Xem\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.xemNumbering &&\n props.row.xemNumbering.length !== 0\n ? \"yes\"\n : \"no\") +\n \"16.png\",\n alt:\n props.row.xemNumbering &&\n props.row.xemNumbering.length !== 0\n ? \"yes\"\n : \"no\",\n width: \"16\",\n height: \"16\"\n }\n })\n ])\n : _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 3182254419\n )\n })\n : _vm._e()\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-list/banner.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"horizontal-scroll\" },\n [\n _vm.shows.length > 0\n ? _c(\"vue-good-table\", {\n class: { fanartOpacity: _vm.stateLayout.fanartBackground },\n attrs: {\n columns: _vm.columns,\n rows: _vm.shows,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: _vm.getSortBy()\n },\n \"column-filter-options\": {\n enabled: true\n }\n },\n on: { \"on-sort-change\": _vm.saveSorting },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label == \"Next Ep\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.nextAirDate\n ? _vm.fuzzyParseDateTime(\n props.row.nextAirDate\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Prev Ep\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.prevAirDate\n ? _vm.fuzzyParseDateTime(\n props.row.prevAirDate\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Show\"\n ? _c(\"span\", { staticClass: \"tvShow\" }, [\n _c(\"span\", { staticStyle: { display: \"none\" } }, [\n _vm._v(_vm._s(props.row.title))\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"imgbanner\" },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n props.row.indexer +\n \"&seriesid=\" +\n props.row.id[props.row.indexer]\n }\n },\n [\n _c(\"asset\", {\n attrs: {\n \"default-src\": \"images/banner.png\",\n \"show-slug\": props.row.id.slug,\n type: \"banner\",\n cls: \"banner\",\n alt: props.row.title,\n title: props.row.title\n }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n : props.column.label == \"Network\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.network\n ? [\n _c(\n \"span\",\n {\n staticClass: \"hidden-print\",\n attrs: { title: props.row.network }\n },\n [\n _c(\"asset\", {\n attrs: {\n \"default-src\":\n \"images/network/nonetwork.png\",\n \"show-slug\":\n props.row.indexer +\n props.row.id[props.row.indexer],\n type: \"network\",\n cls: \"show-network-image\",\n link: false,\n width: \"54\",\n height: \"27\",\n alt: props.row.network,\n title: props.row.network\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"span\",\n { staticClass: \"visible-print-inline\" },\n [_vm._v(_vm._s(props.row.network))]\n )\n ]\n : [\n _c(\n \"span\",\n {\n staticClass: \"hidden-print\",\n attrs: { title: \"No Network\" }\n },\n [\n _c(\"img\", {\n attrs: {\n id: \"network\",\n width: \"54\",\n height: \"27\",\n src: \"images/network/nonetwork.png\",\n alt: \"No Network\",\n title: \"No Network\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"span\",\n { staticClass: \"visible-print-inline\" },\n [_vm._v(\"No Network\")]\n )\n ]\n ],\n 2\n )\n : props.column.label == \"Indexer\"\n ? _c(\n \"span\",\n { staticClass: \"align-center indexer-image\" },\n [\n props.row.id.imdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://www.imdb.com/title/\" +\n props.row.id.imdb,\n title:\n \"http://www.imdb.com/title/\" +\n props.row.id.imdb\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n props.row.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n props.row.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n props.row.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[props.row.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl(props.row),\n title: _vm.showIndexerUrl(props.row)\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[props.row.indexer]\n .name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[props.row.indexer]\n .icon\n }\n })\n ]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n _c(\"quality-pill\", {\n attrs: {\n allowed: props.row.config.qualities.allowed,\n preferred:\n props.row.config.qualities.preferred,\n \"show-title\": \"\"\n }\n })\n ],\n 1\n )\n : props.column.label == \"Downloads\"\n ? _c(\n \"span\",\n [\n _c(\n \"progress-bar\",\n _vm._b(\n {},\n \"progress-bar\",\n props.row.stats.tooltip,\n false\n )\n )\n ],\n 1\n )\n : props.column.label == \"Size\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.prettyBytes(props.row.stats.episodes.size)\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Active\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.config &&\n !props.row.config.paused &&\n props.row.status === \"Continuing\"\n ? \"yes\"\n : \"no\") +\n \"16.png\",\n alt:\n props.row.config &&\n !props.row.config.paused &&\n props.row.status === \"Continuing\"\n ? \"yes\"\n : \"no\",\n width: \"16\",\n height: \"16\"\n }\n })\n ])\n : props.column.label === \"Xem\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.xemNumbering &&\n props.row.xemNumbering.length !== 0\n ? \"yes\"\n : \"no\") +\n \"16.png\",\n alt:\n props.row.xemNumbering &&\n props.row.xemNumbering.length !== 0\n ? \"yes\"\n : \"no\",\n width: \"16\",\n height: \"16\"\n }\n })\n ])\n : _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 3337244109\n )\n })\n : _vm._e()\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-list/banner.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1478,7 +1560,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"row\", attrs: { name: \"poster-container-row\" } },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { name: \"poster-container-col\" } },\n [\n _c(\n \"isotope\",\n {\n directives: [\n {\n name: \"images-loaded\",\n rawName: \"v-images-loaded:on.always\",\n value: _vm.updateLayout,\n expression: \"updateLayout\",\n arg: \"on\",\n modifiers: { always: true }\n }\n ],\n ref: \"isotope-\" + _vm.listTitle,\n attrs: {\n list: _vm.sortedShows,\n id: \"isotope-container-\" + _vm.listTitle,\n \"item-selector\": \"show-container\",\n options: _vm.option\n }\n },\n _vm._l(_vm.sortedShows, function(show) {\n return _c(\n \"div\",\n {\n key: show.id.slug,\n style: _vm.showContainerStyle,\n attrs: {\n id: show.id.slug,\n \"data-name\": show.title,\n \"data-date\": show.airDate,\n \"data-network\": show.network,\n \"data-indexer\": show.indexer\n }\n },\n [\n _c(\"div\", { staticClass: \"overlay-container\" }, [\n _c(\"div\", { staticClass: \"background-image\" }, [\n _c(\"img\", {\n attrs: { src: \"images/poster-back-dark.png\" }\n })\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"poster-overlay\" },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n show.indexer +\n \"&seriesid=\" +\n show.id[show.indexer]\n }\n },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/poster.png\",\n \"show-slug\": show.id.slug,\n lazy: true,\n type: \"posterThumb\",\n cls: \"show-image\",\n link: false\n }\n })\n ],\n 1\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-poster-footer row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\" },\n [\n _c(\"progress-bar\", {\n attrs: { percentage: show.stats.tooltip.percentage }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-title\" }, [\n _c(\"div\", { staticClass: \"ellipsis\" }, [\n _vm._v(_vm._s(show.title))\n ]),\n _vm._v(\" \"),\n show.xemNumbering.length > 0\n ? _c(\"div\", { staticClass: \"xem\" }, [\n _c(\"img\", {\n attrs: {\n src: \"images/xem.png\",\n width: \"16\",\n height: \"16\"\n }\n })\n ])\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-date\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.dateOrStatus(show)) +\n \"\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.fontSize !== null,\n expression: \"fontSize !== null\"\n }\n ],\n staticClass: \"show-details\"\n },\n [\n _c(\n \"table\",\n {\n staticClass: \"show-details\",\n class: {\n fanartOpacity:\n _vm.stateLayout.fanartBackground\n },\n attrs: {\n width: \"100%\",\n cellspacing: \"1\",\n border: \"0\",\n cellpadding: \"0\"\n }\n },\n [\n _c(\"tr\", [\n _c(\"td\", { staticClass: \"show-table\" }, [\n _c(\n \"span\",\n {\n staticClass: \"show-dlstats\",\n style: { fontSize: _vm.fontSize },\n attrs: {\n title:\n \"Downloaded: \" +\n show.stats.episodes.downloaded +\n (!show.stats.episodes.snatched\n ? \"\"\n : \"; Snatched:\" +\n show.stats.episodes.snatched) +\n \"; Total: \" +\n show.stats.episodes.total\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n \"\" +\n show.stats.episodes.downloaded +\n (!show.stats.episodes.snatched\n ? \"\"\n : \"+\" +\n show.stats.episodes\n .snatched) +\n \" / \" +\n show.stats.episodes.total\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"show-table\" }, [\n show.network\n ? _c(\n \"span\",\n { attrs: { title: show.network } },\n [\n _c(\"asset\", {\n attrs: {\n default:\n \"images/network/nonetwork.png\",\n \"show-slug\": show.id.slug,\n lazy: false,\n type: \"network\",\n cls: \"show-network-image\",\n link: false,\n alt: show.network,\n title: show.network,\n imgWidth: _vm.logoWidth\n }\n })\n ],\n 1\n )\n : _c(\n \"span\",\n { attrs: { title: \"No Network\" } },\n [\n _c(\"img\", {\n staticClass: \"show-network-image\",\n attrs: {\n src:\n \"images/network/nonetwork.png\",\n alt: \"No Network\",\n title: \"No Network\"\n }\n })\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"td\",\n { staticClass: \"show-table\" },\n [\n _c(\"quality-pill\", {\n attrs: {\n allowed:\n show.config.qualities.allowed,\n preferred:\n show.config.qualities.preferred,\n override: {\n class: \"show-quality\",\n style: \"test\"\n },\n \"show-title\": \"\"\n }\n })\n ],\n 1\n )\n ])\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n ]\n )\n }),\n 0\n )\n ],\n 1\n )\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-list/poster.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"row\", attrs: { name: \"poster-container-row\" } },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { name: \"poster-container-col\" } },\n [\n _c(\n \"isotope\",\n {\n directives: [\n {\n name: \"images-loaded\",\n rawName: \"v-images-loaded:on.always\",\n value: _vm.updateLayout,\n expression: \"updateLayout\",\n arg: \"on\",\n modifiers: { always: true }\n }\n ],\n ref: \"isotope-\" + _vm.listTitle,\n attrs: {\n list: _vm.sortedShows,\n id: \"isotope-container-\" + _vm.listTitle,\n \"item-selector\": \"show-container\",\n options: _vm.option\n }\n },\n _vm._l(_vm.sortedShows, function(show) {\n return _c(\n \"div\",\n {\n key: show.id.slug,\n style: _vm.showContainerStyle,\n attrs: {\n id: show.id.slug,\n \"data-name\": show.title,\n \"data-date\": show.airDate,\n \"data-network\": show.network,\n \"data-indexer\": show.indexer\n }\n },\n [\n _c(\"div\", { staticClass: \"overlay-container\" }, [\n _c(\"div\", { staticClass: \"background-image\" }, [\n _c(\"img\", {\n attrs: { src: \"images/poster-back-dark.png\" }\n })\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"poster-overlay\" },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n show.indexer +\n \"&seriesid=\" +\n show.id[show.indexer]\n }\n },\n [\n _c(\"asset\", {\n attrs: {\n \"default-src\": \"images/poster.png\",\n \"show-slug\": show.id.slug,\n lazy: \"\",\n type: \"posterThumb\",\n cls: \"show-image\",\n link: false\n }\n })\n ],\n 1\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-poster-footer row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\" },\n [\n _c(\"progress-bar\", {\n attrs: { percentage: show.stats.tooltip.percentage }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-title\" }, [\n _c(\"div\", { staticClass: \"ellipsis\" }, [\n _vm._v(_vm._s(show.title))\n ]),\n _vm._v(\" \"),\n show.xemNumbering.length > 0\n ? _c(\"div\", { staticClass: \"xem\" }, [\n _c(\"img\", {\n attrs: {\n src: \"images/xem.png\",\n width: \"16\",\n height: \"16\"\n }\n })\n ])\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-date\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.dateOrStatus(show)) +\n \"\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.fontSize !== null,\n expression: \"fontSize !== null\"\n }\n ],\n staticClass: \"show-details\"\n },\n [\n _c(\n \"table\",\n {\n staticClass: \"show-details\",\n class: {\n fanartOpacity:\n _vm.stateLayout.fanartBackground\n },\n attrs: {\n width: \"100%\",\n cellspacing: \"1\",\n border: \"0\",\n cellpadding: \"0\"\n }\n },\n [\n _c(\"tr\", [\n _c(\"td\", { staticClass: \"show-table\" }, [\n _c(\n \"span\",\n {\n staticClass: \"show-dlstats\",\n style: { fontSize: _vm.fontSize },\n attrs: {\n title:\n \"Downloaded: \" +\n show.stats.episodes.downloaded +\n (!show.stats.episodes.snatched\n ? \"\"\n : \"; Snatched:\" +\n show.stats.episodes.snatched) +\n \"; Total: \" +\n show.stats.episodes.total\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n \"\" +\n show.stats.episodes.downloaded +\n (!show.stats.episodes.snatched\n ? \"\"\n : \"+\" +\n show.stats.episodes\n .snatched) +\n \" / \" +\n show.stats.episodes.total\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"show-table\" }, [\n show.network\n ? _c(\n \"span\",\n { attrs: { title: show.network } },\n [\n _c(\"asset\", {\n attrs: {\n \"default-src\":\n \"images/network/nonetwork.png\",\n \"show-slug\": show.id.slug,\n type: \"network\",\n cls: \"show-network-image\",\n link: false,\n alt: show.network,\n title: show.network,\n imgWidth: _vm.logoWidth\n }\n })\n ],\n 1\n )\n : _c(\n \"span\",\n { attrs: { title: \"No Network\" } },\n [\n _c(\"img\", {\n staticClass: \"show-network-image\",\n attrs: {\n src:\n \"images/network/nonetwork.png\",\n alt: \"No Network\",\n title: \"No Network\"\n }\n })\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"td\",\n { staticClass: \"show-table\" },\n [\n _c(\"quality-pill\", {\n attrs: {\n allowed:\n show.config.qualities.allowed,\n preferred:\n show.config.qualities.preferred,\n override: {\n class: \"show-quality\",\n style: \"test\"\n },\n \"show-title\": \"\"\n }\n })\n ],\n 1\n )\n ])\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n ]\n )\n }),\n 0\n )\n ],\n 1\n )\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-list/poster.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1502,7 +1584,31 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"horizontal-scroll\" },\n [\n _vm.shows.length > 0\n ? _c(\"vue-good-table\", {\n class: { fanartOpacity: _vm.stateLayout.fanartBackground },\n attrs: {\n columns: _vm.columns,\n rows: _vm.shows,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"title\", type: \"asc\" }\n },\n \"column-filter-options\": {\n enabled: true\n }\n },\n on: { \"on-sort-change\": _vm.saveSorting },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label == \"Next Ep\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.nextAirDate\n ? _vm.fuzzyParseDateTime(\n props.row.nextAirDate\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Prev Ep\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.prevAirDate\n ? _vm.fuzzyParseDateTime(\n props.row.prevAirDate\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Show\"\n ? _c(\"span\", { staticClass: \"tvShow\" }, [\n _c(\n \"div\",\n { staticClass: \"imgsmallposter small\" },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n props.row.indexer +\n \"&seriesid=\" +\n props.row.id[props.row.indexer],\n title: props.row.title\n }\n },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/poster.png\",\n \"show-slug\": props.row.id.slug,\n type: \"posterThumb\",\n cls: \"small\",\n alt: props.row.title,\n title: props.row.title,\n link: false\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticStyle: { \"vertical-align\": \"middle\" },\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n props.row.indexer +\n \"&seriesid=\" +\n props.row.id[props.row.indexer]\n }\n },\n [_vm._v(_vm._s(props.row.title))]\n )\n ],\n 1\n )\n ])\n : props.column.label == \"Network\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.network\n ? [\n _c(\n \"span\",\n {\n staticClass: \"hidden-print\",\n attrs: { title: props.row.network }\n },\n [\n _c(\"asset\", {\n attrs: {\n default:\n \"images/network/nonetwork.png\",\n \"show-slug\":\n props.row.indexer +\n props.row.id[props.row.indexer],\n type: \"network\",\n cls: \"show-network-image\",\n link: false,\n width: \"54\",\n height: \"27\",\n alt: props.row.network,\n title: props.row.network\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"span\",\n { staticClass: \"visible-print-inline\" },\n [_vm._v(_vm._s(props.row.network))]\n )\n ]\n : [\n _c(\n \"span\",\n {\n staticClass: \"hidden-print\",\n attrs: { title: \"No Network\" }\n },\n [\n _c(\"img\", {\n attrs: {\n id: \"network\",\n width: \"54\",\n height: \"27\",\n src: \"images/network/nonetwork.png\",\n alt: \"No Network\",\n title: \"No Network\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"span\",\n { staticClass: \"visible-print-inline\" },\n [_vm._v(\"No Network\")]\n )\n ]\n ],\n 2\n )\n : props.column.label == \"Indexer\"\n ? _c(\n \"span\",\n { staticClass: \"align-center indexer-image\" },\n [\n props.row.id.imdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://www.imdb.com/title/\" +\n props.row.id.imdb,\n title:\n \"http://www.imdb.com/title/\" +\n props.row.id.imdb\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n props.row.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n props.row.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n props.row.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[props.row.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl(props.row),\n title: _vm.showIndexerUrl(props.row)\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[props.row.indexer]\n .name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[props.row.indexer]\n .icon\n }\n })\n ]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n _c(\"quality-pill\", {\n attrs: {\n allowed: props.row.config.qualities.allowed,\n preferred:\n props.row.config.qualities.preferred,\n \"show-title\": \"\"\n }\n })\n ],\n 1\n )\n : props.column.label == \"Downloads\"\n ? _c(\n \"span\",\n [\n _c(\n \"progress-bar\",\n _vm._b(\n {},\n \"progress-bar\",\n props.row.stats.tooltip,\n false\n )\n )\n ],\n 1\n )\n : props.column.label == \"Size\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.prettyBytes(props.row.stats.episodes.size)\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Active\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.config &&\n !props.row.config.paused &&\n props.row.status === \"Continuing\"\n ? \"yes\"\n : \"no\") +\n \"16.png\",\n alt:\n props.row.config &&\n !props.row.config.paused &&\n props.row.status === \"Continuing\"\n ? \"yes\"\n : \"no\",\n width: \"16\",\n height: \"16\"\n }\n })\n ])\n : props.column.label === \"Xem\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.xemNumbering &&\n props.row.xemNumbering.length !== 0\n ? \"yes\"\n : \"no\") +\n \"16.png\",\n alt:\n props.row.xemNumbering &&\n props.row.xemNumbering.length !== 0\n ? \"yes\"\n : \"no\",\n width: \"16\",\n height: \"16\"\n }\n })\n ])\n : _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 765815785\n )\n })\n : _vm._e()\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-list/smallposter.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"horizontal-scroll\" },\n [\n _vm.shows.length > 0\n ? _c(\"vue-good-table\", {\n class: { fanartOpacity: _vm.stateLayout.fanartBackground },\n attrs: {\n columns: _vm.columns,\n rows: _vm.shows,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: _vm.getSortBy()\n },\n \"column-filter-options\": {\n enabled: true\n }\n },\n on: { \"on-sort-change\": _vm.saveSorting },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label == \"Next Ep\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.nextAirDate\n ? _vm.fuzzyParseDateTime(\n props.row.nextAirDate\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Prev Ep\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.prevAirDate\n ? _vm.fuzzyParseDateTime(\n props.row.prevAirDate\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Show\"\n ? _c(\"span\", { staticClass: \"tvShow\" }, [\n _c(\n \"div\",\n { staticClass: \"imgsmallposter small\" },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n props.row.indexer +\n \"&seriesid=\" +\n props.row.id[props.row.indexer],\n title: props.row.title\n }\n },\n [\n _c(\"asset\", {\n attrs: {\n \"default-src\": \"images/poster.png\",\n \"show-slug\": props.row.id.slug,\n type: \"posterThumb\",\n cls: \"small\",\n alt: props.row.title,\n title: props.row.title,\n link: false\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticStyle: { \"vertical-align\": \"middle\" },\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n props.row.indexer +\n \"&seriesid=\" +\n props.row.id[props.row.indexer]\n }\n },\n [_vm._v(_vm._s(props.row.title))]\n )\n ],\n 1\n )\n ])\n : props.column.label == \"Network\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.network\n ? [\n _c(\n \"span\",\n {\n staticClass: \"hidden-print\",\n attrs: { title: props.row.network }\n },\n [\n _c(\"asset\", {\n attrs: {\n \"default-src\":\n \"images/network/nonetwork.png\",\n \"show-slug\":\n props.row.indexer +\n props.row.id[props.row.indexer],\n type: \"network\",\n cls: \"show-network-image\",\n link: false,\n width: \"54\",\n height: \"27\",\n alt: props.row.network,\n title: props.row.network\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"span\",\n { staticClass: \"visible-print-inline\" },\n [_vm._v(_vm._s(props.row.network))]\n )\n ]\n : [\n _c(\n \"span\",\n {\n staticClass: \"hidden-print\",\n attrs: { title: \"No Network\" }\n },\n [\n _c(\"img\", {\n attrs: {\n id: \"network\",\n width: \"54\",\n height: \"27\",\n src: \"images/network/nonetwork.png\",\n alt: \"No Network\",\n title: \"No Network\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"span\",\n { staticClass: \"visible-print-inline\" },\n [_vm._v(\"No Network\")]\n )\n ]\n ],\n 2\n )\n : props.column.label == \"Indexer\"\n ? _c(\n \"span\",\n { staticClass: \"align-center indexer-image\" },\n [\n props.row.id.imdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://www.imdb.com/title/\" +\n props.row.id.imdb,\n title:\n \"http://www.imdb.com/title/\" +\n props.row.id.imdb\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n props.row.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n props.row.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n props.row.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[props.row.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl(props.row),\n title: _vm.showIndexerUrl(props.row)\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[props.row.indexer]\n .name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[props.row.indexer]\n .icon\n }\n })\n ]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n _c(\"quality-pill\", {\n attrs: {\n allowed: props.row.config.qualities.allowed,\n preferred:\n props.row.config.qualities.preferred,\n \"show-title\": \"\"\n }\n })\n ],\n 1\n )\n : props.column.label == \"Downloads\"\n ? _c(\n \"span\",\n [\n _c(\n \"progress-bar\",\n _vm._b(\n {},\n \"progress-bar\",\n props.row.stats.tooltip,\n false\n )\n )\n ],\n 1\n )\n : props.column.label == \"Size\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.prettyBytes(props.row.stats.episodes.size)\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Active\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.config &&\n !props.row.config.paused &&\n props.row.status === \"Continuing\"\n ? \"yes\"\n : \"no\") +\n \"16.png\",\n alt:\n props.row.config &&\n !props.row.config.paused &&\n props.row.status === \"Continuing\"\n ? \"yes\"\n : \"no\",\n width: \"16\",\n height: \"16\"\n }\n })\n ])\n : props.column.label === \"Xem\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.xemNumbering &&\n props.row.xemNumbering.length !== 0\n ? \"yes\"\n : \"no\") +\n \"16.png\",\n alt:\n props.row.xemNumbering &&\n props.row.xemNumbering.length !== 0\n ? \"yes\"\n : \"no\",\n width: \"16\",\n height: \"16\"\n }\n })\n ])\n : _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 1329773065\n )\n })\n : _vm._e()\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-list/smallposter.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./src/components/show-results.vue?vue&type=template&id=68e9fa36&scoped=true&": +/*!******************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/show-results.vue?vue&type=template&id=68e9fa36&scoped=true& ***! + \******************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-results-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15\" },\n [\n _c(\n \"div\",\n { staticClass: \"button-row\" },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Refresh Results\" },\n on: { click: _vm.getProviderResults }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Force Search\" },\n on: { click: _vm.forceSearch }\n }),\n _vm._v(\" \"),\n _vm.loading\n ? [\n _c(\"state-switch\", { attrs: { state: \"loading\" } }),\n _vm._v(\" \"),\n _c(\"span\", [_vm._v(_vm._s(_vm.loadingMessage))])\n ]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show.id.slug,\n expression: \"show.id.slug\"\n }\n ],\n ref: \"vgt-show-results\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.combinedResults,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: _vm.getSortBy(\"quality\", \"desc\")\n },\n \"column-filter-options\": {\n enabled: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n styleClass: \"vgt-table condensed\"\n },\n on: { \"on-sort-change\": _vm.saveSorting },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.imageName,\n alt: props.row.provider.name,\n width: \"16\",\n title: props.row.provider.name,\n onError:\n \"this.onerror=null;this.src='images/providers/missing.png';\"\n }\n })\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Seeds\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.seeders !== -1\n ? props.row.seeders\n : \"-\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Peers\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.leechers !== -1\n ? props.row.leechers\n : \"-\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Added\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.dateAdded\n ? _vm.fuzzyParseDateTime(\n props.row.dateAdded\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Published\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.pubdate\n ? _vm.fuzzyParseDateTime(props.row.pubdate)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Updated\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.time\n ? _vm.fuzzyParseDateTime(props.row.time)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Snatch\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src: \"images/download.png\",\n width: \"16\",\n height: \"16\",\n alt: \"snatch\",\n title: \"Download selected episode\",\n \"data-identifier\": props.row.identifier\n },\n on: {\n click: function($event) {\n return _vm.snatchResult($event, props.row)\n }\n }\n })\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./src/components/snatch-selection.vue?vue&type=template&id=0ad4c7fc&scoped=true&": +/*!**********************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/snatch-selection.vue?vue&type=template&id=0ad4c7fc&scoped=true& ***! + \**********************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"snatch-selection-template\",\n attrs: { id: \"snatch-selection-template\" }\n },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _vm.show.id.slug\n ? _c(\"backstretch\", { attrs: { slug: _vm.show.id.slug } })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"show-header\", {\n ref: \"show-header\",\n attrs: {\n type: \"snatch-selection\",\n \"show-id\": _vm.id,\n \"show-indexer\": _vm.indexer,\n \"manual-search-type\": _vm.manualSearchType\n },\n on: {\n \"update-overview-status\": function($event) {\n _vm.filterByOverviewStatus = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"show-history\",\n _vm._b(\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show && _vm.season,\n expression: \"show && season\"\n }\n ],\n key:\n \"history-\" +\n _vm.show.id.slug +\n \"-\" +\n _vm.season +\n \"-\" +\n (_vm.episode || \"\"),\n staticClass: \"show-history\"\n },\n \"show-history\",\n { show: _vm.show, season: _vm.season, episode: _vm.episode },\n false\n )\n ),\n _vm._v(\" \"),\n _c(\n \"show-results\",\n _vm._b(\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show && _vm.season,\n expression: \"show && season\"\n }\n ],\n key:\n \"results-\" +\n _vm.show.id.slug +\n \"-\" +\n _vm.season +\n \"-\" +\n (_vm.episode || \"\"),\n staticClass: \"table-layout\"\n },\n \"show-results\",\n { show: _vm.show, season: _vm.season, episode: _vm.episode },\n false\n )\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1526,7 +1632,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"tr\", { staticClass: \"subtitle-search-wrapper\" }, [\n _c(\"td\", { attrs: { colspan: \"9999\" } }, [\n _vm.loading\n ? _c(\n \"span\",\n { staticClass: \"loading-message\" },\n [\n _vm._v(_vm._s(_vm.loadingMessage) + \" \"),\n _c(\"state-switch\", {\n attrs: { theme: _vm.config.themeName, state: \"loading\" }\n })\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.displayQuestion\n ? _c(\"div\", { staticClass: \"search-question\" }, [\n _c(\"div\", { staticClass: \"question\" }, [\n !_vm.lang\n ? _c(\"p\", [\n _vm._v(\n \"Do you want to manually pick subtitles or let us choose it for you?\"\n )\n ])\n : _c(\"p\", [\n _vm._v(\n \"Do you want to manually pick subtitles or search a subtitle with the language code \"\n ),\n _c(\"b\", [_vm._v(_vm._s(_vm.lang))]),\n _vm._v(\" for you?\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"options\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-info\",\n attrs: { type: \"button\" },\n on: { click: _vm.autoSearch }\n },\n [_vm._v(\"Auto\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\" },\n on: { click: _vm.manualSearch }\n },\n [_vm._v(\"Manual\")]\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.subtitles.length > 0\n ? _c(\n \"div\",\n { staticClass: \"subtitle-results\" },\n [\n _c(\"span\", { staticClass: \"release-name\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.releaseName) +\n \"\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n attrs: {\n columns: _vm.columns,\n rows: _vm.subtitles,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"score\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed subtitle-table\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label === \"Download\"\n ? _c(\"span\", [\n _c(\"span\", [\n _vm._v(_vm._s(props.column.label))\n ]),\n _vm._v(\" \"),\n _c(\n \"span\",\n {\n staticClass: \"btn-medusa btn-xs pull-right\",\n on: { click: _vm.close }\n },\n [_vm._v(\"hide\")]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field === \"provider\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/\" +\n props.row.provider +\n \".png\",\n width: \"16\",\n height: \"16\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"span\",\n { attrs: { title: props.row.provider } },\n [_vm._v(_vm._s(props.row.provider))]\n )\n ])\n : props.column.field === \"lang\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n title: props.row.lang,\n src:\n \"images/subtitles/flags/\" +\n props.row.lang +\n \".png\",\n width: \"16\",\n height: \"11\"\n }\n })\n ])\n : props.column.field === \"filename\"\n ? _c(\"span\", [\n _c(\n \"a\",\n {\n attrs: {\n title:\n \"Download\" +\n (props.row.hearing_impaired\n ? \" hearing impaired \"\n : \" \") +\n \"subtitle: \" +\n props.row.filename\n },\n on: {\n click: function($event) {\n return _vm.pickSubtitle(props.row.id)\n }\n }\n },\n [\n props.row.hearing_impaired\n ? _c(\"img\", {\n attrs: {\n src: \"images/hearing_impaired.png\",\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"span\",\n { staticClass: \"subtitle-name\" },\n [_vm._v(_vm._s(props.row.filename))]\n ),\n _vm._v(\" \"),\n props.row.sub_score >= props.row.min_score\n ? _c(\"img\", {\n attrs: {\n src: \"images/save.png\",\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e()\n ]\n )\n ])\n : props.column.field === \"download\"\n ? _c(\"span\", [\n _c(\n \"a\",\n {\n attrs: {\n title:\n \"Download\" +\n (props.row.hearing_impaired\n ? \" hearing impaired \"\n : \" \") +\n \"subtitle: \" +\n props.row.filename\n },\n on: {\n click: function($event) {\n return _vm.pickSubtitle(props.row.id)\n }\n }\n },\n [\n _c(\"img\", {\n attrs: {\n src: \"images/download.png\",\n width: \"16\",\n height: \"16\"\n }\n })\n ]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 3665434881\n )\n })\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/subtitle-search.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"tr\", { staticClass: \"subtitle-search-wrapper\" }, [\n _c(\"td\", { attrs: { colspan: \"9999\" } }, [\n _vm.loading\n ? _c(\n \"span\",\n { staticClass: \"loading-message\" },\n [\n _vm._v(_vm._s(_vm.loadingMessage) + \" \"),\n _c(\"state-switch\", {\n attrs: { theme: _vm.general.themeName, state: \"loading\" }\n })\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.displayQuestion\n ? _c(\"div\", { staticClass: \"search-question\" }, [\n _c(\"div\", { staticClass: \"question\" }, [\n !_vm.lang\n ? _c(\"p\", [\n _vm._v(\n \"Do you want to manually pick subtitles or let us choose it for you?\"\n )\n ])\n : _c(\"p\", [\n _vm._v(\n \"Do you want to manually pick subtitles or search a subtitle with the language code \"\n ),\n _c(\"b\", [_vm._v(_vm._s(_vm.lang))]),\n _vm._v(\" for you?\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"options\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-info\",\n attrs: { type: \"button\" },\n on: { click: _vm.autoSearch }\n },\n [_vm._v(\"Auto\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\" },\n on: { click: _vm.manualSearch }\n },\n [_vm._v(\"Manual\")]\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n !_vm.displayQuestion && _vm.searchType == \"manual\"\n ? _c(\n \"div\",\n { staticClass: \"subtitle-results\" },\n [\n _c(\"span\", { staticClass: \"release-name\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.releaseName) +\n \"\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n attrs: {\n columns: _vm.columns,\n rows: _vm.subtitles,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"score\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed subtitle-table\"\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label === \"Download\"\n ? _c(\"span\", [\n _c(\"span\", [\n _vm._v(_vm._s(props.column.label))\n ]),\n _vm._v(\" \"),\n _c(\n \"span\",\n {\n staticClass: \"btn-medusa btn-xs pull-right\",\n on: { click: _vm.close }\n },\n [_vm._v(\"hide\")]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field === \"provider\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/\" +\n props.row.provider +\n \".png\",\n width: \"16\",\n height: \"16\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"span\",\n { attrs: { title: props.row.provider } },\n [_vm._v(_vm._s(props.row.provider))]\n )\n ])\n : props.column.field === \"lang\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n title: props.row.lang,\n src:\n \"images/subtitles/flags/\" +\n props.row.lang +\n \".png\",\n width: \"16\",\n height: \"11\"\n }\n })\n ])\n : props.column.field === \"filename\"\n ? _c(\"span\", [\n _c(\n \"a\",\n {\n attrs: {\n title:\n \"Download\" +\n (props.row.hearing_impaired\n ? \" hearing impaired \"\n : \" \") +\n \"subtitle: \" +\n props.row.filename\n },\n on: {\n click: function($event) {\n return _vm.pickSubtitle(props.row.id)\n }\n }\n },\n [\n props.row.hearing_impaired\n ? _c(\"img\", {\n attrs: {\n src: \"images/hearing_impaired.png\",\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"span\",\n { staticClass: \"subtitle-name\" },\n [_vm._v(_vm._s(props.row.filename))]\n ),\n _vm._v(\" \"),\n props.row.sub_score >= props.row.min_score\n ? _c(\"img\", {\n attrs: {\n src: \"images/save.png\",\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e()\n ]\n )\n ])\n : props.column.field === \"download\"\n ? _c(\"span\", [\n _c(\n \"a\",\n {\n attrs: {\n title:\n \"Download\" +\n (props.row.hearing_impaired\n ? \" hearing impaired \"\n : \" \") +\n \"subtitle: \" +\n props.row.filename\n },\n on: {\n click: function($event) {\n return _vm.pickSubtitle(props.row.id)\n }\n }\n },\n [\n _c(\"img\", {\n attrs: {\n src: \"images/download.png\",\n width: \"16\",\n height: \"16\"\n }\n })\n ]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 3665434881\n )\n })\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/subtitle-search.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1662,6 +1768,17 @@ eval("// style-loader: Adds some css to the DOM by adding a