diff --git a/CHANGELOG.md b/CHANGELOG.md
index 82a97887fd..71a361ce9d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
#### New Features
#### Improvements
+- Converted the footer to a Vue component ([#4520](https://github.com/pymedusa/Medusa/pull/4520))
#### Fixes
diff --git a/medusa/server/web/core/base.py b/medusa/server/web/core/base.py
index 8c48c049b2..b8afd74816 100644
--- a/medusa/server/web/core/base.py
+++ b/medusa/server/web/core/base.py
@@ -5,9 +5,7 @@
import os
import re
import sys
-import time
import traceback
-from builtins import str
from concurrent.futures import ThreadPoolExecutor
from mako.exceptions import RichTraceback
@@ -28,6 +26,7 @@
from six import (
iteritems,
+ text_type,
viewitems,
)
@@ -75,8 +74,8 @@ def __init__(self, rh, filename):
lookup = get_lookup()
self.template = lookup.get_template(filename)
- base_url = (rh.request.headers.get('X-Forwarded-Proto', rh.request.protocol) + '://' +
- rh.request.headers.get('X-Forwarded-Host', rh.request.host))
+ base_url = (rh.request.headers.get('X-Forwarded-Proto', rh.request.protocol) + '://'
+ + rh.request.headers.get('X-Forwarded-Host', rh.request.host))
self.arguments = {
'sbHttpPort': app.WEB_PORT,
@@ -85,8 +84,7 @@ def __init__(self, rh, filename):
'sbHandleReverseProxy': app.HANDLE_REVERSE_PROXY,
'sbDefaultPage': app.DEFAULT_PAGE,
'loggedIn': rh.get_current_user(),
- 'sbStartTime': rh.startTime,
- 'sbPID': str(app.PID),
+ 'sbPID': text_type(app.PID),
'title': 'FixME',
'header': 'FixME',
'controller': 'FixME',
@@ -114,7 +112,6 @@ def render(self, *args, **kwargs):
if key not in kwargs:
kwargs[key] = self.arguments[key]
- kwargs['makoStartTime'] = time.time()
try:
return self.template.render_unicode(*args, **kwargs)
except Exception:
@@ -130,15 +127,8 @@ def render(self, *args, **kwargs):
class BaseHandler(RequestHandler):
"""Base Handler for the server."""
- startTime = 0.
-
- def __init__(self, *args, **kwargs):
- self.startTime = time.time()
-
- super(BaseHandler, self).__init__(*args, **kwargs)
-
def write_error(self, status_code, **kwargs):
- """Base error Handler for 404's."""
+ """Error handler for 404's."""
# handle 404 http errors
if status_code == 404:
url = self.request.uri
diff --git a/setup.cfg b/setup.cfg
index e069eb6c22..61cc30c0c1 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -7,7 +7,10 @@ multiline-quotes = double
docstring-quotes = double
; flake8
max-line-length = 160
-; If per-file ignores are needed, use: https://github.com/snoack/flake8-per-file-ignores
+per-file-ignores =
+ ; http://flake8.pycqa.org/en/latest/user/options.html#cmdoption-flake8-per-file-ignores
+ ; [Example]
+ ; medusa/server/web/core/base.py:D100,D101,D102,D103,D107
ignore =
; Error codes reference: https://git.io/fNlTP
; Q002: Handled by flake8-docstrings
@@ -131,7 +134,7 @@ flake8-ignore =
medusa/server/web/config/subtitles.py D102 D200 D204 D400 E501 N802
medusa/server/web/core/__init__.py D104 F401
medusa/server/web/core/authentication.py D102 D200 D202 D204 D205 D400
- medusa/server/web/core/base.py D100 D101 D102 D103 D200 D204 D210 D400 D401 N802 N815
+ medusa/server/web/core/base.py D100 D101 D102 D103 N802
medusa/server/web/core/calendar.py D200 D204 D205 D400 D401
medusa/server/web/core/file_browser.py D100 D101 D102 N803
medusa/server/web/core/history.py D100 D101 D102 N802
diff --git a/setup.py b/setup.py
index c9363a3405..2ff4dc2b47 100644
--- a/setup.py
+++ b/setup.py
@@ -102,7 +102,7 @@ def packages():
},
cmdclass={'test': PyTest},
tests_require=tests_runtime_require + [
- 'flake8>=3.5.0',
+ 'flake8>=3.7.7',
'flake8-docstrings>=1.3.0',
'flake8-import-order>=0.18',
'flake8-quotes>=1.0.0',
diff --git a/themes-default/slim/package.json b/themes-default/slim/package.json
index 78cca1593c..666a66f0c9 100644
--- a/themes-default/slim/package.json
+++ b/themes-default/slim/package.json
@@ -90,6 +90,7 @@
"optimize-css-assets-webpack-plugin": "5.0.1",
"stylelint": "10.1.0",
"stylelint-config-standard": "18.3.0",
+ "timekeeper": "2.2.0",
"vue-jest": "3.0.4",
"vue-loader": "15.7.0",
"webpack": "4.34.0",
diff --git a/themes-default/slim/src/app.js b/themes-default/slim/src/app.js
index d59fbc3272..fcfb24aef3 100644
--- a/themes-default/slim/src/app.js
+++ b/themes-default/slim/src/app.js
@@ -36,7 +36,8 @@ const app = new Vue({
const { $store } = this;
Promise.all([
$store.dispatch('login', { username: window.username }),
- $store.dispatch('getConfig')
+ $store.dispatch('getConfig'),
+ $store.dispatch('getStats')
]).then(([_, config]) => {
if (isDevelopment) {
console.log('App Loaded!');
diff --git a/themes-default/slim/src/components/app-footer.vue b/themes-default/slim/src/components/app-footer.vue
new file mode 100644
index 0000000000..ad2fc27478
--- /dev/null
+++ b/themes-default/slim/src/components/app-footer.vue
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
diff --git a/themes-default/slim/src/components/index.js b/themes-default/slim/src/components/index.js
index d02e0551c8..5e80405703 100644
--- a/themes-default/slim/src/components/index.js
+++ b/themes-default/slim/src/components/index.js
@@ -2,6 +2,7 @@ export { default as AddRecommended } from './add-recommended.vue';
export { default as AddShowOptions } from './add-show-options.vue';
export { default as AddShows } from './add-shows.vue';
export { default as AnidbReleaseGroupUi } from './anidb-release-group-ui.vue';
+export { default as AppFooter } from './app-footer.vue';
export { default as AppHeader } from './app-header.vue';
export { default as Backstretch } from './backstretch.vue';
export { default as Config } from './config.vue';
diff --git a/themes-default/slim/src/global-vue-shim.js b/themes-default/slim/src/global-vue-shim.js
index 4fe4e13cb8..d4de3ea183 100644
--- a/themes-default/slim/src/global-vue-shim.js
+++ b/themes-default/slim/src/global-vue-shim.js
@@ -7,6 +7,7 @@ import Snotify from 'vue-snotify';
import {
AddShowOptions,
AnidbReleaseGroupUi,
+ AppFooter,
AppHeader,
AppLink,
Asset,
@@ -46,6 +47,7 @@ export const registerGlobalComponents = () => {
// @TODO: These should be registered in an `App.vue` component when possible,
// along with some of the `main.mako` template
components = components.concat([
+ AppFooter,
AppHeader,
ScrollButtons,
SubMenu
@@ -119,7 +121,8 @@ export default () => {
/* This is used by the `app-header` component
to only show the logout button if a username is set */
store.dispatch('login', { username }),
- store.dispatch('getConfig')
+ store.dispatch('getConfig'),
+ store.dispatch('getStats')
]).then(([_, config]) => {
this.$emit('loaded');
// Legacy - send config.main to jQuery (received by index.js)
diff --git a/themes-default/slim/src/store/modules/system.js b/themes-default/slim/src/store/modules/system.js
index 8871ac0e88..f14c20d913 100644
--- a/themes-default/slim/src/store/modules/system.js
+++ b/themes-default/slim/src/store/modules/system.js
@@ -1,5 +1,33 @@
import { ADD_CONFIG } from '../mutation-types';
+/**
+ * An object representing a scheduler.
+ *
+ * If a scheduler isn't initialized on the backend,
+ * this object will only have the `key` and `name` properties.
+ * @typedef {object} Scheduler
+ * @property {string} key
+ * A camelCase key representing this scheduler.
+ * @property {string} name
+ * The scheduler's name.
+ * @property {boolean} [isAlive]
+ * Is the scheduler alive?
+ * @property {boolean|string} [isEnabled]
+ * Is the scheduler enabled? For the `backlog` scheduler, the value might be `Paused`.
+ * @property {boolean} [isActive]
+ * Is the scheduler's action currently running?
+ * @property {string|null} [startTime]
+ * The time of day in which this scheduler runs (format: ISO-8601 time), or `null` if not applicable.
+ * @property {number} [cycleTime]
+ * The duration in milliseconds between each run, or `null` if not applicable.
+ * @property {number} [nextRun]
+ * The duration in milliseconds until the next run.
+ * @property {string} [lastRun]
+ * The date and time of the previous run (format: ISO-8601 date-time).
+ * @property {boolean} [isSilent]
+ * Is the scheduler silent?
+ */
+
const state = {
memoryUsage: null,
schedulers: [],
@@ -15,9 +43,15 @@ const mutations = {
};
const getters = {
- // Get a scheduler object using a key
- getScheduler: state => key => {
- return state.schedulers.find(scheduler => key === scheduler.key);
+ getScheduler: state => {
+ /**
+ * Get a scheduler object using a key.
+ *
+ * @param {string} key The combined quality to split.
+ * @returns {Scheduler|object} The scheduler object or an empty object if not found.
+ */
+ const _getScheduler = key => state.schedulers.find(scheduler => key === scheduler.key) || {};
+ return _getScheduler;
}
};
diff --git a/themes-default/slim/test/__fixtures__/common.json b/themes-default/slim/test/__fixtures__/common.json
index 9fd7aee38f..75fc93fd2b 100644
--- a/themes-default/slim/test/__fixtures__/common.json
+++ b/themes-default/slim/test/__fixtures__/common.json
@@ -26,6 +26,8 @@
"dbPath": "C:\\Medusa\\Data\\main.db",
"cacheDir": "C:\\Medusa\\Data\\cache",
"logDir": "C:\\Medusa\\Data\\Logs",
+ "datePreset": "%Y-%m-%d",
+ "timePreset": "%H:%M",
"postProcessing": {
"postponeIfSyncFiles": true,
"showDownloadDir": "C:\\Downloads\\TV",
@@ -430,6 +432,157 @@
}
]
},
+ "system": {
+ "memoryUsage": "56.85 MB",
+ "schedulers": [
+ {
+ "key": "dailySearch",
+ "name": "Daily Search",
+ "isAlive": true,
+ "isEnabled": true,
+ "isActive": false,
+ "startTime": null,
+ "cycleTime": 2400000,
+ "nextRun": 2386016,
+ "lastRun": "2019-06-10T21:00:53.477616",
+ "isSilent": true
+ },
+ {
+ "key": "backlog",
+ "name": "Backlog",
+ "isAlive": true,
+ "isEnabled": true,
+ "isActive": false,
+ "startTime": null,
+ "cycleTime": 43200000,
+ "nextRun": 43186017,
+ "lastRun": "2019-06-10T21:00:53.478603",
+ "isSilent": true
+ },
+ {
+ "key": "showUpdate",
+ "name": "Show Update",
+ "isAlive": true,
+ "isEnabled": true,
+ "isActive": false,
+ "startTime": "03:52:00",
+ "cycleTime": 3600000,
+ "nextRun": 24652538,
+ "lastRun": "2019-06-10T21:00:00",
+ "isSilent": true
+ },
+ {
+ "key": "versionCheck",
+ "name": "Version Check",
+ "isAlive": true,
+ "isEnabled": true,
+ "isActive": false,
+ "startTime": null,
+ "cycleTime": 3600000,
+ "nextRun": 3586035,
+ "lastRun": "2019-06-10T21:00:53.496593",
+ "isSilent": false
+ },
+ {
+ "key": "showQueue",
+ "name": "Show Queue",
+ "isAlive": true,
+ "isEnabled": true,
+ "isActive": false,
+ "startTime": null,
+ "cycleTime": 3000,
+ "nextRun": 1110,
+ "lastRun": "2019-06-10T21:01:05.571404",
+ "isSilent": true
+ },
+ {
+ "key": "searchQueue",
+ "name": "Search Queue",
+ "isAlive": true,
+ "isEnabled": true,
+ "isActive": false,
+ "startTime": null,
+ "cycleTime": 3000,
+ "nextRun": 1110,
+ "lastRun": "2019-06-10T21:01:05.571404",
+ "isSilent": true
+ },
+ {
+ "key": "properFinder",
+ "name": "Proper Finder",
+ "isAlive": true,
+ "isEnabled": true,
+ "isActive": false,
+ "startTime": null,
+ "cycleTime": 14400000,
+ "nextRun": 14386017,
+ "lastRun": "2019-06-10T21:00:53.478603",
+ "isSilent": false
+ },
+ {
+ "key": "postProcess",
+ "name": "Post Process",
+ "isAlive": true,
+ "isEnabled": false,
+ "isActive": false,
+ "startTime": null,
+ "cycleTime": 600000,
+ "nextRun": null,
+ "lastRun": "2019-06-10T21:00:53.478603",
+ "isSilent": true
+ },
+ {
+ "key": "subtitlesFinder",
+ "name": "Subtitles Finder",
+ "isAlive": true,
+ "isEnabled": true,
+ "isActive": false,
+ "startTime": null,
+ "cycleTime": 3600000,
+ "nextRun": 3586017,
+ "lastRun": "2019-06-10T21:00:53.478603",
+ "isSilent": false
+ },
+ {
+ "key": "traktChecker",
+ "name": "Trakt Checker",
+ "isAlive": true,
+ "isEnabled": false,
+ "isActive": false,
+ "startTime": null,
+ "cycleTime": 3600000,
+ "nextRun": null,
+ "lastRun": "2019-06-10T20:05:53.478603",
+ "isSilent": true
+ },
+ {
+ "key": "torrentChecker",
+ "name": "Torrent Checker",
+ "isAlive": true,
+ "isEnabled": false,
+ "isActive": false,
+ "startTime": null,
+ "cycleTime": 3600000,
+ "nextRun": null,
+ "lastRun": "2019-06-10T21:00:53.478603",
+ "isSilent": false
+ }
+ ],
+ "showQueue": []
+ },
+ "stats": {
+ "overall": {
+ "episodes": {
+ "downloaded": 100,
+ "snatched": 5,
+ "total": 150
+ },
+ "shows": {
+ "active": 2,
+ "total": 2
+ }
+ }
+ },
"metadata": {
"metadataProviders": {
"kodi_12plus": {
diff --git a/themes-default/slim/test/specs/__snapshots__/app-footer.spec.js.snap b/themes-default/slim/test/specs/__snapshots__/app-footer.spec.js.snap
new file mode 100644
index 0000000000..614450358d
--- /dev/null
+++ b/themes-default/slim/test/specs/__snapshots__/app-footer.spec.js.snap
@@ -0,0 +1,94 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AppFooter renders 1`] = `
+
+`;
diff --git a/themes-default/slim/test/specs/app-footer.spec.js b/themes-default/slim/test/specs/app-footer.spec.js
new file mode 100644
index 0000000000..9f4db93581
--- /dev/null
+++ b/themes-default/slim/test/specs/app-footer.spec.js
@@ -0,0 +1,42 @@
+import Vuex, { Store } from 'vuex';
+import VueRouter from 'vue-router';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import tk from 'timekeeper';
+
+import { AppFooter } from '../../src/components';
+import constsModule from '../../src/store/modules/consts';
+import systemModule from '../../src/store/modules/system';
+import fixtures from '../__fixtures__/common';
+
+describe('AppFooter', () => {
+ let localVue;
+ let store;
+
+ beforeEach(() => {
+ localVue = createLocalVue();
+ localVue.use(Vuex);
+ localVue.use(VueRouter);
+
+ const { state } = fixtures;
+ store = new Store({
+ modules: {
+ consts: constsModule,
+ system: systemModule
+ }
+ });
+ store.replaceState(state);
+ });
+
+ it('renders', () => {
+ tk.travel(new Date(2019, 6, 10, 9, 51, 21, 300));
+
+ const wrapper = shallowMount(AppFooter, {
+ localVue,
+ store
+ });
+
+ expect(wrapper.element).toMatchSnapshot();
+
+ tk.reset();
+ });
+});
diff --git a/themes-default/slim/views/layouts/main.mako b/themes-default/slim/views/layouts/main.mako
index 6a1cf39e75..1f12b9526b 100644
--- a/themes-default/slim/views/layouts/main.mako
+++ b/themes-default/slim/views/layouts/main.mako
@@ -72,7 +72,7 @@
<%block name="content" />
- <%include file="/partials/footer.mako" />
+
diff --git a/themes-default/slim/views/partials/footer.mako b/themes-default/slim/views/partials/footer.mako
deleted file mode 100644
index 697e1356bd..0000000000
--- a/themes-default/slim/views/partials/footer.mako
+++ /dev/null
@@ -1,59 +0,0 @@
-<%!
- from datetime import datetime
- from time import time
- from contextlib2 import suppress
- import os
- import re
- from medusa import app
- from medusa.helper.common import pretty_file_size
- from medusa.sbdatetime import sbdatetime
- from medusa.show.show import Show
-
- mem_usage = None
- with suppress(ImportError):
- from psutil import Process
- from os import getpid
- mem_usage = 'psutil'
-
- with suppress(ImportError):
- if not mem_usage:
- import resource # resource module is unix only
- mem_usage = 'resource'
-%>
-
-% if loggedIn:
- <%
- stats = Show.overall_stats()
- ep_downloaded = stats['episodes']['downloaded']
- ep_snatched = stats['episodes']['snatched']
- ep_total = stats['episodes']['total']
- ep_percentage = '' if ep_total == 0 else '()' % re.sub(r'(\d+)(\.\d)\d+', r'\1\2', str((float(ep_downloaded)/float(ep_total))*100))
- %>
-
-% endif
-
diff --git a/themes-default/slim/yarn.lock b/themes-default/slim/yarn.lock
index 32f4d5a9c1..788a93bb33 100644
--- a/themes-default/slim/yarn.lock
+++ b/themes-default/slim/yarn.lock
@@ -11826,6 +11826,11 @@ timed-out@^4.0.0, timed-out@^4.0.1:
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
+timekeeper@2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/timekeeper/-/timekeeper-2.2.0.tgz#9645731fce9e3280a18614a57a9d1b72af3ca368"
+ integrity sha512-W3AmPTJWZkRwu+iSNxPIsLZ2ByADsOLbbLxe46UJyWj3mlYLlwucKiq+/dPm0l9wTzqoF3/2PH0AGFCebjq23A==
+
timers-browserify@^2.0.4:
version "2.0.10"
resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
diff --git a/themes/dark/assets/js/app.js b/themes/dark/assets/js/app.js
index 5f1c5c4e54..595822d355 100644
--- a/themes/dark/assets/js/app.js
+++ b/themes/dark/assets/js/app.js
@@ -8,7 +8,7 @@
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vue_async_computed__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-async-computed */ \"./node_modules/vue-async-computed/dist/vue-async-computed.esm.js\");\n/* harmony import */ var vue_snotify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-snotify */ \"./node_modules/vue-snotify/vue-snotify.esm.js\");\n/* harmony import */ var _global_vue_shim__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./global-vue-shim */ \"./src/global-vue-shim.js\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./router */ \"./src/router/index.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/core */ \"./src/utils/core.js\");\n\n\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].config.devtools = true;\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].config.performance = true; // Register plugins\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_async_computed__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_snotify__WEBPACK_IMPORTED_MODULE_2__[\"default\"]); // @TODO: Remove this before v1.0.0\n\nObject(_global_vue_shim__WEBPACK_IMPORTED_MODULE_3__[\"registerGlobalComponents\"])();\nconst app = new vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n name: 'App',\n router: _router__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n store: _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n\n data() {\n return {\n globalLoading: false,\n pageComponent: false\n };\n },\n\n mounted() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.log('App Mounted!');\n }\n\n if (!window.location.pathname.includes('/login')) {\n const {\n $store\n } = this;\n Promise.all([$store.dispatch('login', {\n username: window.username\n }), $store.dispatch('getConfig')]).then(([_, config]) => {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.log('App Loaded!');\n } // Legacy - send config.main to jQuery (received by index.js)\n\n\n const event = new CustomEvent('medusa-config-loaded', {\n detail: config.main\n });\n window.dispatchEvent(event);\n }).catch(error => {\n console.debug(error);\n alert('Unable to connect to Medusa!'); // eslint-disable-line no-alert\n });\n }\n }\n\n}).$mount('#vue-wrap');\n/* harmony default export */ __webpack_exports__[\"default\"] = (app);\n\n//# sourceURL=webpack:///./src/app.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vue_async_computed__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-async-computed */ \"./node_modules/vue-async-computed/dist/vue-async-computed.esm.js\");\n/* harmony import */ var vue_snotify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-snotify */ \"./node_modules/vue-snotify/vue-snotify.esm.js\");\n/* harmony import */ var _global_vue_shim__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./global-vue-shim */ \"./src/global-vue-shim.js\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./router */ \"./src/router/index.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/core */ \"./src/utils/core.js\");\n\n\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].config.devtools = true;\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].config.performance = true; // Register plugins\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_async_computed__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_snotify__WEBPACK_IMPORTED_MODULE_2__[\"default\"]); // @TODO: Remove this before v1.0.0\n\nObject(_global_vue_shim__WEBPACK_IMPORTED_MODULE_3__[\"registerGlobalComponents\"])();\nconst app = new vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n name: 'App',\n router: _router__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n store: _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n\n data() {\n return {\n globalLoading: false,\n pageComponent: false\n };\n },\n\n mounted() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.log('App Mounted!');\n }\n\n if (!window.location.pathname.includes('/login')) {\n const {\n $store\n } = this;\n Promise.all([$store.dispatch('login', {\n username: window.username\n }), $store.dispatch('getConfig'), $store.dispatch('getStats')]).then(([_, config]) => {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.log('App Loaded!');\n } // Legacy - send config.main to jQuery (received by index.js)\n\n\n const event = new CustomEvent('medusa-config-loaded', {\n detail: config.main\n });\n window.dispatchEvent(event);\n }).catch(error => {\n console.debug(error);\n alert('Unable to connect to Medusa!'); // eslint-disable-line no-alert\n });\n }\n }\n\n}).$mount('#vue-wrap');\n/* harmony default export */ __webpack_exports__[\"default\"] = (app);\n\n//# sourceURL=webpack:///./src/app.js?");
/***/ })
diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js
index 7f34f6e58c..cb08a557a9 100644
--- a/themes/dark/assets/js/medusa-runtime.js
+++ b/themes/dark/assets/js/medusa-runtime.js
@@ -48,6 +48,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n/
/***/ }),
+/***/ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./src/components/app-footer.vue?vue&type=script&lang=js&":
+/*!**************************************************************************************************************************************************!*\
+ !*** ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./src/components/app-footer.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 date_fns_format__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! date-fns/format */ \"./node_modules/date-fns/esm/format/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n//\n//\n//\n//\n//\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: 'app-footer',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"AppLink\"]\n },\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])(['config', 'stats', 'system']), Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])(['getStatus', 'getScheduler']), {\n snatchedStatus() {\n const status = this.getStatus({\n key: 'snatched'\n });\n return status ? status.value : '';\n },\n\n episodePercentage() {\n const {\n downloaded,\n total\n } = this.stats.overall.episodes;\n\n if (!total) {\n return '';\n }\n\n const raw = downloaded / total * 100;\n return raw.toFixed(1) + '%';\n },\n\n nowInUserPreset() {\n const {\n datePreset,\n timePreset\n } = this.config;\n const preset = Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"convertDateFormat\"])(\"\".concat(datePreset, \" \").concat(timePreset));\n return Object(date_fns_format__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(new Date(), preset);\n }\n\n }),\n methods: {\n /**\n * Return a formatted next run time of the scheduler matching the provided key.\n *\n * @param {string} scheduler A scheduler key.\n * @returns {string} The formatted next run time.\n */\n schedulerNextRun(scheduler) {\n /** @type {import('../store/modules/system').Scheduler} */\n const {\n nextRun\n } = this.getScheduler(scheduler); // The next run can be `undefined` when the scheduler was not initialized\n // on the backend, and `null` when the scheduler is not enabled.\n\n if (nextRun === undefined) {\n return '??:??:??';\n }\n\n if (nextRun === null) {\n return 'Disabled';\n }\n\n return this.formatTimeDuration(nextRun);\n },\n\n /**\n * Return a formatted string representing the provided duration.\n *\n * This function will not use any units greater than a day.\n * @param {number} durationInMs Duration of time in milliseconds.\n * @returns {string} The formatted duration.\n *\n * @example\n */\n formatTimeDuration(durationInMs) {\n const days = parseInt(durationInMs / 86400000, 10);\n let daysText = '';\n\n if (days > 0) {\n daysText = String(days) + (days > 1 ? ' days, ' : ' day, ');\n }\n\n const date = new Date(durationInMs % 86400000);\n\n const zeroPad = (num, len = 2) => String(num).padStart(len, '0');\n\n const hours = String(date.getUTCHours());\n const minutes = zeroPad(date.getUTCMinutes());\n const seconds = zeroPad(date.getUTCSeconds() + Math.round(date.getUTCMilliseconds() / 1000));\n return daysText + [hours, minutes, seconds].join(':');\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/app-footer.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options");
+
+/***/ }),
+
/***/ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./src/components/app-header.vue?vue&type=script&lang=js&":
/*!**************************************************************************************************************************************************!*\
!*** ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./src/components/app-header.vue?vue&type=script&lang=js& ***!
@@ -712,6 +724,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/app-footer.vue?vue&type=template&id=844e7d52&scoped=true&":
+/*!****************************************************************************************************************************************************************************************************************!*\
+ !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/app-footer.vue?vue&type=template&id=844e7d52&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(\"footer\", [\n _c(\n \"div\",\n { staticClass: \"footer clearfix\" },\n [\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.stats.overall.shows.total))\n ]),\n _vm._v(\" Shows (\"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.stats.overall.shows.active))\n ]),\n _vm._v(\" Active)\\n | \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.stats.overall.episodes.downloaded))\n ]),\n _vm._v(\" \"),\n _vm.stats.overall.episodes.snatched\n ? [\n _c(\n \"span\",\n { staticClass: \"footerhighlight\" },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"manage/episodeStatuses?whichStatus=\" +\n _vm.snatchedStatus,\n title: \"View overview of snatched episodes\"\n }\n },\n [_vm._v(\"+\" + _vm._s(_vm.stats.overall.episodes.snatched))]\n )\n ],\n 1\n ),\n _vm._v(\"\\n Snatched\\n \")\n ]\n : _vm._e(),\n _vm._v(\"\\n / \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.stats.overall.episodes.total))\n ]),\n _vm._v(\" Episodes Downloaded \"),\n _vm.episodePercentage\n ? _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(\"(\" + _vm._s(_vm.episodePercentage) + \")\")\n ])\n : _vm._e(),\n _vm._v(\"\\n | Daily Search: \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.schedulerNextRun(\"dailySearch\")))\n ]),\n _vm._v(\"\\n | Backlog Search: \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.schedulerNextRun(\"backlog\")))\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n [\n _vm.system.memoryUsage\n ? [\n _vm._v(\"\\n Memory used: \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.system.memoryUsage))\n ]),\n _vm._v(\" |\\n \")\n ]\n : _vm._e(),\n _vm._v(\" \"),\n _vm._v(\"\\n Branch: \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.config.branch || \"Unknown\"))\n ]),\n _vm._v(\" |\\n Now: \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.nowInUserPreset))\n ])\n ],\n 2\n )\n ],\n 2\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/app-footer.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/app-header.vue?vue&type=template&id=41e9b56e&":
/*!****************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/app-header.vue?vue&type=template&id=41e9b56e& ***!
@@ -1424,6 +1448,42 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
/***/ }),
+/***/ "./src/components/app-footer.vue":
+/*!***************************************!*\
+ !*** ./src/components/app-footer.vue ***!
+ \***************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _app_footer_vue_vue_type_template_id_844e7d52_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app-footer.vue?vue&type=template&id=844e7d52&scoped=true& */ \"./src/components/app-footer.vue?vue&type=template&id=844e7d52&scoped=true&\");\n/* harmony import */ var _app_footer_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./app-footer.vue?vue&type=script&lang=js& */ \"./src/components/app-footer.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(\n _app_footer_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _app_footer_vue_vue_type_template_id_844e7d52_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _app_footer_vue_vue_type_template_id_844e7d52_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"844e7d52\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/components/app-footer.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);\n\n//# sourceURL=webpack:///./src/components/app-footer.vue?");
+
+/***/ }),
+
+/***/ "./src/components/app-footer.vue?vue&type=script&lang=js&":
+/*!****************************************************************!*\
+ !*** ./src/components/app-footer.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 _node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_app_footer_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/babel-loader/lib!../../node_modules/vue-loader/lib??vue-loader-options!./app-footer.vue?vue&type=script&lang=js& */ \"./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./src/components/app-footer.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_app_footer_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); \n\n//# sourceURL=webpack:///./src/components/app-footer.vue?");
+
+/***/ }),
+
+/***/ "./src/components/app-footer.vue?vue&type=template&id=844e7d52&scoped=true&":
+/*!**********************************************************************************!*\
+ !*** ./src/components/app-footer.vue?vue&type=template&id=844e7d52&scoped=true& ***!
+ \**********************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_app_footer_vue_vue_type_template_id_844e7d52_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib??vue-loader-options!./app-footer.vue?vue&type=template&id=844e7d52&scoped=true& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./src/components/app-footer.vue?vue&type=template&id=844e7d52&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_app_footer_vue_vue_type_template_id_844e7d52_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_app_footer_vue_vue_type_template_id_844e7d52_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/components/app-footer.vue?");
+
+/***/ }),
+
/***/ "./src/components/app-header.vue":
/*!***************************************!*\
!*** ./src/components/app-header.vue ***!
@@ -2376,11 +2436,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _404
/*!*********************************!*\
!*** ./src/components/index.js ***!
\*********************************/
-/*! exports provided: AddRecommended, AddShowOptions, AddShows, AnidbReleaseGroupUi, AppHeader, Backstretch, Config, ConfigPostProcessing, Home, IRC, Login, Logs, ManualPostProcess, RootDirs, Show, ShowHeader, SnatchSelection, Status, SubMenu, SubtitleSearch, NotFound, AppLink, Asset, ConfigTemplate, ConfigTextboxNumber, ConfigTextbox, ConfigToggleSlider, FileBrowser, LanguageSelect, NamePattern, PlotInfo, QualityChooser, QualityPill, ScrollButtons, SelectList, ShowSelector, StateSwitch */
+/*! exports provided: AddRecommended, AddShowOptions, AddShows, AnidbReleaseGroupUi, AppFooter, AppHeader, Backstretch, Config, ConfigPostProcessing, Home, IRC, Login, Logs, ManualPostProcess, RootDirs, Show, ShowHeader, SnatchSelection, Status, SubMenu, SubtitleSearch, NotFound, AppLink, Asset, ConfigTemplate, ConfigTextboxNumber, ConfigTextbox, ConfigToggleSlider, FileBrowser, LanguageSelect, NamePattern, PlotInfo, QualityChooser, QualityPill, ScrollButtons, SelectList, ShowSelector, StateSwitch */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./add-recommended.vue */ \"./src/components/add-recommended.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AddRecommended\", function() { return _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add-show-options.vue */ \"./src/components/add-show-options.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AddShowOptions\", function() { return _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./add-shows.vue */ \"./src/components/add-shows.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AddShows\", function() { return _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\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 reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AnidbReleaseGroupUi\", function() { return _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _app_header_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app-header.vue */ \"./src/components/app-header.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AppHeader\", function() { return _app_header_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Backstretch\", function() { return _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony import */ var _config_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./config.vue */ \"./src/components/config.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Config\", function() { return _config_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony import */ var _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./config-post-processing.vue */ \"./src/components/config-post-processing.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigPostProcessing\", function() { return _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony import */ var _home_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./home.vue */ \"./src/components/home.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Home\", function() { return _home_vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony import */ var _irc_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./irc.vue */ \"./src/components/irc.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"IRC\", function() { return _irc_vue__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony import */ var _login_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./login.vue */ \"./src/components/login.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Login\", function() { return _login_vue__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* harmony import */ var _logs_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./logs.vue */ \"./src/components/logs.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Logs\", function() { return _logs_vue__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* harmony import */ var _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./manual-post-process.vue */ \"./src/components/manual-post-process.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ManualPostProcess\", function() { return _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"RootDirs\", function() { return _root_dirs_vue__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n/* harmony import */ var _show_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./show.vue */ \"./src/components/show.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Show\", function() { return _show_vue__WEBPACK_IMPORTED_MODULE_14__[\"default\"]; });\n\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ShowHeader\", function() { return _show_header_vue__WEBPACK_IMPORTED_MODULE_15__[\"default\"]; });\n\n/* harmony import */ var _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./snatch-selection.vue */ \"./src/components/snatch-selection.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SnatchSelection\", function() { return _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_16__[\"default\"]; });\n\n/* harmony import */ var _status_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./status.vue */ \"./src/components/status.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Status\", function() { return _status_vue__WEBPACK_IMPORTED_MODULE_17__[\"default\"]; });\n\n/* harmony import */ var _sub_menu_vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./sub-menu.vue */ \"./src/components/sub-menu.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SubMenu\", function() { return _sub_menu_vue__WEBPACK_IMPORTED_MODULE_18__[\"default\"]; });\n\n/* harmony import */ var _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./subtitle-search.vue */ \"./src/components/subtitle-search.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SubtitleSearch\", function() { return _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_19__[\"default\"]; });\n\n/* harmony import */ var _http__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./http */ \"./src/components/http/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"NotFound\", function() { return _http__WEBPACK_IMPORTED_MODULE_20__[\"NotFound\"]; });\n\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AppLink\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"AppLink\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Asset\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"Asset\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigTemplate\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"ConfigTemplate\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigTextboxNumber\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"ConfigTextboxNumber\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigTextbox\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"ConfigTextbox\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigToggleSlider\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"ConfigToggleSlider\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FileBrowser\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"FileBrowser\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"LanguageSelect\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"LanguageSelect\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"NamePattern\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"NamePattern\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PlotInfo\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"PlotInfo\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QualityChooser\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"QualityChooser\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QualityPill\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"QualityPill\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ScrollButtons\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"ScrollButtons\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SelectList\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"SelectList\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ShowSelector\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"ShowSelector\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StateSwitch\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"StateSwitch\"]; });\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./src/components/index.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./add-recommended.vue */ \"./src/components/add-recommended.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AddRecommended\", function() { return _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add-show-options.vue */ \"./src/components/add-show-options.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AddShowOptions\", function() { return _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./add-shows.vue */ \"./src/components/add-shows.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AddShows\", function() { return _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\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 reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AnidbReleaseGroupUi\", function() { return _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _app_footer_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app-footer.vue */ \"./src/components/app-footer.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AppFooter\", function() { return _app_footer_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _app_header_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./app-header.vue */ \"./src/components/app-header.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AppHeader\", function() { return _app_header_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Backstretch\", function() { return _backstretch_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony import */ var _config_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./config.vue */ \"./src/components/config.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Config\", function() { return _config_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony import */ var _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./config-post-processing.vue */ \"./src/components/config-post-processing.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigPostProcessing\", function() { return _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony import */ var _home_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./home.vue */ \"./src/components/home.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Home\", function() { return _home_vue__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony import */ var _irc_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./irc.vue */ \"./src/components/irc.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"IRC\", function() { return _irc_vue__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* harmony import */ var _login_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./login.vue */ \"./src/components/login.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Login\", function() { return _login_vue__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* harmony import */ var _logs_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./logs.vue */ \"./src/components/logs.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Logs\", function() { return _logs_vue__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* harmony import */ var _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./manual-post-process.vue */ \"./src/components/manual-post-process.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ManualPostProcess\", function() { return _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"RootDirs\", function() { return _root_dirs_vue__WEBPACK_IMPORTED_MODULE_14__[\"default\"]; });\n\n/* harmony import */ var _show_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./show.vue */ \"./src/components/show.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Show\", function() { return _show_vue__WEBPACK_IMPORTED_MODULE_15__[\"default\"]; });\n\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ShowHeader\", function() { return _show_header_vue__WEBPACK_IMPORTED_MODULE_16__[\"default\"]; });\n\n/* harmony import */ var _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./snatch-selection.vue */ \"./src/components/snatch-selection.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SnatchSelection\", function() { return _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_17__[\"default\"]; });\n\n/* harmony import */ var _status_vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./status.vue */ \"./src/components/status.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Status\", function() { return _status_vue__WEBPACK_IMPORTED_MODULE_18__[\"default\"]; });\n\n/* harmony import */ var _sub_menu_vue__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./sub-menu.vue */ \"./src/components/sub-menu.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SubMenu\", function() { return _sub_menu_vue__WEBPACK_IMPORTED_MODULE_19__[\"default\"]; });\n\n/* harmony import */ var _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./subtitle-search.vue */ \"./src/components/subtitle-search.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SubtitleSearch\", function() { return _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_20__[\"default\"]; });\n\n/* harmony import */ var _http__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./http */ \"./src/components/http/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"NotFound\", function() { return _http__WEBPACK_IMPORTED_MODULE_21__[\"NotFound\"]; });\n\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AppLink\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"AppLink\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Asset\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"Asset\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigTemplate\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"ConfigTemplate\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigTextboxNumber\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"ConfigTextboxNumber\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigTextbox\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"ConfigTextbox\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigToggleSlider\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"ConfigToggleSlider\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FileBrowser\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"FileBrowser\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"LanguageSelect\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"LanguageSelect\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"NamePattern\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"NamePattern\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PlotInfo\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"PlotInfo\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QualityChooser\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"QualityChooser\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QualityPill\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"QualityPill\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ScrollButtons\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"ScrollButtons\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SelectList\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"SelectList\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ShowSelector\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"ShowSelector\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StateSwitch\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"StateSwitch\"]; });\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./src/components/index.js?");
/***/ }),
@@ -2812,7 +2872,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"registerGlobalComponents\", function() { return registerGlobalComponents; });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vue_meta__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-meta */ \"./node_modules/vue-meta/dist/vue-meta.esm.js\");\n/* harmony import */ var vue_async_computed__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-async-computed */ \"./node_modules/vue-async-computed/dist/vue-async-computed.esm.js\");\n/* harmony import */ var vue_snotify__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-snotify */ \"./node_modules/vue-snotify/vue-snotify.esm.js\");\n/* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components */ \"./src/components/index.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/core */ \"./src/utils/core.js\");\n// @TODO: Remove this file before v1.0.0\n\n\n\n\n\n\n\n/**\n * Register global components and x-template components.\n */\n\nconst registerGlobalComponents = () => {\n // Start with the x-template components\n let {\n components\n } = window; // Add global components (in use by `main.mako`)\n // @TODO: These should be registered in an `App.vue` component when possible,\n // along with some of the `main.mako` template\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_4__[\"AppHeader\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ScrollButtons\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"SubMenu\"]]); // Add global components (in use by pages/components that are not SFCs yet)\n // Use this when it's not possible to use `components: { ... }` in a component's definition.\n // If a component that uses any of these is a SFC, please use the `components` key when defining it.\n // @TODO: Instead of globally registering these,\n // they should be registered in each component that uses them\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_4__[\"AddShowOptions\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"AnidbReleaseGroupUi\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"AppLink\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Asset\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Backstretch\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigTemplate\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigTextbox\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigTextboxNumber\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigToggleSlider\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"FileBrowser\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"LanguageSelect\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"PlotInfo\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"QualityChooser\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"QualityPill\"], // @FIXME: (sharkykh) Used in a hack/workaround in `static/js/ajax-episode-search.js`\n _components__WEBPACK_IMPORTED_MODULE_4__[\"RootDirs\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"SelectList\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ShowSelector\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"StateSwitch\"]]); // Add components for pages that use `pageComponent`\n // @TODO: These need to be converted to Vue SFCs\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_4__[\"Home\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ManualPostProcess\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Show\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"SnatchSelection\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Status\"]]); // Register the components globally\n\n components.forEach(component => {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.debug(\"Registering \".concat(component.name));\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].component(component.name, component);\n });\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (() => {\n const warningTemplate = (name, state) => \"\".concat(name, \" is using the global Vuex '\").concat(state, \"' state, \") + \"please replace that with a local one using: mapState(['\".concat(state, \"'])\");\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mixin({\n data() {\n // These are only needed for the root Vue\n if (this.$root === this) {\n return {\n globalLoading: true,\n pageComponent: false\n };\n }\n\n return {};\n },\n\n mounted() {\n if (this.$root === this && !window.location.pathname.includes('/login')) {\n const {\n username\n } = window;\n Promise.all([\n /* This is used by the `app-header` component\n to only show the logout button if a username is set */\n _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"].dispatch('login', {\n username\n }), _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"].dispatch('getConfig')]).then(([_, config]) => {\n this.$emit('loaded'); // Legacy - send config.main to jQuery (received by index.js)\n\n const event = new CustomEvent('medusa-config-loaded', {\n detail: config.main\n });\n window.dispatchEvent(event);\n }).catch(error => {\n console.debug(error);\n alert('Unable to connect to Medusa!'); // eslint-disable-line no-alert\n });\n }\n\n this.$once('loaded', () => {\n this.$root.globalLoading = false;\n });\n },\n\n // Make auth and config accessible to all components\n // @TODO: Remove this completely\n computed: {\n // Deprecate the global `Vuex.mapState(['auth', 'config'])`\n auth() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"] && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'auth'));\n }\n\n return this.$store.state.auth;\n },\n\n config() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"] && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'config'));\n }\n\n return this.$store.state.config;\n }\n\n }\n });\n\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.debug('Loading local Vue');\n } // Register plugins\n\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_async_computed__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_meta__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_snotify__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\n registerGlobalComponents();\n});\n\n//# sourceURL=webpack:///./src/global-vue-shim.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"registerGlobalComponents\", function() { return registerGlobalComponents; });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vue_meta__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-meta */ \"./node_modules/vue-meta/dist/vue-meta.esm.js\");\n/* harmony import */ var vue_async_computed__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-async-computed */ \"./node_modules/vue-async-computed/dist/vue-async-computed.esm.js\");\n/* harmony import */ var vue_snotify__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-snotify */ \"./node_modules/vue-snotify/vue-snotify.esm.js\");\n/* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components */ \"./src/components/index.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/core */ \"./src/utils/core.js\");\n// @TODO: Remove this file before v1.0.0\n\n\n\n\n\n\n\n/**\n * Register global components and x-template components.\n */\n\nconst registerGlobalComponents = () => {\n // Start with the x-template components\n let {\n components\n } = window; // Add global components (in use by `main.mako`)\n // @TODO: These should be registered in an `App.vue` component when possible,\n // along with some of the `main.mako` template\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_4__[\"AppFooter\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"AppHeader\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ScrollButtons\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"SubMenu\"]]); // Add global components (in use by pages/components that are not SFCs yet)\n // Use this when it's not possible to use `components: { ... }` in a component's definition.\n // If a component that uses any of these is a SFC, please use the `components` key when defining it.\n // @TODO: Instead of globally registering these,\n // they should be registered in each component that uses them\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_4__[\"AddShowOptions\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"AnidbReleaseGroupUi\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"AppLink\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Asset\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Backstretch\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigTemplate\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigTextbox\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigTextboxNumber\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigToggleSlider\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"FileBrowser\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"LanguageSelect\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"PlotInfo\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"QualityChooser\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"QualityPill\"], // @FIXME: (sharkykh) Used in a hack/workaround in `static/js/ajax-episode-search.js`\n _components__WEBPACK_IMPORTED_MODULE_4__[\"RootDirs\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"SelectList\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ShowSelector\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"StateSwitch\"]]); // Add components for pages that use `pageComponent`\n // @TODO: These need to be converted to Vue SFCs\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_4__[\"Home\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ManualPostProcess\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Show\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"SnatchSelection\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Status\"]]); // Register the components globally\n\n components.forEach(component => {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.debug(\"Registering \".concat(component.name));\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].component(component.name, component);\n });\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (() => {\n const warningTemplate = (name, state) => \"\".concat(name, \" is using the global Vuex '\").concat(state, \"' state, \") + \"please replace that with a local one using: mapState(['\".concat(state, \"'])\");\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mixin({\n data() {\n // These are only needed for the root Vue\n if (this.$root === this) {\n return {\n globalLoading: true,\n pageComponent: false\n };\n }\n\n return {};\n },\n\n mounted() {\n if (this.$root === this && !window.location.pathname.includes('/login')) {\n const {\n username\n } = window;\n Promise.all([\n /* This is used by the `app-header` component\n to only show the logout button if a username is set */\n _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"].dispatch('login', {\n username\n }), _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"].dispatch('getConfig'), _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"].dispatch('getStats')]).then(([_, config]) => {\n this.$emit('loaded'); // Legacy - send config.main to jQuery (received by index.js)\n\n const event = new CustomEvent('medusa-config-loaded', {\n detail: config.main\n });\n window.dispatchEvent(event);\n }).catch(error => {\n console.debug(error);\n alert('Unable to connect to Medusa!'); // eslint-disable-line no-alert\n });\n }\n\n this.$once('loaded', () => {\n this.$root.globalLoading = false;\n });\n },\n\n // Make auth and config accessible to all components\n // @TODO: Remove this completely\n computed: {\n // Deprecate the global `Vuex.mapState(['auth', 'config'])`\n auth() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"] && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'auth'));\n }\n\n return this.$store.state.auth;\n },\n\n config() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"] && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'config'));\n }\n\n return this.$store.state.config;\n }\n\n }\n });\n\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.debug('Loading local Vue');\n } // Register plugins\n\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_async_computed__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_meta__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_snotify__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\n registerGlobalComponents();\n});\n\n//# sourceURL=webpack:///./src/global-vue-shim.js?");
/***/ }),
@@ -3268,7 +3328,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\nconst state = {\n memoryUsage: null,\n schedulers: [],\n showQueue: []\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"]](state, {\n section,\n config\n }) {\n if (section === 'system') {\n state = Object.assign(state, config);\n }\n }\n\n};\nconst getters = {\n // Get a scheduler object using a key\n getScheduler: state => key => {\n return state.schedulers.find(scheduler => key === scheduler.key);\n }\n};\nconst actions = {};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/system.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n/**\n * An object representing a scheduler.\n *\n * If a scheduler isn't initialized on the backend,\n * this object will only have the `key` and `name` properties.\n * @typedef {object} Scheduler\n * @property {string} key\n * A camelCase key representing this scheduler.\n * @property {string} name\n * The scheduler's name.\n * @property {boolean} [isAlive]\n * Is the scheduler alive?\n * @property {boolean|string} [isEnabled]\n * Is the scheduler enabled? For the `backlog` scheduler, the value might be `Paused`.\n * @property {boolean} [isActive]\n * Is the scheduler's action currently running?\n * @property {string|null} [startTime]\n * The time of day in which this scheduler runs (format: ISO-8601 time), or `null` if not applicable.\n * @property {number} [cycleTime]\n * The duration in milliseconds between each run, or `null` if not applicable.\n * @property {number} [nextRun]\n * The duration in milliseconds until the next run.\n * @property {string} [lastRun]\n * The date and time of the previous run (format: ISO-8601 date-time).\n * @property {boolean} [isSilent]\n * Is the scheduler silent?\n */\n\nconst state = {\n memoryUsage: null,\n schedulers: [],\n showQueue: []\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"]](state, {\n section,\n config\n }) {\n if (section === 'system') {\n state = Object.assign(state, config);\n }\n }\n\n};\nconst getters = {\n getScheduler: state => {\n /**\n * Get a scheduler object using a key.\n *\n * @param {string} key The combined quality to split.\n * @returns {Scheduler|object} The scheduler object or an empty object if not found.\n */\n const _getScheduler = key => state.schedulers.find(scheduler => key === scheduler.key) || {};\n\n return _getScheduler;\n }\n};\nconst actions = {};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/system.js?");
/***/ }),
diff --git a/themes/dark/templates/layouts/main.mako b/themes/dark/templates/layouts/main.mako
index 6a1cf39e75..1f12b9526b 100644
--- a/themes/dark/templates/layouts/main.mako
+++ b/themes/dark/templates/layouts/main.mako
@@ -72,7 +72,7 @@
<%block name="content" />
- <%include file="/partials/footer.mako" />
+
diff --git a/themes/dark/templates/partials/footer.mako b/themes/dark/templates/partials/footer.mako
deleted file mode 100644
index 697e1356bd..0000000000
--- a/themes/dark/templates/partials/footer.mako
+++ /dev/null
@@ -1,59 +0,0 @@
-<%!
- from datetime import datetime
- from time import time
- from contextlib2 import suppress
- import os
- import re
- from medusa import app
- from medusa.helper.common import pretty_file_size
- from medusa.sbdatetime import sbdatetime
- from medusa.show.show import Show
-
- mem_usage = None
- with suppress(ImportError):
- from psutil import Process
- from os import getpid
- mem_usage = 'psutil'
-
- with suppress(ImportError):
- if not mem_usage:
- import resource # resource module is unix only
- mem_usage = 'resource'
-%>
-
-% if loggedIn:
- <%
- stats = Show.overall_stats()
- ep_downloaded = stats['episodes']['downloaded']
- ep_snatched = stats['episodes']['snatched']
- ep_total = stats['episodes']['total']
- ep_percentage = '' if ep_total == 0 else '()' % re.sub(r'(\d+)(\.\d)\d+', r'\1\2', str((float(ep_downloaded)/float(ep_total))*100))
- %>
-
-% endif
-
diff --git a/themes/light/assets/js/app.js b/themes/light/assets/js/app.js
index 5f1c5c4e54..595822d355 100644
--- a/themes/light/assets/js/app.js
+++ b/themes/light/assets/js/app.js
@@ -8,7 +8,7 @@
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vue_async_computed__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-async-computed */ \"./node_modules/vue-async-computed/dist/vue-async-computed.esm.js\");\n/* harmony import */ var vue_snotify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-snotify */ \"./node_modules/vue-snotify/vue-snotify.esm.js\");\n/* harmony import */ var _global_vue_shim__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./global-vue-shim */ \"./src/global-vue-shim.js\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./router */ \"./src/router/index.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/core */ \"./src/utils/core.js\");\n\n\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].config.devtools = true;\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].config.performance = true; // Register plugins\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_async_computed__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_snotify__WEBPACK_IMPORTED_MODULE_2__[\"default\"]); // @TODO: Remove this before v1.0.0\n\nObject(_global_vue_shim__WEBPACK_IMPORTED_MODULE_3__[\"registerGlobalComponents\"])();\nconst app = new vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n name: 'App',\n router: _router__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n store: _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n\n data() {\n return {\n globalLoading: false,\n pageComponent: false\n };\n },\n\n mounted() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.log('App Mounted!');\n }\n\n if (!window.location.pathname.includes('/login')) {\n const {\n $store\n } = this;\n Promise.all([$store.dispatch('login', {\n username: window.username\n }), $store.dispatch('getConfig')]).then(([_, config]) => {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.log('App Loaded!');\n } // Legacy - send config.main to jQuery (received by index.js)\n\n\n const event = new CustomEvent('medusa-config-loaded', {\n detail: config.main\n });\n window.dispatchEvent(event);\n }).catch(error => {\n console.debug(error);\n alert('Unable to connect to Medusa!'); // eslint-disable-line no-alert\n });\n }\n }\n\n}).$mount('#vue-wrap');\n/* harmony default export */ __webpack_exports__[\"default\"] = (app);\n\n//# sourceURL=webpack:///./src/app.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vue_async_computed__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-async-computed */ \"./node_modules/vue-async-computed/dist/vue-async-computed.esm.js\");\n/* harmony import */ var vue_snotify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-snotify */ \"./node_modules/vue-snotify/vue-snotify.esm.js\");\n/* harmony import */ var _global_vue_shim__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./global-vue-shim */ \"./src/global-vue-shim.js\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./router */ \"./src/router/index.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/core */ \"./src/utils/core.js\");\n\n\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].config.devtools = true;\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].config.performance = true; // Register plugins\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_async_computed__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_snotify__WEBPACK_IMPORTED_MODULE_2__[\"default\"]); // @TODO: Remove this before v1.0.0\n\nObject(_global_vue_shim__WEBPACK_IMPORTED_MODULE_3__[\"registerGlobalComponents\"])();\nconst app = new vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n name: 'App',\n router: _router__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n store: _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n\n data() {\n return {\n globalLoading: false,\n pageComponent: false\n };\n },\n\n mounted() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.log('App Mounted!');\n }\n\n if (!window.location.pathname.includes('/login')) {\n const {\n $store\n } = this;\n Promise.all([$store.dispatch('login', {\n username: window.username\n }), $store.dispatch('getConfig'), $store.dispatch('getStats')]).then(([_, config]) => {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.log('App Loaded!');\n } // Legacy - send config.main to jQuery (received by index.js)\n\n\n const event = new CustomEvent('medusa-config-loaded', {\n detail: config.main\n });\n window.dispatchEvent(event);\n }).catch(error => {\n console.debug(error);\n alert('Unable to connect to Medusa!'); // eslint-disable-line no-alert\n });\n }\n }\n\n}).$mount('#vue-wrap');\n/* harmony default export */ __webpack_exports__[\"default\"] = (app);\n\n//# sourceURL=webpack:///./src/app.js?");
/***/ })
diff --git a/themes/light/assets/js/medusa-runtime.js b/themes/light/assets/js/medusa-runtime.js
index 7f34f6e58c..cb08a557a9 100644
--- a/themes/light/assets/js/medusa-runtime.js
+++ b/themes/light/assets/js/medusa-runtime.js
@@ -48,6 +48,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n/
/***/ }),
+/***/ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./src/components/app-footer.vue?vue&type=script&lang=js&":
+/*!**************************************************************************************************************************************************!*\
+ !*** ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./src/components/app-footer.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 date_fns_format__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! date-fns/format */ \"./node_modules/date-fns/esm/format/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n//\n//\n//\n//\n//\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: 'app-footer',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"AppLink\"]\n },\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])(['config', 'stats', 'system']), Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])(['getStatus', 'getScheduler']), {\n snatchedStatus() {\n const status = this.getStatus({\n key: 'snatched'\n });\n return status ? status.value : '';\n },\n\n episodePercentage() {\n const {\n downloaded,\n total\n } = this.stats.overall.episodes;\n\n if (!total) {\n return '';\n }\n\n const raw = downloaded / total * 100;\n return raw.toFixed(1) + '%';\n },\n\n nowInUserPreset() {\n const {\n datePreset,\n timePreset\n } = this.config;\n const preset = Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"convertDateFormat\"])(\"\".concat(datePreset, \" \").concat(timePreset));\n return Object(date_fns_format__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(new Date(), preset);\n }\n\n }),\n methods: {\n /**\n * Return a formatted next run time of the scheduler matching the provided key.\n *\n * @param {string} scheduler A scheduler key.\n * @returns {string} The formatted next run time.\n */\n schedulerNextRun(scheduler) {\n /** @type {import('../store/modules/system').Scheduler} */\n const {\n nextRun\n } = this.getScheduler(scheduler); // The next run can be `undefined` when the scheduler was not initialized\n // on the backend, and `null` when the scheduler is not enabled.\n\n if (nextRun === undefined) {\n return '??:??:??';\n }\n\n if (nextRun === null) {\n return 'Disabled';\n }\n\n return this.formatTimeDuration(nextRun);\n },\n\n /**\n * Return a formatted string representing the provided duration.\n *\n * This function will not use any units greater than a day.\n * @param {number} durationInMs Duration of time in milliseconds.\n * @returns {string} The formatted duration.\n *\n * @example\n */\n formatTimeDuration(durationInMs) {\n const days = parseInt(durationInMs / 86400000, 10);\n let daysText = '';\n\n if (days > 0) {\n daysText = String(days) + (days > 1 ? ' days, ' : ' day, ');\n }\n\n const date = new Date(durationInMs % 86400000);\n\n const zeroPad = (num, len = 2) => String(num).padStart(len, '0');\n\n const hours = String(date.getUTCHours());\n const minutes = zeroPad(date.getUTCMinutes());\n const seconds = zeroPad(date.getUTCSeconds() + Math.round(date.getUTCMilliseconds() / 1000));\n return daysText + [hours, minutes, seconds].join(':');\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/app-footer.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options");
+
+/***/ }),
+
/***/ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./src/components/app-header.vue?vue&type=script&lang=js&":
/*!**************************************************************************************************************************************************!*\
!*** ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./src/components/app-header.vue?vue&type=script&lang=js& ***!
@@ -712,6 +724,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/app-footer.vue?vue&type=template&id=844e7d52&scoped=true&":
+/*!****************************************************************************************************************************************************************************************************************!*\
+ !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/app-footer.vue?vue&type=template&id=844e7d52&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(\"footer\", [\n _c(\n \"div\",\n { staticClass: \"footer clearfix\" },\n [\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.stats.overall.shows.total))\n ]),\n _vm._v(\" Shows (\"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.stats.overall.shows.active))\n ]),\n _vm._v(\" Active)\\n | \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.stats.overall.episodes.downloaded))\n ]),\n _vm._v(\" \"),\n _vm.stats.overall.episodes.snatched\n ? [\n _c(\n \"span\",\n { staticClass: \"footerhighlight\" },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"manage/episodeStatuses?whichStatus=\" +\n _vm.snatchedStatus,\n title: \"View overview of snatched episodes\"\n }\n },\n [_vm._v(\"+\" + _vm._s(_vm.stats.overall.episodes.snatched))]\n )\n ],\n 1\n ),\n _vm._v(\"\\n Snatched\\n \")\n ]\n : _vm._e(),\n _vm._v(\"\\n / \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.stats.overall.episodes.total))\n ]),\n _vm._v(\" Episodes Downloaded \"),\n _vm.episodePercentage\n ? _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(\"(\" + _vm._s(_vm.episodePercentage) + \")\")\n ])\n : _vm._e(),\n _vm._v(\"\\n | Daily Search: \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.schedulerNextRun(\"dailySearch\")))\n ]),\n _vm._v(\"\\n | Backlog Search: \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.schedulerNextRun(\"backlog\")))\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n [\n _vm.system.memoryUsage\n ? [\n _vm._v(\"\\n Memory used: \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.system.memoryUsage))\n ]),\n _vm._v(\" |\\n \")\n ]\n : _vm._e(),\n _vm._v(\" \"),\n _vm._v(\"\\n Branch: \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.config.branch || \"Unknown\"))\n ]),\n _vm._v(\" |\\n Now: \"),\n _c(\"span\", { staticClass: \"footerhighlight\" }, [\n _vm._v(_vm._s(_vm.nowInUserPreset))\n ])\n ],\n 2\n )\n ],\n 2\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/app-footer.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/app-header.vue?vue&type=template&id=41e9b56e&":
/*!****************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/app-header.vue?vue&type=template&id=41e9b56e& ***!
@@ -1424,6 +1448,42 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
/***/ }),
+/***/ "./src/components/app-footer.vue":
+/*!***************************************!*\
+ !*** ./src/components/app-footer.vue ***!
+ \***************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _app_footer_vue_vue_type_template_id_844e7d52_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app-footer.vue?vue&type=template&id=844e7d52&scoped=true& */ \"./src/components/app-footer.vue?vue&type=template&id=844e7d52&scoped=true&\");\n/* harmony import */ var _app_footer_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./app-footer.vue?vue&type=script&lang=js& */ \"./src/components/app-footer.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(\n _app_footer_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _app_footer_vue_vue_type_template_id_844e7d52_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _app_footer_vue_vue_type_template_id_844e7d52_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"844e7d52\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/components/app-footer.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);\n\n//# sourceURL=webpack:///./src/components/app-footer.vue?");
+
+/***/ }),
+
+/***/ "./src/components/app-footer.vue?vue&type=script&lang=js&":
+/*!****************************************************************!*\
+ !*** ./src/components/app-footer.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 _node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_app_footer_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/babel-loader/lib!../../node_modules/vue-loader/lib??vue-loader-options!./app-footer.vue?vue&type=script&lang=js& */ \"./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./src/components/app-footer.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_app_footer_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); \n\n//# sourceURL=webpack:///./src/components/app-footer.vue?");
+
+/***/ }),
+
+/***/ "./src/components/app-footer.vue?vue&type=template&id=844e7d52&scoped=true&":
+/*!**********************************************************************************!*\
+ !*** ./src/components/app-footer.vue?vue&type=template&id=844e7d52&scoped=true& ***!
+ \**********************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_app_footer_vue_vue_type_template_id_844e7d52_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib??vue-loader-options!./app-footer.vue?vue&type=template&id=844e7d52&scoped=true& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./src/components/app-footer.vue?vue&type=template&id=844e7d52&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_app_footer_vue_vue_type_template_id_844e7d52_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_app_footer_vue_vue_type_template_id_844e7d52_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/components/app-footer.vue?");
+
+/***/ }),
+
/***/ "./src/components/app-header.vue":
/*!***************************************!*\
!*** ./src/components/app-header.vue ***!
@@ -2376,11 +2436,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _404
/*!*********************************!*\
!*** ./src/components/index.js ***!
\*********************************/
-/*! exports provided: AddRecommended, AddShowOptions, AddShows, AnidbReleaseGroupUi, AppHeader, Backstretch, Config, ConfigPostProcessing, Home, IRC, Login, Logs, ManualPostProcess, RootDirs, Show, ShowHeader, SnatchSelection, Status, SubMenu, SubtitleSearch, NotFound, AppLink, Asset, ConfigTemplate, ConfigTextboxNumber, ConfigTextbox, ConfigToggleSlider, FileBrowser, LanguageSelect, NamePattern, PlotInfo, QualityChooser, QualityPill, ScrollButtons, SelectList, ShowSelector, StateSwitch */
+/*! exports provided: AddRecommended, AddShowOptions, AddShows, AnidbReleaseGroupUi, AppFooter, AppHeader, Backstretch, Config, ConfigPostProcessing, Home, IRC, Login, Logs, ManualPostProcess, RootDirs, Show, ShowHeader, SnatchSelection, Status, SubMenu, SubtitleSearch, NotFound, AppLink, Asset, ConfigTemplate, ConfigTextboxNumber, ConfigTextbox, ConfigToggleSlider, FileBrowser, LanguageSelect, NamePattern, PlotInfo, QualityChooser, QualityPill, ScrollButtons, SelectList, ShowSelector, StateSwitch */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./add-recommended.vue */ \"./src/components/add-recommended.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AddRecommended\", function() { return _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add-show-options.vue */ \"./src/components/add-show-options.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AddShowOptions\", function() { return _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./add-shows.vue */ \"./src/components/add-shows.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AddShows\", function() { return _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\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 reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AnidbReleaseGroupUi\", function() { return _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _app_header_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app-header.vue */ \"./src/components/app-header.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AppHeader\", function() { return _app_header_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Backstretch\", function() { return _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony import */ var _config_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./config.vue */ \"./src/components/config.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Config\", function() { return _config_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony import */ var _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./config-post-processing.vue */ \"./src/components/config-post-processing.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigPostProcessing\", function() { return _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony import */ var _home_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./home.vue */ \"./src/components/home.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Home\", function() { return _home_vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony import */ var _irc_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./irc.vue */ \"./src/components/irc.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"IRC\", function() { return _irc_vue__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony import */ var _login_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./login.vue */ \"./src/components/login.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Login\", function() { return _login_vue__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* harmony import */ var _logs_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./logs.vue */ \"./src/components/logs.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Logs\", function() { return _logs_vue__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* harmony import */ var _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./manual-post-process.vue */ \"./src/components/manual-post-process.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ManualPostProcess\", function() { return _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"RootDirs\", function() { return _root_dirs_vue__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n/* harmony import */ var _show_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./show.vue */ \"./src/components/show.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Show\", function() { return _show_vue__WEBPACK_IMPORTED_MODULE_14__[\"default\"]; });\n\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ShowHeader\", function() { return _show_header_vue__WEBPACK_IMPORTED_MODULE_15__[\"default\"]; });\n\n/* harmony import */ var _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./snatch-selection.vue */ \"./src/components/snatch-selection.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SnatchSelection\", function() { return _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_16__[\"default\"]; });\n\n/* harmony import */ var _status_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./status.vue */ \"./src/components/status.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Status\", function() { return _status_vue__WEBPACK_IMPORTED_MODULE_17__[\"default\"]; });\n\n/* harmony import */ var _sub_menu_vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./sub-menu.vue */ \"./src/components/sub-menu.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SubMenu\", function() { return _sub_menu_vue__WEBPACK_IMPORTED_MODULE_18__[\"default\"]; });\n\n/* harmony import */ var _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./subtitle-search.vue */ \"./src/components/subtitle-search.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SubtitleSearch\", function() { return _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_19__[\"default\"]; });\n\n/* harmony import */ var _http__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./http */ \"./src/components/http/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"NotFound\", function() { return _http__WEBPACK_IMPORTED_MODULE_20__[\"NotFound\"]; });\n\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AppLink\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"AppLink\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Asset\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"Asset\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigTemplate\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"ConfigTemplate\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigTextboxNumber\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"ConfigTextboxNumber\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigTextbox\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"ConfigTextbox\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigToggleSlider\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"ConfigToggleSlider\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FileBrowser\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"FileBrowser\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"LanguageSelect\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"LanguageSelect\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"NamePattern\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"NamePattern\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PlotInfo\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"PlotInfo\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QualityChooser\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"QualityChooser\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QualityPill\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"QualityPill\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ScrollButtons\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"ScrollButtons\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SelectList\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"SelectList\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ShowSelector\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"ShowSelector\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StateSwitch\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_21__[\"StateSwitch\"]; });\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./src/components/index.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./add-recommended.vue */ \"./src/components/add-recommended.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AddRecommended\", function() { return _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add-show-options.vue */ \"./src/components/add-show-options.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AddShowOptions\", function() { return _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./add-shows.vue */ \"./src/components/add-shows.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AddShows\", function() { return _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\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 reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AnidbReleaseGroupUi\", function() { return _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _app_footer_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app-footer.vue */ \"./src/components/app-footer.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AppFooter\", function() { return _app_footer_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _app_header_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./app-header.vue */ \"./src/components/app-header.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AppHeader\", function() { return _app_header_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Backstretch\", function() { return _backstretch_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony import */ var _config_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./config.vue */ \"./src/components/config.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Config\", function() { return _config_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony import */ var _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./config-post-processing.vue */ \"./src/components/config-post-processing.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigPostProcessing\", function() { return _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony import */ var _home_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./home.vue */ \"./src/components/home.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Home\", function() { return _home_vue__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony import */ var _irc_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./irc.vue */ \"./src/components/irc.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"IRC\", function() { return _irc_vue__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* harmony import */ var _login_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./login.vue */ \"./src/components/login.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Login\", function() { return _login_vue__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* harmony import */ var _logs_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./logs.vue */ \"./src/components/logs.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Logs\", function() { return _logs_vue__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* harmony import */ var _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./manual-post-process.vue */ \"./src/components/manual-post-process.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ManualPostProcess\", function() { return _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"RootDirs\", function() { return _root_dirs_vue__WEBPACK_IMPORTED_MODULE_14__[\"default\"]; });\n\n/* harmony import */ var _show_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./show.vue */ \"./src/components/show.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Show\", function() { return _show_vue__WEBPACK_IMPORTED_MODULE_15__[\"default\"]; });\n\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ShowHeader\", function() { return _show_header_vue__WEBPACK_IMPORTED_MODULE_16__[\"default\"]; });\n\n/* harmony import */ var _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./snatch-selection.vue */ \"./src/components/snatch-selection.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SnatchSelection\", function() { return _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_17__[\"default\"]; });\n\n/* harmony import */ var _status_vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./status.vue */ \"./src/components/status.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Status\", function() { return _status_vue__WEBPACK_IMPORTED_MODULE_18__[\"default\"]; });\n\n/* harmony import */ var _sub_menu_vue__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./sub-menu.vue */ \"./src/components/sub-menu.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SubMenu\", function() { return _sub_menu_vue__WEBPACK_IMPORTED_MODULE_19__[\"default\"]; });\n\n/* harmony import */ var _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./subtitle-search.vue */ \"./src/components/subtitle-search.vue\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SubtitleSearch\", function() { return _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_20__[\"default\"]; });\n\n/* harmony import */ var _http__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./http */ \"./src/components/http/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"NotFound\", function() { return _http__WEBPACK_IMPORTED_MODULE_21__[\"NotFound\"]; });\n\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AppLink\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"AppLink\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Asset\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"Asset\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigTemplate\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"ConfigTemplate\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigTextboxNumber\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"ConfigTextboxNumber\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigTextbox\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"ConfigTextbox\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConfigToggleSlider\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"ConfigToggleSlider\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FileBrowser\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"FileBrowser\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"LanguageSelect\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"LanguageSelect\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"NamePattern\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"NamePattern\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PlotInfo\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"PlotInfo\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QualityChooser\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"QualityChooser\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QualityPill\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"QualityPill\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ScrollButtons\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"ScrollButtons\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SelectList\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"SelectList\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ShowSelector\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"ShowSelector\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StateSwitch\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_22__[\"StateSwitch\"]; });\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./src/components/index.js?");
/***/ }),
@@ -2812,7 +2872,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"registerGlobalComponents\", function() { return registerGlobalComponents; });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vue_meta__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-meta */ \"./node_modules/vue-meta/dist/vue-meta.esm.js\");\n/* harmony import */ var vue_async_computed__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-async-computed */ \"./node_modules/vue-async-computed/dist/vue-async-computed.esm.js\");\n/* harmony import */ var vue_snotify__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-snotify */ \"./node_modules/vue-snotify/vue-snotify.esm.js\");\n/* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components */ \"./src/components/index.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/core */ \"./src/utils/core.js\");\n// @TODO: Remove this file before v1.0.0\n\n\n\n\n\n\n\n/**\n * Register global components and x-template components.\n */\n\nconst registerGlobalComponents = () => {\n // Start with the x-template components\n let {\n components\n } = window; // Add global components (in use by `main.mako`)\n // @TODO: These should be registered in an `App.vue` component when possible,\n // along with some of the `main.mako` template\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_4__[\"AppHeader\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ScrollButtons\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"SubMenu\"]]); // Add global components (in use by pages/components that are not SFCs yet)\n // Use this when it's not possible to use `components: { ... }` in a component's definition.\n // If a component that uses any of these is a SFC, please use the `components` key when defining it.\n // @TODO: Instead of globally registering these,\n // they should be registered in each component that uses them\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_4__[\"AddShowOptions\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"AnidbReleaseGroupUi\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"AppLink\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Asset\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Backstretch\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigTemplate\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigTextbox\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigTextboxNumber\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigToggleSlider\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"FileBrowser\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"LanguageSelect\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"PlotInfo\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"QualityChooser\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"QualityPill\"], // @FIXME: (sharkykh) Used in a hack/workaround in `static/js/ajax-episode-search.js`\n _components__WEBPACK_IMPORTED_MODULE_4__[\"RootDirs\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"SelectList\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ShowSelector\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"StateSwitch\"]]); // Add components for pages that use `pageComponent`\n // @TODO: These need to be converted to Vue SFCs\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_4__[\"Home\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ManualPostProcess\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Show\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"SnatchSelection\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Status\"]]); // Register the components globally\n\n components.forEach(component => {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.debug(\"Registering \".concat(component.name));\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].component(component.name, component);\n });\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (() => {\n const warningTemplate = (name, state) => \"\".concat(name, \" is using the global Vuex '\").concat(state, \"' state, \") + \"please replace that with a local one using: mapState(['\".concat(state, \"'])\");\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mixin({\n data() {\n // These are only needed for the root Vue\n if (this.$root === this) {\n return {\n globalLoading: true,\n pageComponent: false\n };\n }\n\n return {};\n },\n\n mounted() {\n if (this.$root === this && !window.location.pathname.includes('/login')) {\n const {\n username\n } = window;\n Promise.all([\n /* This is used by the `app-header` component\n to only show the logout button if a username is set */\n _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"].dispatch('login', {\n username\n }), _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"].dispatch('getConfig')]).then(([_, config]) => {\n this.$emit('loaded'); // Legacy - send config.main to jQuery (received by index.js)\n\n const event = new CustomEvent('medusa-config-loaded', {\n detail: config.main\n });\n window.dispatchEvent(event);\n }).catch(error => {\n console.debug(error);\n alert('Unable to connect to Medusa!'); // eslint-disable-line no-alert\n });\n }\n\n this.$once('loaded', () => {\n this.$root.globalLoading = false;\n });\n },\n\n // Make auth and config accessible to all components\n // @TODO: Remove this completely\n computed: {\n // Deprecate the global `Vuex.mapState(['auth', 'config'])`\n auth() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"] && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'auth'));\n }\n\n return this.$store.state.auth;\n },\n\n config() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"] && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'config'));\n }\n\n return this.$store.state.config;\n }\n\n }\n });\n\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.debug('Loading local Vue');\n } // Register plugins\n\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_async_computed__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_meta__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_snotify__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\n registerGlobalComponents();\n});\n\n//# sourceURL=webpack:///./src/global-vue-shim.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"registerGlobalComponents\", function() { return registerGlobalComponents; });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vue_meta__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-meta */ \"./node_modules/vue-meta/dist/vue-meta.esm.js\");\n/* harmony import */ var vue_async_computed__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-async-computed */ \"./node_modules/vue-async-computed/dist/vue-async-computed.esm.js\");\n/* harmony import */ var vue_snotify__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-snotify */ \"./node_modules/vue-snotify/vue-snotify.esm.js\");\n/* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components */ \"./src/components/index.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/core */ \"./src/utils/core.js\");\n// @TODO: Remove this file before v1.0.0\n\n\n\n\n\n\n\n/**\n * Register global components and x-template components.\n */\n\nconst registerGlobalComponents = () => {\n // Start with the x-template components\n let {\n components\n } = window; // Add global components (in use by `main.mako`)\n // @TODO: These should be registered in an `App.vue` component when possible,\n // along with some of the `main.mako` template\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_4__[\"AppFooter\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"AppHeader\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ScrollButtons\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"SubMenu\"]]); // Add global components (in use by pages/components that are not SFCs yet)\n // Use this when it's not possible to use `components: { ... }` in a component's definition.\n // If a component that uses any of these is a SFC, please use the `components` key when defining it.\n // @TODO: Instead of globally registering these,\n // they should be registered in each component that uses them\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_4__[\"AddShowOptions\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"AnidbReleaseGroupUi\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"AppLink\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Asset\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Backstretch\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigTemplate\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigTextbox\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigTextboxNumber\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ConfigToggleSlider\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"FileBrowser\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"LanguageSelect\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"PlotInfo\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"QualityChooser\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"QualityPill\"], // @FIXME: (sharkykh) Used in a hack/workaround in `static/js/ajax-episode-search.js`\n _components__WEBPACK_IMPORTED_MODULE_4__[\"RootDirs\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"SelectList\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ShowSelector\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"StateSwitch\"]]); // Add components for pages that use `pageComponent`\n // @TODO: These need to be converted to Vue SFCs\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_4__[\"Home\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"ManualPostProcess\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Show\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"SnatchSelection\"], _components__WEBPACK_IMPORTED_MODULE_4__[\"Status\"]]); // Register the components globally\n\n components.forEach(component => {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.debug(\"Registering \".concat(component.name));\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].component(component.name, component);\n });\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (() => {\n const warningTemplate = (name, state) => \"\".concat(name, \" is using the global Vuex '\").concat(state, \"' state, \") + \"please replace that with a local one using: mapState(['\".concat(state, \"'])\");\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mixin({\n data() {\n // These are only needed for the root Vue\n if (this.$root === this) {\n return {\n globalLoading: true,\n pageComponent: false\n };\n }\n\n return {};\n },\n\n mounted() {\n if (this.$root === this && !window.location.pathname.includes('/login')) {\n const {\n username\n } = window;\n Promise.all([\n /* This is used by the `app-header` component\n to only show the logout button if a username is set */\n _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"].dispatch('login', {\n username\n }), _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"].dispatch('getConfig'), _store__WEBPACK_IMPORTED_MODULE_5__[\"default\"].dispatch('getStats')]).then(([_, config]) => {\n this.$emit('loaded'); // Legacy - send config.main to jQuery (received by index.js)\n\n const event = new CustomEvent('medusa-config-loaded', {\n detail: config.main\n });\n window.dispatchEvent(event);\n }).catch(error => {\n console.debug(error);\n alert('Unable to connect to Medusa!'); // eslint-disable-line no-alert\n });\n }\n\n this.$once('loaded', () => {\n this.$root.globalLoading = false;\n });\n },\n\n // Make auth and config accessible to all components\n // @TODO: Remove this completely\n computed: {\n // Deprecate the global `Vuex.mapState(['auth', 'config'])`\n auth() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"] && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'auth'));\n }\n\n return this.$store.state.auth;\n },\n\n config() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"] && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'config'));\n }\n\n return this.$store.state.config;\n }\n\n }\n });\n\n if (_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"isDevelopment\"]) {\n console.debug('Loading local Vue');\n } // Register plugins\n\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_async_computed__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_meta__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_snotify__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\n registerGlobalComponents();\n});\n\n//# sourceURL=webpack:///./src/global-vue-shim.js?");
/***/ }),
@@ -3268,7 +3328,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\nconst state = {\n memoryUsage: null,\n schedulers: [],\n showQueue: []\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"]](state, {\n section,\n config\n }) {\n if (section === 'system') {\n state = Object.assign(state, config);\n }\n }\n\n};\nconst getters = {\n // Get a scheduler object using a key\n getScheduler: state => key => {\n return state.schedulers.find(scheduler => key === scheduler.key);\n }\n};\nconst actions = {};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/system.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n/**\n * An object representing a scheduler.\n *\n * If a scheduler isn't initialized on the backend,\n * this object will only have the `key` and `name` properties.\n * @typedef {object} Scheduler\n * @property {string} key\n * A camelCase key representing this scheduler.\n * @property {string} name\n * The scheduler's name.\n * @property {boolean} [isAlive]\n * Is the scheduler alive?\n * @property {boolean|string} [isEnabled]\n * Is the scheduler enabled? For the `backlog` scheduler, the value might be `Paused`.\n * @property {boolean} [isActive]\n * Is the scheduler's action currently running?\n * @property {string|null} [startTime]\n * The time of day in which this scheduler runs (format: ISO-8601 time), or `null` if not applicable.\n * @property {number} [cycleTime]\n * The duration in milliseconds between each run, or `null` if not applicable.\n * @property {number} [nextRun]\n * The duration in milliseconds until the next run.\n * @property {string} [lastRun]\n * The date and time of the previous run (format: ISO-8601 date-time).\n * @property {boolean} [isSilent]\n * Is the scheduler silent?\n */\n\nconst state = {\n memoryUsage: null,\n schedulers: [],\n showQueue: []\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"]](state, {\n section,\n config\n }) {\n if (section === 'system') {\n state = Object.assign(state, config);\n }\n }\n\n};\nconst getters = {\n getScheduler: state => {\n /**\n * Get a scheduler object using a key.\n *\n * @param {string} key The combined quality to split.\n * @returns {Scheduler|object} The scheduler object or an empty object if not found.\n */\n const _getScheduler = key => state.schedulers.find(scheduler => key === scheduler.key) || {};\n\n return _getScheduler;\n }\n};\nconst actions = {};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/system.js?");
/***/ }),
diff --git a/themes/light/templates/layouts/main.mako b/themes/light/templates/layouts/main.mako
index 6a1cf39e75..1f12b9526b 100644
--- a/themes/light/templates/layouts/main.mako
+++ b/themes/light/templates/layouts/main.mako
@@ -72,7 +72,7 @@
<%block name="content" />
- <%include file="/partials/footer.mako" />
+
diff --git a/themes/light/templates/partials/footer.mako b/themes/light/templates/partials/footer.mako
deleted file mode 100644
index 697e1356bd..0000000000
--- a/themes/light/templates/partials/footer.mako
+++ /dev/null
@@ -1,59 +0,0 @@
-<%!
- from datetime import datetime
- from time import time
- from contextlib2 import suppress
- import os
- import re
- from medusa import app
- from medusa.helper.common import pretty_file_size
- from medusa.sbdatetime import sbdatetime
- from medusa.show.show import Show
-
- mem_usage = None
- with suppress(ImportError):
- from psutil import Process
- from os import getpid
- mem_usage = 'psutil'
-
- with suppress(ImportError):
- if not mem_usage:
- import resource # resource module is unix only
- mem_usage = 'resource'
-%>
-
-% if loggedIn:
- <%
- stats = Show.overall_stats()
- ep_downloaded = stats['episodes']['downloaded']
- ep_snatched = stats['episodes']['snatched']
- ep_total = stats['episodes']['total']
- ep_percentage = '' if ep_total == 0 else '()' % re.sub(r'(\d+)(\.\d)\d+', r'\1\2', str((float(ep_downloaded)/float(ep_total))*100))
- %>
-
-% endif
-