From c30479746483b2da7c8da4c500c223625f7d39b2 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Wed, 13 Nov 2019 18:50:41 +0100 Subject: [PATCH 01/87] Add history apiv2 handler. * Add paginate_query helper, to provide a proper db pagination solution. --- medusa/server/api/v2/base.py | 25 ++++++++- medusa/server/api/v2/history.py | 99 +++++++++++++++++++++++++++++++++ medusa/server/core.py | 4 ++ 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 medusa/server/api/v2/history.py diff --git a/medusa/server/api/v2/base.py b/medusa/server/api/v2/base.py index baab349bfa..bb0e98afb5 100644 --- a/medusa/server/api/v2/base.py +++ b/medusa/server/api/v2/base.py @@ -19,7 +19,7 @@ import jwt -from medusa import app +from medusa import app, db from medusa.logger.adapters.style import BraceAdapter from six import PY2, ensure_text, iteritems, string_types, text_type, viewitems @@ -413,6 +413,29 @@ def safe_compare(field, results): return self._ok(data=results, headers=headers) + def paginate_query(self, query, identifier, where=None, params=None): + """Paginate query.""" + arg_page = self._get_page() + arg_limit = self._get_limit() + + headers = { + 'X-Pagination-Page': arg_page, + 'X-Pagination-Limit': arg_limit + } + + query += ' WHERE {identifier} > ?'.format(identifier=identifier) + base_params = [] + params.append(arg_limit * arg_page) + + if where and params: + query += ' AND '.join([where + ' = ? ' for where in sql_where]) + base_params += params + + query += ' LIMIT {limit}'.format(limit=arg_limit) + + main_db_con = db.DBConnection() + return main_db_con.select(query, params) + @classmethod def _parse(cls, value, function=int): """Parse value using the specified function. diff --git a/medusa/server/api/v2/history.py b/medusa/server/api/v2/history.py new file mode 100644 index 0000000000..1372c03bc4 --- /dev/null +++ b/medusa/server/api/v2/history.py @@ -0,0 +1,99 @@ +# coding=utf-8 +"""Request handler for alias (scene exceptions).""" +from __future__ import unicode_literals + +from medusa import db + +from medusa.server.api.v2.base import BaseRequestHandler +from medusa.providers.generic_provider import GenericProvider +from medusa.providers import get_provider_class +from medusa.tv.series import SeriesIdentifier +from os.path import basename +from medusa.common import statusStrings + +from tornado.escape import json_decode + + +class HistoryHandler(BaseRequestHandler): + """History request handler.""" + + #: resource name + name = 'history' + #: identifier + identifier = ('series_slug', r'\w+') + #: path param + path_param = ('path_param', r'\w+') + #: allowed HTTP methods + allowed_methods = ('GET', 'POST', 'PUT', 'DELETE') + + def get(self, series_slug, path_param): + """Query search history information.""" + + sql_base = ''' + SELECT rowid, date, action, quality, + provider, version, resource, size, + indexer_id, showid, season, episode + FROM history + ''' + + sql_where = [] + params = [] + + if series_slug is not None: + series_identifier = SeriesIdentifier.from_slug(series_slug) + if not series_identifier: + return self._bad_request('Invalid series') + + sql_where += ['indexer_id', 'show_id'] + params += [series_identifier.indexer.id, series_identifier.id] + + results = self.paginate_query(sql_base, 'rowid', sql_where, params) + + data = [] + for item in results: + d = {} + d['id'] = item['rowid'] + + if item['indexer_id'] and item['showid']: + d['series'] = SeriesIdentifier.from_id(item['indexer_id'], item['showid']).slug + + d['status'] = item['action'] + d['actionDate'] = item['date'] + + d['resource'] = basename(item['resource']) + d['size'] = item['size'] + d['statusName'] = statusStrings.get(item['action']) + + provider = get_provider_class(GenericProvider.make_id(item['provider'])) + d['provider'] = {} + if provider: + d['provider']['id'] = provider.get_id() + d['provider']['name'] = provider.name + d['provider']['imageName'] = provider.image_name() + + data.append(d) + + if not data: + return self._not_found('History data not found') + + if path_param: + if path_param not in data: + return self._bad_request('Invalid path parameter') + data = data[path_param] + + return self._ok(data=data) + + + def delete(self, identifier, **kwargs): + """Delete an alias.""" + identifier = self._parse(identifier) + if not identifier: + return self._bad_request('Invalid history id') + + cache_db_con = db.DBConnection('cache.db') + last_changes = cache_db_con.connection.total_changes + cache_db_con.action('DELETE FROM history WHERE row_id = ?', [identifier]) + if cache_db_con.connection.total_changes - last_changes <= 0: + return self._not_found('Alias not found') + + return self._no_content() diff --git a/medusa/server/core.py b/medusa/server/core.py index 0c5e68312c..a8d8d32496 100644 --- a/medusa/server/core.py +++ b/medusa/server/core.py @@ -23,6 +23,7 @@ from medusa.server.api.v2.base import BaseRequestHandler, NotFoundHandler from medusa.server.api.v2.config import ConfigHandler from medusa.server.api.v2.episodes import EpisodeHandler +from medusa.server.api.v2.history import HistoryHandler from medusa.server.api.v2.internal import InternalHandler from medusa.server.api.v2.log import LogHandler from medusa.server.api.v2.search import SearchHandler @@ -80,6 +81,9 @@ def get_apiv2_handlers(base): # Order: Most specific to most generic + # /api/v2/history + HistoryHandler.create_app_handler(base), + # /api/v2/search SearchHandler.create_app_handler(base), From 5b64decbea50f48ae3deebbfc0132eaf4f1c38bc Mon Sep 17 00:00:00 2001 From: P0psicles Date: Wed, 13 Nov 2019 19:43:27 +0100 Subject: [PATCH 02/87] Fix pagination for all history items. Fix pagination for when a series_slug is provided. --- medusa/server/api/v2/base.py | 4 ++-- medusa/server/api/v2/history.py | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/medusa/server/api/v2/base.py b/medusa/server/api/v2/base.py index bb0e98afb5..582d5434ea 100644 --- a/medusa/server/api/v2/base.py +++ b/medusa/server/api/v2/base.py @@ -425,10 +425,10 @@ def paginate_query(self, query, identifier, where=None, params=None): query += ' WHERE {identifier} > ?'.format(identifier=identifier) base_params = [] - params.append(arg_limit * arg_page) + params.append(arg_page - 1 * arg_limit or 1) if where and params: - query += ' AND '.join([where + ' = ? ' for where in sql_where]) + query += ' AND ' + ' AND '.join([item + ' = ? ' for item in where]) base_params += params query += ' LIMIT {limit}'.format(limit=arg_limit) diff --git a/medusa/server/api/v2/history.py b/medusa/server/api/v2/history.py index 1372c03bc4..f69bd55431 100644 --- a/medusa/server/api/v2/history.py +++ b/medusa/server/api/v2/history.py @@ -44,10 +44,11 @@ def get(self, series_slug, path_param): if not series_identifier: return self._bad_request('Invalid series') - sql_where += ['indexer_id', 'show_id'] + sql_base += ' WHERE indexer_id = ? AND showid = ?' params += [series_identifier.indexer.id, series_identifier.id] - - results = self.paginate_query(sql_base, 'rowid', sql_where, params) + results = db.DBConnection().select(sql_base, params) + else: + results = self.paginate_query(sql_base, 'rowid', sql_where, params) data = [] for item in results: From d8a52473b28e32a67c147747548926e859c470e6 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sat, 16 Nov 2019 10:48:25 +0100 Subject: [PATCH 03/87] Added store for history [WIP] --- themes-default/slim/src/components/snatch-selection.vue | 3 ++- themes-default/slim/src/store/modules/index.js | 1 + themes-default/slim/src/store/mutation-types.js | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/themes-default/slim/src/components/snatch-selection.vue b/themes-default/slim/src/components/snatch-selection.vue index 9fde46bb97..e77f0cb1c5 100644 --- a/themes-default/slim/src/components/snatch-selection.vue +++ b/themes-default/slim/src/components/snatch-selection.vue @@ -25,7 +25,8 @@ export default { computed: { ...mapState({ shows: state => state.shows.shows, - config: state => state.config + config: state => state.config, + history: state => state.history }), ...mapGetters({ show: 'getCurrentShow', diff --git a/themes-default/slim/src/store/modules/index.js b/themes-default/slim/src/store/modules/index.js index ba08c9f677..8b77331df9 100644 --- a/themes-default/slim/src/store/modules/index.js +++ b/themes-default/slim/src/store/modules/index.js @@ -3,6 +3,7 @@ export { default as clients } from './clients'; export { default as config } from './config'; export { default as consts } from './consts'; export { default as defaults } from './defaults'; +export { default as history } from './history'; export { default as metadata } from './metadata'; export { default as notifications } from './notifications'; export { default as notifiers } from './notifiers'; diff --git a/themes-default/slim/src/store/mutation-types.js b/themes-default/slim/src/store/mutation-types.js index 80ec36a2f0..e8c47e4175 100644 --- a/themes-default/slim/src/store/mutation-types.js +++ b/themes-default/slim/src/store/mutation-types.js @@ -16,6 +16,7 @@ const ADD_CONFIG = '⚙️ Config added to store'; const ADD_SHOW = '📺 Show added to store'; const ADD_SHOW_EPISODE = '📺 Shows season with episodes added to store'; const ADD_STATS = 'ℹ️ Statistics added to store'; +const ADD_HISTORY = '📺 History added to store'; export { LOGIN_PENDING, @@ -33,6 +34,7 @@ export { NOTIFICATIONS_ENABLED, NOTIFICATIONS_DISABLED, ADD_CONFIG, + ADD_HISTORY, ADD_SHOW, ADD_SHOW_EPISODE, ADD_STATS From e55135fdf29cfdf800db846a4546242b228e1ccd Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sat, 16 Nov 2019 10:48:56 +0100 Subject: [PATCH 04/87] Add history.js --- .../slim/src/store/modules/history.js | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 themes-default/slim/src/store/modules/history.js diff --git a/themes-default/slim/src/store/modules/history.js b/themes-default/slim/src/store/modules/history.js new file mode 100644 index 0000000000..36a4b5221f --- /dev/null +++ b/themes-default/slim/src/store/modules/history.js @@ -0,0 +1,98 @@ +import Vue from 'vue'; + +import { api } from '../../api'; +import { ADD_HISTORY } from '../mutation-types'; + +const state = { + history: [] +}; + +const mutations = { + [ADD_HISTORY](state, history) { + // Maybe we can just check the last id. And if the id's are newer, add them. Less fancy, much more fast. + const existingHistory = state.history.find(row => history.id === row.id); + + if (!existingHistory) { + state.history.push(history); + return; + } + + // Merge new show object over old one + // this allows detailed queries to update the record + // without the non-detailed removing the extra data + const newHistory = { + ...existingHistory, + ...history + }; + + // Update state + Vue.set(state.shows, state.shows.indexOf(existingHistory), newHistory); + } +}; + +const getters = { + getShowHistoryBySlug: state => showSlug => state.history.find(history => history.series === showSlug) +}; + +/** + * An object representing request parameters for getting a show from the API. + * + * @typedef {object} ShowGetParameters + * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering) + * @property {boolean} episodes Fetch seasons & episodes? + */ + +const actions = { + /** + * Get show from API and commit it to the store. + * + * @param {*} context The store context. + * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters. + * @returns {Promise} The API response. + */ + getShowHistory(context, { slug }) { + return new Promise((resolve, reject) => { + const { commit } = context; + + api.get(`/history/${slug}`) + .then(res => { + commit(ADD_HISTORY, res.data); + resolve(res.data); + }) + .catch(error => { + reject(error); + }); + }); + }, + /** + * Get shows from API and commit them to the store. + * + * @param {*} context - The store context. + * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows. + * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not. + */ + async getHistory(context) { + const { commit } = context; + const limit = 1000; + + let lastPage = false; + let response = null; + while (lastPage) { + response = await api.get(`/history`); // No way around this. + response.data.forEach(history => { + commit(ADD_HISTORY, history); + }); + + if (response.data.length < limit) { + lastPage = true; + } + } + } +}; + +export default { + state, + mutations, + getters, + actions +}; From 58c3408fb26e31158c2676f6708afcacad717b9a Mon Sep 17 00:00:00 2001 From: P0psicles Date: Mon, 18 Nov 2019 11:47:48 +0100 Subject: [PATCH 05/87] Use a data_generator for the history pagination. * update history.js store, to get entire history. --- medusa/server/api/v2/history.py | 59 +++++++++---------- .../slim/src/components/snatch-selection.vue | 6 +- themes-default/slim/src/store/index.js | 2 + .../slim/src/store/modules/history.js | 39 +++++------- themes/dark/assets/js/medusa-runtime.js | 24 ++++++-- themes/light/assets/js/medusa-runtime.js | 24 ++++++-- 6 files changed, 86 insertions(+), 68 deletions(-) diff --git a/medusa/server/api/v2/history.py b/medusa/server/api/v2/history.py index f69bd55431..e02dbb152c 100644 --- a/medusa/server/api/v2/history.py +++ b/medusa/server/api/v2/history.py @@ -34,11 +34,13 @@ def get(self, series_slug, path_param): provider, version, resource, size, indexer_id, showid, season, episode FROM history + ORDER BY date DESC ''' - - sql_where = [] params = [] + arg_page = self._get_page() + arg_limit = self._get_limit(default=50) + if series_slug is not None: series_identifier = SeriesIdentifier.from_slug(series_slug) if not series_identifier: @@ -46,43 +48,40 @@ def get(self, series_slug, path_param): sql_base += ' WHERE indexer_id = ? AND showid = ?' params += [series_identifier.indexer.id, series_identifier.id] - results = db.DBConnection().select(sql_base, params) - else: - results = self.paginate_query(sql_base, 'rowid', sql_where, params) - data = [] - for item in results: - d = {} - d['id'] = item['rowid'] + results = db.DBConnection().select(sql_base, params) - if item['indexer_id'] and item['showid']: - d['series'] = SeriesIdentifier.from_id(item['indexer_id'], item['showid']).slug + def data_generator(): + """Read log lines based on the specified criteria.""" + start = arg_limit * (arg_page - 1) + 1 - d['status'] = item['action'] - d['actionDate'] = item['date'] + for item in results[start - 1:start - 1 + arg_limit]: + d = {} + d['id'] = item['rowid'] - d['resource'] = basename(item['resource']) - d['size'] = item['size'] - d['statusName'] = statusStrings.get(item['action']) + if item['indexer_id'] and item['showid']: + d['series'] = SeriesIdentifier.from_id(item['indexer_id'], item['showid']).slug - provider = get_provider_class(GenericProvider.make_id(item['provider'])) - d['provider'] = {} - if provider: - d['provider']['id'] = provider.get_id() - d['provider']['name'] = provider.name - d['provider']['imageName'] = provider.image_name() + d['status'] = item['action'] + d['actionDate'] = item['date'] - data.append(d) + d['resource'] = basename(item['resource']) + d['size'] = item['size'] + d['statusName'] = statusStrings.get(item['action']) - if not data: - return self._not_found('History data not found') + provider = get_provider_class(GenericProvider.make_id(item['provider'])) + d['provider'] = {} + if provider: + d['provider']['id'] = provider.get_id() + d['provider']['name'] = provider.name + d['provider']['imageName'] = provider.image_name() - if path_param: - if path_param not in data: - return self._bad_request('Invalid path parameter') - data = data[path_param] + yield d + + if not len(results): + return self._not_found('History data not found') - return self._ok(data=data) + return self._paginate(data_generator=data_generator) def delete(self, identifier, **kwargs): diff --git a/themes-default/slim/src/components/snatch-selection.vue b/themes-default/slim/src/components/snatch-selection.vue index e77f0cb1c5..da635a7efa 100644 --- a/themes-default/slim/src/components/snatch-selection.vue +++ b/themes-default/slim/src/components/snatch-selection.vue @@ -48,7 +48,8 @@ export default { }, methods: { ...mapActions({ - getShow: 'getShow' // Map `this.getShow()` to `this.$store.dispatch('getShow')` + getShow: 'getShow', // Map `this.getShow()` to `this.$store.dispatch('getShow')` + getHistory: 'getHistory' }), /** * Attaches IMDB tooltip, @@ -96,6 +97,7 @@ export default { }, mounted() { const { + getHistory, indexer, id, show, @@ -109,6 +111,8 @@ export default { id }); + getHistory(); + // We need the show info, so let's get it. if (!show || !show.id.slug) { getShow({ id, indexer, detailed: false }); diff --git a/themes-default/slim/src/store/index.js b/themes-default/slim/src/store/index.js index 84fa7ba09e..88fd964bca 100644 --- a/themes-default/slim/src/store/index.js +++ b/themes-default/slim/src/store/index.js @@ -7,6 +7,7 @@ import { config, consts, defaults, + history, metadata, notifications, notifiers, @@ -34,6 +35,7 @@ const store = new Store({ config, consts, defaults, + history, metadata, notifications, notifiers, diff --git a/themes-default/slim/src/store/modules/history.js b/themes-default/slim/src/store/modules/history.js index 36a4b5221f..d876a67471 100644 --- a/themes-default/slim/src/store/modules/history.js +++ b/themes-default/slim/src/store/modules/history.js @@ -4,29 +4,14 @@ import { api } from '../../api'; import { ADD_HISTORY } from '../mutation-types'; const state = { - history: [] + history: [], + page: 0 }; const mutations = { [ADD_HISTORY](state, history) { - // Maybe we can just check the last id. And if the id's are newer, add them. Less fancy, much more fast. - const existingHistory = state.history.find(row => history.id === row.id); - - if (!existingHistory) { - state.history.push(history); - return; - } - - // Merge new show object over old one - // this allows detailed queries to update the record - // without the non-detailed removing the extra data - const newHistory = { - ...existingHistory, - ...history - }; - // Update state - Vue.set(state.shows, state.shows.indexOf(existingHistory), newHistory); + state.history.push(...history); } }; @@ -65,23 +50,27 @@ const actions = { }); }, /** - * Get shows from API and commit them to the store. + * Get history from API and commit them to the store. * * @param {*} context - The store context. * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows. * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not. */ async getHistory(context) { - const { commit } = context; + const { commit, state } = context; const limit = 1000; + const params = { limit }; let lastPage = false; let response = null; - while (lastPage) { - response = await api.get(`/history`); // No way around this. - response.data.forEach(history => { - commit(ADD_HISTORY, history); - }); + while (!lastPage) { + state.page += 1; + params.page = state.page; + response = await api.get(`/history`, { params }); // No way around this. + // response.data.forEach(history => { + // commit(ADD_HISTORY, history); + // }); + commit(ADD_HISTORY, response.data); if (response.data.length < limit) { lastPage = true; diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index 858b508d8c..02c455065c 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -452,7 +452,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config\n }), {}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired'\n }), {\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return Number(this.$route.query.season) || undefined;\n },\n\n episode() {\n return Number(this.$route.query.episode) || undefined;\n }\n\n }),\n methods: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getShow: 'getShow' // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n\n }), {\n /**\n * Attaches IMDB tooltip,\n */\n reflowLayout() {\n attachImdbTooltip(); // eslint-disable-line no-undef\n },\n\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (this.$store.state.search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n /** Disabled for now. Because global + series ignored can be concatenated or excluded. So it's not that simple to color them. */\n // if (this.show.config.release.ignoredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-ignored');\n // }\n // if (this.show.config.release.requiredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-required');\n // }\n\n\n return classes.join(' ');\n }\n\n }),\n\n mounted() {\n const {\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n }); // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n }\n\n this.$watch('show', () => {\n this.$nextTick(() => this.reflowLayout());\n });\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.reflowLayout();\n });\n });\n\n const updateSpinner = function updateSpinner(message, showSpinner) {\n // Get spinner object as needed\n const spinner = $('#searchNotification');\n\n if (showSpinner) {\n message = ' ' + message;\n }\n\n $(spinner).empty().append(message);\n }; // Check the previous status of the history table, for hidden or shown, through the data attribute\n // data-history-toggle-hidden\n\n\n function toggleHistoryTable() {\n // eslint-disable-line no-unused-vars\n // Get previous state which was saved on the wrapper\n const showOrHide = $('#wrapper').attr('data-history-toggle');\n $('#historydata').collapse(showOrHide);\n }\n\n $.fn.loadContainer = function (path, loadingTxt, errorTxt, callback) {\n updateSpinner(loadingTxt);\n $('#manualSearchMeta').load(path + ' #manualSearchMeta meta');\n $(this).load(path + ' #manualSearchTbody tr', (response, status) => {\n if (status === 'error') {\n updateSpinner(errorTxt, false);\n }\n\n if (typeof callback !== 'undefined') {\n callback();\n }\n });\n }; // Click event for the download button for snatching a result\n\n\n $(document.body).on('click', '.epManualSearch', event => {\n event.preventDefault();\n const link = event.currentTarget;\n $(link).children('img').prop('src', 'images/loading16.gif');\n $.getJSON(event.currentTarget.href, data => {\n if (data.result === 'success') {\n $(link).children('img').prop('src', 'images/save.png');\n } else {\n $(link).children('img').prop('src', 'images/no16.png');\n }\n });\n });\n\n function initTableSorter(table) {\n // Nasty hack to re-initialize tablesorter after refresh\n $(table).tablesorter({\n widgets: ['saveSort', 'stickyHeaders', 'columnSelector', 'filter'],\n widgetOptions: {\n filter_columnFilters: true,\n // eslint-disable-line camelcase\n filter_hideFilters: true,\n // eslint-disable-line camelcase\n filter_saveFilters: true,\n // eslint-disable-line camelcase\n columnSelector_saveColumns: true,\n // eslint-disable-line camelcase\n columnSelector_layout: '',\n // eslint-disable-line camelcase\n columnSelector_mediaquery: false,\n // eslint-disable-line camelcase\n columnSelector_cssChecked: 'checked' // eslint-disable-line camelcase\n\n },\n textExtraction: function () {\n return {\n // 2: Provider\n 2(node) {\n return $(node).find('img').attr('title');\n },\n\n // 6: The size column needs an explicit field for the filtering on raw size.\n 6(node) {\n return node.getAttribute('data-size');\n },\n\n // 9: Published date\n 9(node) {\n return node.getAttribute('data-datetime');\n },\n\n // 10: Added date\n 10(node) {\n return node.getAttribute('data-datetime');\n }\n\n };\n }(),\n headers: {\n 9: {\n sorter: 'realISODate'\n },\n // Published\n 10: {\n sorter: 'realISODate'\n },\n // Added\n 11: {\n sorter: false,\n parser: false\n } // Snatch link\n\n }\n });\n }\n\n function checkCacheUpdates(repeat) {\n let pollInterval = 5000;\n repeat = repeat || true;\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const data = $('meta[data-last-prov-updates]').data('last-prov-updates');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + \" indexerName: \".concat(indexerName, \", seriesId: \").concat(seriesId, \", season: \").concat(season, \", episode: \").concat(episode));\n return;\n }\n\n let urlParams = '?indexername=' + indexerName + '&seriesid=' + seriesId + '&season=' + season + '&episode=' + episode;\n\n if (manualSearchType === 'season') {\n urlParams += '&manual_search_type=' + manualSearchType;\n }\n\n if (!$.isNumeric(seriesId) || !$.isNumeric(season) || !$.isNumeric(episode)) {\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 200);\n }\n\n $.ajax({\n url: 'home/manualSearchCheckCache' + urlParams,\n type: 'GET',\n data,\n contentType: 'application/json',\n\n error() {\n // Repeat = false;\n console.log('Error occurred!!');\n $('.manualSearchButton').removeAttr('disabled');\n },\n\n complete() {\n if (repeat) {\n setTimeout(checkCacheUpdates, pollInterval);\n }\n },\n\n timeout: 15000 // Timeout after 15s\n\n }).done(data => {\n // @TODO: Combine the lower if statements\n if (data === '') {\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n }\n\n if (data.result === 'refresh') {\n window.location.reload();\n updateSpinner('Refreshed results...', true);\n }\n\n if (data.result === 'searching') {\n // Ep is searched, you will get a results any minute now\n pollInterval = 5000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode is being searched, please wait......', true);\n }\n\n if (data.result === 'queued') {\n // Ep is queued, this might take some time to get results\n pollInterval = 7000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode has been queued, because another search is taking place. please wait..', true);\n }\n\n if (data.result === 'finished') {\n // Ep search is finished\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n $('#srchresults').trigger('update', true);\n $('[datetime]').timeago();\n }\n\n if (data.result === 'error') {\n // Ep search is finished but with an error\n console.log('Probably tried to call manualSelectCheckCache, while page was being refreshed.');\n $('.manualSearchButton').removeAttr('disabled');\n repeat = true;\n }\n });\n }\n\n setTimeout(checkCacheUpdates, 2000); // Click event for the reload results and force search buttons\n\n $(document.body).on('click', '.manualSearchButton', event => {\n event.preventDefault();\n $('.manualSearchButton').prop('disabled', true);\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const forceSearch = $(event.currentTarget).attr('data-force-search');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + \" indexerName: \".concat(indexerName, \", seriesId: \").concat(seriesId, \", season: \").concat(season, \", episode: \").concat(episode));\n return;\n }\n\n if ($.isNumeric(seriesId) && $.isNumeric(season) && $.isNumeric(episode)) {\n updateSpinner('Started a forced manual search...', true);\n $.getJSON('home/snatchSelection', {\n indexername: indexerName,\n seriesid: seriesId,\n season,\n episode,\n manual_search_type: manualSearchType,\n // eslint-disable-line camelcase\n perform_search: forceSearch // eslint-disable-line camelcase\n\n }); // Force the search, but give the checkCacheUpdates the time to start up a search thread\n\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 2000);\n }\n }); // Moved and rewritten this from displayShow. This changes the button when clicked for collapsing/expanding the\n // \"Show History\" button to show or hide the snatch/download/failed history for a manual searched episode or pack.\n\n $('#popover').popover({\n placement: 'bottom',\n html: true,\n // Required if content has HTML\n content: '
'\n }).on('shown.bs.popover', () => {\n // Bootstrap popover event triggered when the popover opens\n $.tablesorter.columnSelector.attachTo($('#srchresults'), '#popover-target');\n });\n $('#btnReset').click(() => {\n $('#showTable').trigger('saveSortReset') // Clear saved sort\n .trigger('sortReset'); // Reset current table sort\n\n return false;\n });\n initTableSorter('#srchresults');\n this.reflowLayout();\n $('body').on('hide.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Show History');\n $('#wrapper').prop('data-history-toggle', 'hide');\n });\n $('body').on('show.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Hide History');\n $('#wrapper').prop('data-history-toggle', 'show');\n });\n $(document.body).on('click', '.release-name-ellipses, .release-name-ellipses-toggled', event => {\n const target = $(event.currentTarget);\n\n if (target.hasClass('release-name-ellipses')) {\n target.switchClass('release-name-ellipses', 'release-name-ellipses-toggled', 100);\n } else {\n target.switchClass('release-name-ellipses-toggled', 'release-name-ellipses', 100);\n }\n });\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config,\n history: state => state.history\n }), {}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired'\n }), {\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return Number(this.$route.query.season) || undefined;\n },\n\n episode() {\n return Number(this.$route.query.episode) || undefined;\n }\n\n }),\n methods: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getHistory: 'getHistory'\n }), {\n /**\n * Attaches IMDB tooltip,\n */\n reflowLayout() {\n attachImdbTooltip(); // eslint-disable-line no-undef\n },\n\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (this.$store.state.search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n /** Disabled for now. Because global + series ignored can be concatenated or excluded. So it's not that simple to color them. */\n // if (this.show.config.release.ignoredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-ignored');\n // }\n // if (this.show.config.release.requiredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-required');\n // }\n\n\n return classes.join(' ');\n }\n\n }),\n\n mounted() {\n const {\n getHistory,\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n });\n getHistory(); // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n }\n\n this.$watch('show', () => {\n this.$nextTick(() => this.reflowLayout());\n });\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.reflowLayout();\n });\n });\n\n const updateSpinner = function updateSpinner(message, showSpinner) {\n // Get spinner object as needed\n const spinner = $('#searchNotification');\n\n if (showSpinner) {\n message = ' ' + message;\n }\n\n $(spinner).empty().append(message);\n }; // Check the previous status of the history table, for hidden or shown, through the data attribute\n // data-history-toggle-hidden\n\n\n function toggleHistoryTable() {\n // eslint-disable-line no-unused-vars\n // Get previous state which was saved on the wrapper\n const showOrHide = $('#wrapper').attr('data-history-toggle');\n $('#historydata').collapse(showOrHide);\n }\n\n $.fn.loadContainer = function (path, loadingTxt, errorTxt, callback) {\n updateSpinner(loadingTxt);\n $('#manualSearchMeta').load(path + ' #manualSearchMeta meta');\n $(this).load(path + ' #manualSearchTbody tr', (response, status) => {\n if (status === 'error') {\n updateSpinner(errorTxt, false);\n }\n\n if (typeof callback !== 'undefined') {\n callback();\n }\n });\n }; // Click event for the download button for snatching a result\n\n\n $(document.body).on('click', '.epManualSearch', event => {\n event.preventDefault();\n const link = event.currentTarget;\n $(link).children('img').prop('src', 'images/loading16.gif');\n $.getJSON(event.currentTarget.href, data => {\n if (data.result === 'success') {\n $(link).children('img').prop('src', 'images/save.png');\n } else {\n $(link).children('img').prop('src', 'images/no16.png');\n }\n });\n });\n\n function initTableSorter(table) {\n // Nasty hack to re-initialize tablesorter after refresh\n $(table).tablesorter({\n widgets: ['saveSort', 'stickyHeaders', 'columnSelector', 'filter'],\n widgetOptions: {\n filter_columnFilters: true,\n // eslint-disable-line camelcase\n filter_hideFilters: true,\n // eslint-disable-line camelcase\n filter_saveFilters: true,\n // eslint-disable-line camelcase\n columnSelector_saveColumns: true,\n // eslint-disable-line camelcase\n columnSelector_layout: '',\n // eslint-disable-line camelcase\n columnSelector_mediaquery: false,\n // eslint-disable-line camelcase\n columnSelector_cssChecked: 'checked' // eslint-disable-line camelcase\n\n },\n textExtraction: function () {\n return {\n // 2: Provider\n 2(node) {\n return $(node).find('img').attr('title');\n },\n\n // 6: The size column needs an explicit field for the filtering on raw size.\n 6(node) {\n return node.getAttribute('data-size');\n },\n\n // 9: Published date\n 9(node) {\n return node.getAttribute('data-datetime');\n },\n\n // 10: Added date\n 10(node) {\n return node.getAttribute('data-datetime');\n }\n\n };\n }(),\n headers: {\n 9: {\n sorter: 'realISODate'\n },\n // Published\n 10: {\n sorter: 'realISODate'\n },\n // Added\n 11: {\n sorter: false,\n parser: false\n } // Snatch link\n\n }\n });\n }\n\n function checkCacheUpdates(repeat) {\n let pollInterval = 5000;\n repeat = repeat || true;\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const data = $('meta[data-last-prov-updates]').data('last-prov-updates');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + \" indexerName: \".concat(indexerName, \", seriesId: \").concat(seriesId, \", season: \").concat(season, \", episode: \").concat(episode));\n return;\n }\n\n let urlParams = '?indexername=' + indexerName + '&seriesid=' + seriesId + '&season=' + season + '&episode=' + episode;\n\n if (manualSearchType === 'season') {\n urlParams += '&manual_search_type=' + manualSearchType;\n }\n\n if (!$.isNumeric(seriesId) || !$.isNumeric(season) || !$.isNumeric(episode)) {\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 200);\n }\n\n $.ajax({\n url: 'home/manualSearchCheckCache' + urlParams,\n type: 'GET',\n data,\n contentType: 'application/json',\n\n error() {\n // Repeat = false;\n console.log('Error occurred!!');\n $('.manualSearchButton').removeAttr('disabled');\n },\n\n complete() {\n if (repeat) {\n setTimeout(checkCacheUpdates, pollInterval);\n }\n },\n\n timeout: 15000 // Timeout after 15s\n\n }).done(data => {\n // @TODO: Combine the lower if statements\n if (data === '') {\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n }\n\n if (data.result === 'refresh') {\n window.location.reload();\n updateSpinner('Refreshed results...', true);\n }\n\n if (data.result === 'searching') {\n // Ep is searched, you will get a results any minute now\n pollInterval = 5000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode is being searched, please wait......', true);\n }\n\n if (data.result === 'queued') {\n // Ep is queued, this might take some time to get results\n pollInterval = 7000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode has been queued, because another search is taking place. please wait..', true);\n }\n\n if (data.result === 'finished') {\n // Ep search is finished\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n $('#srchresults').trigger('update', true);\n $('[datetime]').timeago();\n }\n\n if (data.result === 'error') {\n // Ep search is finished but with an error\n console.log('Probably tried to call manualSelectCheckCache, while page was being refreshed.');\n $('.manualSearchButton').removeAttr('disabled');\n repeat = true;\n }\n });\n }\n\n setTimeout(checkCacheUpdates, 2000); // Click event for the reload results and force search buttons\n\n $(document.body).on('click', '.manualSearchButton', event => {\n event.preventDefault();\n $('.manualSearchButton').prop('disabled', true);\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const forceSearch = $(event.currentTarget).attr('data-force-search');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + \" indexerName: \".concat(indexerName, \", seriesId: \").concat(seriesId, \", season: \").concat(season, \", episode: \").concat(episode));\n return;\n }\n\n if ($.isNumeric(seriesId) && $.isNumeric(season) && $.isNumeric(episode)) {\n updateSpinner('Started a forced manual search...', true);\n $.getJSON('home/snatchSelection', {\n indexername: indexerName,\n seriesid: seriesId,\n season,\n episode,\n manual_search_type: manualSearchType,\n // eslint-disable-line camelcase\n perform_search: forceSearch // eslint-disable-line camelcase\n\n }); // Force the search, but give the checkCacheUpdates the time to start up a search thread\n\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 2000);\n }\n }); // Moved and rewritten this from displayShow. This changes the button when clicked for collapsing/expanding the\n // \"Show History\" button to show or hide the snatch/download/failed history for a manual searched episode or pack.\n\n $('#popover').popover({\n placement: 'bottom',\n html: true,\n // Required if content has HTML\n content: '
'\n }).on('shown.bs.popover', () => {\n // Bootstrap popover event triggered when the popover opens\n $.tablesorter.columnSelector.attachTo($('#srchresults'), '#popover-target');\n });\n $('#btnReset').click(() => {\n $('#showTable').trigger('saveSortReset') // Clear saved sort\n .trigger('sortReset'); // Reset current table sort\n\n return false;\n });\n initTableSorter('#srchresults');\n this.reflowLayout();\n $('body').on('hide.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Show History');\n $('#wrapper').prop('data-history-toggle', 'hide');\n });\n $('body').on('show.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Hide History');\n $('#wrapper').prop('data-history-toggle', 'show');\n });\n $(document.body).on('click', '.release-name-ellipses, .release-name-ellipses-toggled', event => {\n const target = $(event.currentTarget);\n\n if (target.hasClass('release-name-ellipses')) {\n target.switchClass('release-name-ellipses', 'release-name-ellipses-toggled', 100);\n } else {\n target.switchClass('release-name-ellipses-toggled', 'release-name-ellipses', 100);\n }\n });\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -3192,7 +3192,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-native-websocket */ \"./node_modules/vue-native-websocket/dist/build.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _modules__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules */ \"./src/store/modules/index.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vuex__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\nconst store = new vuex__WEBPACK_IMPORTED_MODULE_1__[\"Store\"]({\n modules: {\n auth: _modules__WEBPACK_IMPORTED_MODULE_3__[\"auth\"],\n clients: _modules__WEBPACK_IMPORTED_MODULE_3__[\"clients\"],\n config: _modules__WEBPACK_IMPORTED_MODULE_3__[\"config\"],\n consts: _modules__WEBPACK_IMPORTED_MODULE_3__[\"consts\"],\n defaults: _modules__WEBPACK_IMPORTED_MODULE_3__[\"defaults\"],\n metadata: _modules__WEBPACK_IMPORTED_MODULE_3__[\"metadata\"],\n notifications: _modules__WEBPACK_IMPORTED_MODULE_3__[\"notifications\"],\n notifiers: _modules__WEBPACK_IMPORTED_MODULE_3__[\"notifiers\"],\n search: _modules__WEBPACK_IMPORTED_MODULE_3__[\"search\"],\n shows: _modules__WEBPACK_IMPORTED_MODULE_3__[\"shows\"],\n socket: _modules__WEBPACK_IMPORTED_MODULE_3__[\"socket\"],\n stats: _modules__WEBPACK_IMPORTED_MODULE_3__[\"stats\"],\n system: _modules__WEBPACK_IMPORTED_MODULE_3__[\"system\"]\n },\n state: {},\n mutations: {},\n getters: {},\n actions: {}\n}); // Keep as a non-arrow function for `this` context.\n\nconst passToStoreHandler = function passToStoreHandler(eventName, event, next) {\n const target = eventName.toUpperCase();\n const eventData = event.data;\n\n if (target === 'SOCKET_ONMESSAGE') {\n const message = JSON.parse(eventData);\n const {\n data,\n event\n } = message; // Show the notification to the user\n\n if (event === 'notification') {\n const {\n body,\n hash,\n type,\n title\n } = data;\n window.displayNotification(type, title, body, hash);\n } else if (event === 'configUpdated') {\n const {\n section,\n config\n } = data;\n this.store.dispatch('updateConfig', {\n section,\n config\n });\n } else if (event === 'showUpdated') {\n this.store.dispatch('updateShow', data);\n } else {\n window.displayNotification('info', event, data);\n }\n } // Resume normal 'passToStore' handling\n\n\n next(eventName, event);\n};\n\nconst websocketUrl = (() => {\n const {\n protocol,\n host\n } = window.location;\n const proto = protocol === 'https:' ? 'wss:' : 'ws:';\n const WSMessageUrl = '/ui';\n const webRoot = document.body.getAttribute('web-root');\n return \"\".concat(proto, \"//\").concat(host).concat(webRoot, \"/ws\").concat(WSMessageUrl);\n})();\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default.a, websocketUrl, {\n store,\n format: 'json',\n reconnection: true,\n // (Boolean) whether to reconnect automatically (false)\n reconnectionAttempts: 2,\n // (Number) number of reconnection attempts before giving up (Infinity),\n reconnectionDelay: 1000,\n // (Number) how long to initially wait before attempting a new (1000)\n passToStoreHandler,\n // (Function|) Handler for events triggered by the WebSocket (false)\n mutations: {\n SOCKET_ONOPEN: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONOPEN\"],\n SOCKET_ONCLOSE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONCLOSE\"],\n SOCKET_ONERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONERROR\"],\n SOCKET_ONMESSAGE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONMESSAGE\"],\n SOCKET_RECONNECT: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT\"],\n SOCKET_RECONNECT_ERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT_ERROR\"]\n }\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (store);\n\n//# sourceURL=webpack:///./src/store/index.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 vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-native-websocket */ \"./node_modules/vue-native-websocket/dist/build.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _modules__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules */ \"./src/store/modules/index.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vuex__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\nconst store = new vuex__WEBPACK_IMPORTED_MODULE_1__[\"Store\"]({\n modules: {\n auth: _modules__WEBPACK_IMPORTED_MODULE_3__[\"auth\"],\n clients: _modules__WEBPACK_IMPORTED_MODULE_3__[\"clients\"],\n config: _modules__WEBPACK_IMPORTED_MODULE_3__[\"config\"],\n consts: _modules__WEBPACK_IMPORTED_MODULE_3__[\"consts\"],\n defaults: _modules__WEBPACK_IMPORTED_MODULE_3__[\"defaults\"],\n history: _modules__WEBPACK_IMPORTED_MODULE_3__[\"history\"],\n metadata: _modules__WEBPACK_IMPORTED_MODULE_3__[\"metadata\"],\n notifications: _modules__WEBPACK_IMPORTED_MODULE_3__[\"notifications\"],\n notifiers: _modules__WEBPACK_IMPORTED_MODULE_3__[\"notifiers\"],\n search: _modules__WEBPACK_IMPORTED_MODULE_3__[\"search\"],\n shows: _modules__WEBPACK_IMPORTED_MODULE_3__[\"shows\"],\n socket: _modules__WEBPACK_IMPORTED_MODULE_3__[\"socket\"],\n stats: _modules__WEBPACK_IMPORTED_MODULE_3__[\"stats\"],\n system: _modules__WEBPACK_IMPORTED_MODULE_3__[\"system\"]\n },\n state: {},\n mutations: {},\n getters: {},\n actions: {}\n}); // Keep as a non-arrow function for `this` context.\n\nconst passToStoreHandler = function passToStoreHandler(eventName, event, next) {\n const target = eventName.toUpperCase();\n const eventData = event.data;\n\n if (target === 'SOCKET_ONMESSAGE') {\n const message = JSON.parse(eventData);\n const {\n data,\n event\n } = message; // Show the notification to the user\n\n if (event === 'notification') {\n const {\n body,\n hash,\n type,\n title\n } = data;\n window.displayNotification(type, title, body, hash);\n } else if (event === 'configUpdated') {\n const {\n section,\n config\n } = data;\n this.store.dispatch('updateConfig', {\n section,\n config\n });\n } else if (event === 'showUpdated') {\n this.store.dispatch('updateShow', data);\n } else {\n window.displayNotification('info', event, data);\n }\n } // Resume normal 'passToStore' handling\n\n\n next(eventName, event);\n};\n\nconst websocketUrl = (() => {\n const {\n protocol,\n host\n } = window.location;\n const proto = protocol === 'https:' ? 'wss:' : 'ws:';\n const WSMessageUrl = '/ui';\n const webRoot = document.body.getAttribute('web-root');\n return \"\".concat(proto, \"//\").concat(host).concat(webRoot, \"/ws\").concat(WSMessageUrl);\n})();\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default.a, websocketUrl, {\n store,\n format: 'json',\n reconnection: true,\n // (Boolean) whether to reconnect automatically (false)\n reconnectionAttempts: 2,\n // (Number) number of reconnection attempts before giving up (Infinity),\n reconnectionDelay: 1000,\n // (Number) how long to initially wait before attempting a new (1000)\n passToStoreHandler,\n // (Function|) Handler for events triggered by the WebSocket (false)\n mutations: {\n SOCKET_ONOPEN: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONOPEN\"],\n SOCKET_ONCLOSE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONCLOSE\"],\n SOCKET_ONERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONERROR\"],\n SOCKET_ONMESSAGE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONMESSAGE\"],\n SOCKET_RECONNECT: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT\"],\n SOCKET_RECONNECT_ERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT_ERROR\"]\n }\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (store);\n\n//# sourceURL=webpack:///./src/store/index.js?"); /***/ }), @@ -3256,15 +3256,27 @@ eval("__webpack_require__.r(__webpack_exports__);\nconst state = {\n show: {\n /***/ }), +/***/ "./src/store/modules/history.js": +/*!**************************************!*\ + !*** ./src/store/modules/history.js ***! + \**************************************/ +/*! exports provided: default */ +/***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n history: [],\n page: 0\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"]](state, history) {\n // Update state\n state.history.push(...history);\n }\n\n};\nconst getters = {\n getShowHistoryBySlug: state => showSlug => state.history.find(history => history.series === showSlug)\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n getShowHistory(context, {\n slug\n }) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(\"/history/\".concat(slug)).then(res => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"], res.data);\n resolve(res.data);\n }).catch(error => {\n reject(error);\n });\n });\n },\n\n /**\n * Get history from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n async getHistory(context) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit\n };\n let lastPage = false;\n let response = null;\n\n while (!lastPage) {\n state.page += 1;\n params.page = state.page;\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(\"/history\", {\n params\n }); // No way around this.\n // response.data.forEach(history => {\n // commit(ADD_HISTORY, history);\n // });\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"], response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n }\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/history.js?"); + +/***/ }), + /***/ "./src/store/modules/index.js": /*!************************************!*\ !*** ./src/store/modules/index.js ***! \************************************/ -/*! exports provided: auth, clients, config, consts, defaults, metadata, notifications, notifiers, search, shows, socket, stats, system */ +/*! exports provided: auth, clients, config, consts, defaults, history, metadata, notifications, notifiers, search, shows, socket, stats, system */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./auth */ \"./src/store/modules/auth.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"auth\", function() { return _auth__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _clients__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./clients */ \"./src/store/modules/clients.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"clients\", function() { return _clients__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./config */ \"./src/store/modules/config.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"config\", function() { return _config__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _consts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./consts */ \"./src/store/modules/consts.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"consts\", function() { return _consts__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _defaults__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./defaults */ \"./src/store/modules/defaults.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defaults\", function() { return _defaults__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _metadata__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./metadata */ \"./src/store/modules/metadata.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"metadata\", function() { return _metadata__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony import */ var _notifications__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./notifications */ \"./src/store/modules/notifications.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"notifications\", function() { return _notifications__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony import */ var _notifiers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./notifiers */ \"./src/store/modules/notifiers/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"notifiers\", function() { return _notifiers__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony import */ var _search__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./search */ \"./src/store/modules/search.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"search\", function() { return _search__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony import */ var _shows__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./shows */ \"./src/store/modules/shows.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"shows\", function() { return _shows__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony import */ var _socket__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./socket */ \"./src/store/modules/socket.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"socket\", function() { return _socket__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* harmony import */ var _stats__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./stats */ \"./src/store/modules/stats.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"stats\", function() { return _stats__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./system */ \"./src/store/modules/system.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"system\", function() { return _system__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./src/store/modules/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./auth */ \"./src/store/modules/auth.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"auth\", function() { return _auth__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _clients__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./clients */ \"./src/store/modules/clients.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"clients\", function() { return _clients__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./config */ \"./src/store/modules/config.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"config\", function() { return _config__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _consts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./consts */ \"./src/store/modules/consts.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"consts\", function() { return _consts__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _defaults__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./defaults */ \"./src/store/modules/defaults.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defaults\", function() { return _defaults__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./history */ \"./src/store/modules/history.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"history\", function() { return _history__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony import */ var _metadata__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./metadata */ \"./src/store/modules/metadata.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"metadata\", function() { return _metadata__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony import */ var _notifications__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./notifications */ \"./src/store/modules/notifications.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"notifications\", function() { return _notifications__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony import */ var _notifiers__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./notifiers */ \"./src/store/modules/notifiers/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"notifiers\", function() { return _notifiers__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony import */ var _search__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./search */ \"./src/store/modules/search.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"search\", function() { return _search__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony import */ var _shows__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./shows */ \"./src/store/modules/shows.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"shows\", function() { return _shows__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* harmony import */ var _socket__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./socket */ \"./src/store/modules/socket.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"socket\", function() { return _socket__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* harmony import */ var _stats__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./stats */ \"./src/store/modules/stats.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"stats\", function() { return _stats__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./system */ \"./src/store/modules/system.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"system\", function() { return _system__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./src/store/modules/index.js?"); /***/ }), @@ -3644,11 +3656,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /*!*************************************!*\ !*** ./src/store/mutation-types.js ***! \*************************************/ -/*! exports provided: LOGIN_PENDING, LOGIN_SUCCESS, LOGIN_FAILED, LOGOUT, REFRESH_TOKEN, REMOVE_AUTH_ERROR, SOCKET_ONOPEN, SOCKET_ONCLOSE, SOCKET_ONERROR, SOCKET_ONMESSAGE, SOCKET_RECONNECT, SOCKET_RECONNECT_ERROR, NOTIFICATIONS_ENABLED, NOTIFICATIONS_DISABLED, ADD_CONFIG, ADD_SHOW, ADD_SHOW_EPISODE, ADD_STATS */ +/*! exports provided: LOGIN_PENDING, LOGIN_SUCCESS, LOGIN_FAILED, LOGOUT, REFRESH_TOKEN, REMOVE_AUTH_ERROR, SOCKET_ONOPEN, SOCKET_ONCLOSE, SOCKET_ONERROR, SOCKET_ONMESSAGE, SOCKET_RECONNECT, SOCKET_RECONNECT_ERROR, NOTIFICATIONS_ENABLED, NOTIFICATIONS_DISABLED, ADD_CONFIG, ADD_HISTORY, ADD_SHOW, ADD_SHOW_EPISODE, ADD_STATS */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGIN_PENDING\", function() { return LOGIN_PENDING; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGIN_SUCCESS\", function() { return LOGIN_SUCCESS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGIN_FAILED\", function() { return LOGIN_FAILED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGOUT\", function() { return LOGOUT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"REFRESH_TOKEN\", function() { return REFRESH_TOKEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"REMOVE_AUTH_ERROR\", function() { return REMOVE_AUTH_ERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONOPEN\", function() { return SOCKET_ONOPEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONCLOSE\", function() { return SOCKET_ONCLOSE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONERROR\", function() { return SOCKET_ONERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONMESSAGE\", function() { return SOCKET_ONMESSAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_RECONNECT\", function() { return SOCKET_RECONNECT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_RECONNECT_ERROR\", function() { return SOCKET_RECONNECT_ERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NOTIFICATIONS_ENABLED\", function() { return NOTIFICATIONS_ENABLED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NOTIFICATIONS_DISABLED\", function() { return NOTIFICATIONS_DISABLED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_CONFIG\", function() { return ADD_CONFIG; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_SHOW\", function() { return ADD_SHOW; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_SHOW_EPISODE\", function() { return ADD_SHOW_EPISODE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_STATS\", function() { return ADD_STATS; });\nconst LOGIN_PENDING = '🔒 Logging in';\nconst LOGIN_SUCCESS = '🔒 ✅ Login Successful';\nconst LOGIN_FAILED = '🔒 ❌ Login Failed';\nconst LOGOUT = '🔒 Logout';\nconst REFRESH_TOKEN = '🔒 Refresh Token';\nconst REMOVE_AUTH_ERROR = '🔒 Remove Auth Error';\nconst SOCKET_ONOPEN = '🔗 ✅ WebSocket connected';\nconst SOCKET_ONCLOSE = '🔗 ❌ WebSocket disconnected';\nconst SOCKET_ONERROR = '🔗 ❌ WebSocket error';\nconst SOCKET_ONMESSAGE = '🔗 ✉️ 📥 WebSocket message received';\nconst SOCKET_RECONNECT = '🔗 🔃 WebSocket reconnecting';\nconst SOCKET_RECONNECT_ERROR = '🔗 🔃 ❌ WebSocket reconnection attempt failed';\nconst NOTIFICATIONS_ENABLED = '🔔 Notifications Enabled';\nconst NOTIFICATIONS_DISABLED = '🔔 Notifications Disabled';\nconst ADD_CONFIG = '⚙️ Config added to store';\nconst ADD_SHOW = '📺 Show added to store';\nconst ADD_SHOW_EPISODE = '📺 Shows season with episodes added to store';\nconst ADD_STATS = 'ℹ️ Statistics added to store';\n\n\n//# sourceURL=webpack:///./src/store/mutation-types.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGIN_PENDING\", function() { return LOGIN_PENDING; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGIN_SUCCESS\", function() { return LOGIN_SUCCESS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGIN_FAILED\", function() { return LOGIN_FAILED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGOUT\", function() { return LOGOUT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"REFRESH_TOKEN\", function() { return REFRESH_TOKEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"REMOVE_AUTH_ERROR\", function() { return REMOVE_AUTH_ERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONOPEN\", function() { return SOCKET_ONOPEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONCLOSE\", function() { return SOCKET_ONCLOSE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONERROR\", function() { return SOCKET_ONERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONMESSAGE\", function() { return SOCKET_ONMESSAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_RECONNECT\", function() { return SOCKET_RECONNECT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_RECONNECT_ERROR\", function() { return SOCKET_RECONNECT_ERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NOTIFICATIONS_ENABLED\", function() { return NOTIFICATIONS_ENABLED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NOTIFICATIONS_DISABLED\", function() { return NOTIFICATIONS_DISABLED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_CONFIG\", function() { return ADD_CONFIG; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_HISTORY\", function() { return ADD_HISTORY; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_SHOW\", function() { return ADD_SHOW; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_SHOW_EPISODE\", function() { return ADD_SHOW_EPISODE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_STATS\", function() { return ADD_STATS; });\nconst LOGIN_PENDING = '🔒 Logging in';\nconst LOGIN_SUCCESS = '🔒 ✅ Login Successful';\nconst LOGIN_FAILED = '🔒 ❌ Login Failed';\nconst LOGOUT = '🔒 Logout';\nconst REFRESH_TOKEN = '🔒 Refresh Token';\nconst REMOVE_AUTH_ERROR = '🔒 Remove Auth Error';\nconst SOCKET_ONOPEN = '🔗 ✅ WebSocket connected';\nconst SOCKET_ONCLOSE = '🔗 ❌ WebSocket disconnected';\nconst SOCKET_ONERROR = '🔗 ❌ WebSocket error';\nconst SOCKET_ONMESSAGE = '🔗 ✉️ 📥 WebSocket message received';\nconst SOCKET_RECONNECT = '🔗 🔃 WebSocket reconnecting';\nconst SOCKET_RECONNECT_ERROR = '🔗 🔃 ❌ WebSocket reconnection attempt failed';\nconst NOTIFICATIONS_ENABLED = '🔔 Notifications Enabled';\nconst NOTIFICATIONS_DISABLED = '🔔 Notifications Disabled';\nconst ADD_CONFIG = '⚙️ Config added to store';\nconst ADD_SHOW = '📺 Show added to store';\nconst ADD_SHOW_EPISODE = '📺 Shows season with episodes added to store';\nconst ADD_STATS = 'ℹ️ Statistics added to store';\nconst ADD_HISTORY = '📺 History added to store';\n\n\n//# sourceURL=webpack:///./src/store/mutation-types.js?"); /***/ }), diff --git a/themes/light/assets/js/medusa-runtime.js b/themes/light/assets/js/medusa-runtime.js index 858b508d8c..02c455065c 100644 --- a/themes/light/assets/js/medusa-runtime.js +++ b/themes/light/assets/js/medusa-runtime.js @@ -452,7 +452,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config\n }), {}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired'\n }), {\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return Number(this.$route.query.season) || undefined;\n },\n\n episode() {\n return Number(this.$route.query.episode) || undefined;\n }\n\n }),\n methods: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getShow: 'getShow' // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n\n }), {\n /**\n * Attaches IMDB tooltip,\n */\n reflowLayout() {\n attachImdbTooltip(); // eslint-disable-line no-undef\n },\n\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (this.$store.state.search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n /** Disabled for now. Because global + series ignored can be concatenated or excluded. So it's not that simple to color them. */\n // if (this.show.config.release.ignoredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-ignored');\n // }\n // if (this.show.config.release.requiredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-required');\n // }\n\n\n return classes.join(' ');\n }\n\n }),\n\n mounted() {\n const {\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n }); // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n }\n\n this.$watch('show', () => {\n this.$nextTick(() => this.reflowLayout());\n });\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.reflowLayout();\n });\n });\n\n const updateSpinner = function updateSpinner(message, showSpinner) {\n // Get spinner object as needed\n const spinner = $('#searchNotification');\n\n if (showSpinner) {\n message = ' ' + message;\n }\n\n $(spinner).empty().append(message);\n }; // Check the previous status of the history table, for hidden or shown, through the data attribute\n // data-history-toggle-hidden\n\n\n function toggleHistoryTable() {\n // eslint-disable-line no-unused-vars\n // Get previous state which was saved on the wrapper\n const showOrHide = $('#wrapper').attr('data-history-toggle');\n $('#historydata').collapse(showOrHide);\n }\n\n $.fn.loadContainer = function (path, loadingTxt, errorTxt, callback) {\n updateSpinner(loadingTxt);\n $('#manualSearchMeta').load(path + ' #manualSearchMeta meta');\n $(this).load(path + ' #manualSearchTbody tr', (response, status) => {\n if (status === 'error') {\n updateSpinner(errorTxt, false);\n }\n\n if (typeof callback !== 'undefined') {\n callback();\n }\n });\n }; // Click event for the download button for snatching a result\n\n\n $(document.body).on('click', '.epManualSearch', event => {\n event.preventDefault();\n const link = event.currentTarget;\n $(link).children('img').prop('src', 'images/loading16.gif');\n $.getJSON(event.currentTarget.href, data => {\n if (data.result === 'success') {\n $(link).children('img').prop('src', 'images/save.png');\n } else {\n $(link).children('img').prop('src', 'images/no16.png');\n }\n });\n });\n\n function initTableSorter(table) {\n // Nasty hack to re-initialize tablesorter after refresh\n $(table).tablesorter({\n widgets: ['saveSort', 'stickyHeaders', 'columnSelector', 'filter'],\n widgetOptions: {\n filter_columnFilters: true,\n // eslint-disable-line camelcase\n filter_hideFilters: true,\n // eslint-disable-line camelcase\n filter_saveFilters: true,\n // eslint-disable-line camelcase\n columnSelector_saveColumns: true,\n // eslint-disable-line camelcase\n columnSelector_layout: '',\n // eslint-disable-line camelcase\n columnSelector_mediaquery: false,\n // eslint-disable-line camelcase\n columnSelector_cssChecked: 'checked' // eslint-disable-line camelcase\n\n },\n textExtraction: function () {\n return {\n // 2: Provider\n 2(node) {\n return $(node).find('img').attr('title');\n },\n\n // 6: The size column needs an explicit field for the filtering on raw size.\n 6(node) {\n return node.getAttribute('data-size');\n },\n\n // 9: Published date\n 9(node) {\n return node.getAttribute('data-datetime');\n },\n\n // 10: Added date\n 10(node) {\n return node.getAttribute('data-datetime');\n }\n\n };\n }(),\n headers: {\n 9: {\n sorter: 'realISODate'\n },\n // Published\n 10: {\n sorter: 'realISODate'\n },\n // Added\n 11: {\n sorter: false,\n parser: false\n } // Snatch link\n\n }\n });\n }\n\n function checkCacheUpdates(repeat) {\n let pollInterval = 5000;\n repeat = repeat || true;\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const data = $('meta[data-last-prov-updates]').data('last-prov-updates');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + \" indexerName: \".concat(indexerName, \", seriesId: \").concat(seriesId, \", season: \").concat(season, \", episode: \").concat(episode));\n return;\n }\n\n let urlParams = '?indexername=' + indexerName + '&seriesid=' + seriesId + '&season=' + season + '&episode=' + episode;\n\n if (manualSearchType === 'season') {\n urlParams += '&manual_search_type=' + manualSearchType;\n }\n\n if (!$.isNumeric(seriesId) || !$.isNumeric(season) || !$.isNumeric(episode)) {\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 200);\n }\n\n $.ajax({\n url: 'home/manualSearchCheckCache' + urlParams,\n type: 'GET',\n data,\n contentType: 'application/json',\n\n error() {\n // Repeat = false;\n console.log('Error occurred!!');\n $('.manualSearchButton').removeAttr('disabled');\n },\n\n complete() {\n if (repeat) {\n setTimeout(checkCacheUpdates, pollInterval);\n }\n },\n\n timeout: 15000 // Timeout after 15s\n\n }).done(data => {\n // @TODO: Combine the lower if statements\n if (data === '') {\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n }\n\n if (data.result === 'refresh') {\n window.location.reload();\n updateSpinner('Refreshed results...', true);\n }\n\n if (data.result === 'searching') {\n // Ep is searched, you will get a results any minute now\n pollInterval = 5000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode is being searched, please wait......', true);\n }\n\n if (data.result === 'queued') {\n // Ep is queued, this might take some time to get results\n pollInterval = 7000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode has been queued, because another search is taking place. please wait..', true);\n }\n\n if (data.result === 'finished') {\n // Ep search is finished\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n $('#srchresults').trigger('update', true);\n $('[datetime]').timeago();\n }\n\n if (data.result === 'error') {\n // Ep search is finished but with an error\n console.log('Probably tried to call manualSelectCheckCache, while page was being refreshed.');\n $('.manualSearchButton').removeAttr('disabled');\n repeat = true;\n }\n });\n }\n\n setTimeout(checkCacheUpdates, 2000); // Click event for the reload results and force search buttons\n\n $(document.body).on('click', '.manualSearchButton', event => {\n event.preventDefault();\n $('.manualSearchButton').prop('disabled', true);\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const forceSearch = $(event.currentTarget).attr('data-force-search');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + \" indexerName: \".concat(indexerName, \", seriesId: \").concat(seriesId, \", season: \").concat(season, \", episode: \").concat(episode));\n return;\n }\n\n if ($.isNumeric(seriesId) && $.isNumeric(season) && $.isNumeric(episode)) {\n updateSpinner('Started a forced manual search...', true);\n $.getJSON('home/snatchSelection', {\n indexername: indexerName,\n seriesid: seriesId,\n season,\n episode,\n manual_search_type: manualSearchType,\n // eslint-disable-line camelcase\n perform_search: forceSearch // eslint-disable-line camelcase\n\n }); // Force the search, but give the checkCacheUpdates the time to start up a search thread\n\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 2000);\n }\n }); // Moved and rewritten this from displayShow. This changes the button when clicked for collapsing/expanding the\n // \"Show History\" button to show or hide the snatch/download/failed history for a manual searched episode or pack.\n\n $('#popover').popover({\n placement: 'bottom',\n html: true,\n // Required if content has HTML\n content: '
'\n }).on('shown.bs.popover', () => {\n // Bootstrap popover event triggered when the popover opens\n $.tablesorter.columnSelector.attachTo($('#srchresults'), '#popover-target');\n });\n $('#btnReset').click(() => {\n $('#showTable').trigger('saveSortReset') // Clear saved sort\n .trigger('sortReset'); // Reset current table sort\n\n return false;\n });\n initTableSorter('#srchresults');\n this.reflowLayout();\n $('body').on('hide.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Show History');\n $('#wrapper').prop('data-history-toggle', 'hide');\n });\n $('body').on('show.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Hide History');\n $('#wrapper').prop('data-history-toggle', 'show');\n });\n $(document.body).on('click', '.release-name-ellipses, .release-name-ellipses-toggled', event => {\n const target = $(event.currentTarget);\n\n if (target.hasClass('release-name-ellipses')) {\n target.switchClass('release-name-ellipses', 'release-name-ellipses-toggled', 100);\n } else {\n target.switchClass('release-name-ellipses-toggled', 'release-name-ellipses', 100);\n }\n });\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config,\n history: state => state.history\n }), {}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired'\n }), {\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return Number(this.$route.query.season) || undefined;\n },\n\n episode() {\n return Number(this.$route.query.episode) || undefined;\n }\n\n }),\n methods: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getHistory: 'getHistory'\n }), {\n /**\n * Attaches IMDB tooltip,\n */\n reflowLayout() {\n attachImdbTooltip(); // eslint-disable-line no-undef\n },\n\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (this.$store.state.search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n /** Disabled for now. Because global + series ignored can be concatenated or excluded. So it's not that simple to color them. */\n // if (this.show.config.release.ignoredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-ignored');\n // }\n // if (this.show.config.release.requiredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-required');\n // }\n\n\n return classes.join(' ');\n }\n\n }),\n\n mounted() {\n const {\n getHistory,\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n });\n getHistory(); // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n }\n\n this.$watch('show', () => {\n this.$nextTick(() => this.reflowLayout());\n });\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.reflowLayout();\n });\n });\n\n const updateSpinner = function updateSpinner(message, showSpinner) {\n // Get spinner object as needed\n const spinner = $('#searchNotification');\n\n if (showSpinner) {\n message = ' ' + message;\n }\n\n $(spinner).empty().append(message);\n }; // Check the previous status of the history table, for hidden or shown, through the data attribute\n // data-history-toggle-hidden\n\n\n function toggleHistoryTable() {\n // eslint-disable-line no-unused-vars\n // Get previous state which was saved on the wrapper\n const showOrHide = $('#wrapper').attr('data-history-toggle');\n $('#historydata').collapse(showOrHide);\n }\n\n $.fn.loadContainer = function (path, loadingTxt, errorTxt, callback) {\n updateSpinner(loadingTxt);\n $('#manualSearchMeta').load(path + ' #manualSearchMeta meta');\n $(this).load(path + ' #manualSearchTbody tr', (response, status) => {\n if (status === 'error') {\n updateSpinner(errorTxt, false);\n }\n\n if (typeof callback !== 'undefined') {\n callback();\n }\n });\n }; // Click event for the download button for snatching a result\n\n\n $(document.body).on('click', '.epManualSearch', event => {\n event.preventDefault();\n const link = event.currentTarget;\n $(link).children('img').prop('src', 'images/loading16.gif');\n $.getJSON(event.currentTarget.href, data => {\n if (data.result === 'success') {\n $(link).children('img').prop('src', 'images/save.png');\n } else {\n $(link).children('img').prop('src', 'images/no16.png');\n }\n });\n });\n\n function initTableSorter(table) {\n // Nasty hack to re-initialize tablesorter after refresh\n $(table).tablesorter({\n widgets: ['saveSort', 'stickyHeaders', 'columnSelector', 'filter'],\n widgetOptions: {\n filter_columnFilters: true,\n // eslint-disable-line camelcase\n filter_hideFilters: true,\n // eslint-disable-line camelcase\n filter_saveFilters: true,\n // eslint-disable-line camelcase\n columnSelector_saveColumns: true,\n // eslint-disable-line camelcase\n columnSelector_layout: '',\n // eslint-disable-line camelcase\n columnSelector_mediaquery: false,\n // eslint-disable-line camelcase\n columnSelector_cssChecked: 'checked' // eslint-disable-line camelcase\n\n },\n textExtraction: function () {\n return {\n // 2: Provider\n 2(node) {\n return $(node).find('img').attr('title');\n },\n\n // 6: The size column needs an explicit field for the filtering on raw size.\n 6(node) {\n return node.getAttribute('data-size');\n },\n\n // 9: Published date\n 9(node) {\n return node.getAttribute('data-datetime');\n },\n\n // 10: Added date\n 10(node) {\n return node.getAttribute('data-datetime');\n }\n\n };\n }(),\n headers: {\n 9: {\n sorter: 'realISODate'\n },\n // Published\n 10: {\n sorter: 'realISODate'\n },\n // Added\n 11: {\n sorter: false,\n parser: false\n } // Snatch link\n\n }\n });\n }\n\n function checkCacheUpdates(repeat) {\n let pollInterval = 5000;\n repeat = repeat || true;\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const data = $('meta[data-last-prov-updates]').data('last-prov-updates');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + \" indexerName: \".concat(indexerName, \", seriesId: \").concat(seriesId, \", season: \").concat(season, \", episode: \").concat(episode));\n return;\n }\n\n let urlParams = '?indexername=' + indexerName + '&seriesid=' + seriesId + '&season=' + season + '&episode=' + episode;\n\n if (manualSearchType === 'season') {\n urlParams += '&manual_search_type=' + manualSearchType;\n }\n\n if (!$.isNumeric(seriesId) || !$.isNumeric(season) || !$.isNumeric(episode)) {\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 200);\n }\n\n $.ajax({\n url: 'home/manualSearchCheckCache' + urlParams,\n type: 'GET',\n data,\n contentType: 'application/json',\n\n error() {\n // Repeat = false;\n console.log('Error occurred!!');\n $('.manualSearchButton').removeAttr('disabled');\n },\n\n complete() {\n if (repeat) {\n setTimeout(checkCacheUpdates, pollInterval);\n }\n },\n\n timeout: 15000 // Timeout after 15s\n\n }).done(data => {\n // @TODO: Combine the lower if statements\n if (data === '') {\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n }\n\n if (data.result === 'refresh') {\n window.location.reload();\n updateSpinner('Refreshed results...', true);\n }\n\n if (data.result === 'searching') {\n // Ep is searched, you will get a results any minute now\n pollInterval = 5000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode is being searched, please wait......', true);\n }\n\n if (data.result === 'queued') {\n // Ep is queued, this might take some time to get results\n pollInterval = 7000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode has been queued, because another search is taking place. please wait..', true);\n }\n\n if (data.result === 'finished') {\n // Ep search is finished\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n $('#srchresults').trigger('update', true);\n $('[datetime]').timeago();\n }\n\n if (data.result === 'error') {\n // Ep search is finished but with an error\n console.log('Probably tried to call manualSelectCheckCache, while page was being refreshed.');\n $('.manualSearchButton').removeAttr('disabled');\n repeat = true;\n }\n });\n }\n\n setTimeout(checkCacheUpdates, 2000); // Click event for the reload results and force search buttons\n\n $(document.body).on('click', '.manualSearchButton', event => {\n event.preventDefault();\n $('.manualSearchButton').prop('disabled', true);\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const forceSearch = $(event.currentTarget).attr('data-force-search');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + \" indexerName: \".concat(indexerName, \", seriesId: \").concat(seriesId, \", season: \").concat(season, \", episode: \").concat(episode));\n return;\n }\n\n if ($.isNumeric(seriesId) && $.isNumeric(season) && $.isNumeric(episode)) {\n updateSpinner('Started a forced manual search...', true);\n $.getJSON('home/snatchSelection', {\n indexername: indexerName,\n seriesid: seriesId,\n season,\n episode,\n manual_search_type: manualSearchType,\n // eslint-disable-line camelcase\n perform_search: forceSearch // eslint-disable-line camelcase\n\n }); // Force the search, but give the checkCacheUpdates the time to start up a search thread\n\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 2000);\n }\n }); // Moved and rewritten this from displayShow. This changes the button when clicked for collapsing/expanding the\n // \"Show History\" button to show or hide the snatch/download/failed history for a manual searched episode or pack.\n\n $('#popover').popover({\n placement: 'bottom',\n html: true,\n // Required if content has HTML\n content: '
'\n }).on('shown.bs.popover', () => {\n // Bootstrap popover event triggered when the popover opens\n $.tablesorter.columnSelector.attachTo($('#srchresults'), '#popover-target');\n });\n $('#btnReset').click(() => {\n $('#showTable').trigger('saveSortReset') // Clear saved sort\n .trigger('sortReset'); // Reset current table sort\n\n return false;\n });\n initTableSorter('#srchresults');\n this.reflowLayout();\n $('body').on('hide.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Show History');\n $('#wrapper').prop('data-history-toggle', 'hide');\n });\n $('body').on('show.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Hide History');\n $('#wrapper').prop('data-history-toggle', 'show');\n });\n $(document.body).on('click', '.release-name-ellipses, .release-name-ellipses-toggled', event => {\n const target = $(event.currentTarget);\n\n if (target.hasClass('release-name-ellipses')) {\n target.switchClass('release-name-ellipses', 'release-name-ellipses-toggled', 100);\n } else {\n target.switchClass('release-name-ellipses-toggled', 'release-name-ellipses', 100);\n }\n });\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -3192,7 +3192,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-native-websocket */ \"./node_modules/vue-native-websocket/dist/build.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _modules__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules */ \"./src/store/modules/index.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vuex__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\nconst store = new vuex__WEBPACK_IMPORTED_MODULE_1__[\"Store\"]({\n modules: {\n auth: _modules__WEBPACK_IMPORTED_MODULE_3__[\"auth\"],\n clients: _modules__WEBPACK_IMPORTED_MODULE_3__[\"clients\"],\n config: _modules__WEBPACK_IMPORTED_MODULE_3__[\"config\"],\n consts: _modules__WEBPACK_IMPORTED_MODULE_3__[\"consts\"],\n defaults: _modules__WEBPACK_IMPORTED_MODULE_3__[\"defaults\"],\n metadata: _modules__WEBPACK_IMPORTED_MODULE_3__[\"metadata\"],\n notifications: _modules__WEBPACK_IMPORTED_MODULE_3__[\"notifications\"],\n notifiers: _modules__WEBPACK_IMPORTED_MODULE_3__[\"notifiers\"],\n search: _modules__WEBPACK_IMPORTED_MODULE_3__[\"search\"],\n shows: _modules__WEBPACK_IMPORTED_MODULE_3__[\"shows\"],\n socket: _modules__WEBPACK_IMPORTED_MODULE_3__[\"socket\"],\n stats: _modules__WEBPACK_IMPORTED_MODULE_3__[\"stats\"],\n system: _modules__WEBPACK_IMPORTED_MODULE_3__[\"system\"]\n },\n state: {},\n mutations: {},\n getters: {},\n actions: {}\n}); // Keep as a non-arrow function for `this` context.\n\nconst passToStoreHandler = function passToStoreHandler(eventName, event, next) {\n const target = eventName.toUpperCase();\n const eventData = event.data;\n\n if (target === 'SOCKET_ONMESSAGE') {\n const message = JSON.parse(eventData);\n const {\n data,\n event\n } = message; // Show the notification to the user\n\n if (event === 'notification') {\n const {\n body,\n hash,\n type,\n title\n } = data;\n window.displayNotification(type, title, body, hash);\n } else if (event === 'configUpdated') {\n const {\n section,\n config\n } = data;\n this.store.dispatch('updateConfig', {\n section,\n config\n });\n } else if (event === 'showUpdated') {\n this.store.dispatch('updateShow', data);\n } else {\n window.displayNotification('info', event, data);\n }\n } // Resume normal 'passToStore' handling\n\n\n next(eventName, event);\n};\n\nconst websocketUrl = (() => {\n const {\n protocol,\n host\n } = window.location;\n const proto = protocol === 'https:' ? 'wss:' : 'ws:';\n const WSMessageUrl = '/ui';\n const webRoot = document.body.getAttribute('web-root');\n return \"\".concat(proto, \"//\").concat(host).concat(webRoot, \"/ws\").concat(WSMessageUrl);\n})();\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default.a, websocketUrl, {\n store,\n format: 'json',\n reconnection: true,\n // (Boolean) whether to reconnect automatically (false)\n reconnectionAttempts: 2,\n // (Number) number of reconnection attempts before giving up (Infinity),\n reconnectionDelay: 1000,\n // (Number) how long to initially wait before attempting a new (1000)\n passToStoreHandler,\n // (Function|) Handler for events triggered by the WebSocket (false)\n mutations: {\n SOCKET_ONOPEN: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONOPEN\"],\n SOCKET_ONCLOSE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONCLOSE\"],\n SOCKET_ONERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONERROR\"],\n SOCKET_ONMESSAGE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONMESSAGE\"],\n SOCKET_RECONNECT: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT\"],\n SOCKET_RECONNECT_ERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT_ERROR\"]\n }\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (store);\n\n//# sourceURL=webpack:///./src/store/index.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 vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-native-websocket */ \"./node_modules/vue-native-websocket/dist/build.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _modules__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules */ \"./src/store/modules/index.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vuex__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\nconst store = new vuex__WEBPACK_IMPORTED_MODULE_1__[\"Store\"]({\n modules: {\n auth: _modules__WEBPACK_IMPORTED_MODULE_3__[\"auth\"],\n clients: _modules__WEBPACK_IMPORTED_MODULE_3__[\"clients\"],\n config: _modules__WEBPACK_IMPORTED_MODULE_3__[\"config\"],\n consts: _modules__WEBPACK_IMPORTED_MODULE_3__[\"consts\"],\n defaults: _modules__WEBPACK_IMPORTED_MODULE_3__[\"defaults\"],\n history: _modules__WEBPACK_IMPORTED_MODULE_3__[\"history\"],\n metadata: _modules__WEBPACK_IMPORTED_MODULE_3__[\"metadata\"],\n notifications: _modules__WEBPACK_IMPORTED_MODULE_3__[\"notifications\"],\n notifiers: _modules__WEBPACK_IMPORTED_MODULE_3__[\"notifiers\"],\n search: _modules__WEBPACK_IMPORTED_MODULE_3__[\"search\"],\n shows: _modules__WEBPACK_IMPORTED_MODULE_3__[\"shows\"],\n socket: _modules__WEBPACK_IMPORTED_MODULE_3__[\"socket\"],\n stats: _modules__WEBPACK_IMPORTED_MODULE_3__[\"stats\"],\n system: _modules__WEBPACK_IMPORTED_MODULE_3__[\"system\"]\n },\n state: {},\n mutations: {},\n getters: {},\n actions: {}\n}); // Keep as a non-arrow function for `this` context.\n\nconst passToStoreHandler = function passToStoreHandler(eventName, event, next) {\n const target = eventName.toUpperCase();\n const eventData = event.data;\n\n if (target === 'SOCKET_ONMESSAGE') {\n const message = JSON.parse(eventData);\n const {\n data,\n event\n } = message; // Show the notification to the user\n\n if (event === 'notification') {\n const {\n body,\n hash,\n type,\n title\n } = data;\n window.displayNotification(type, title, body, hash);\n } else if (event === 'configUpdated') {\n const {\n section,\n config\n } = data;\n this.store.dispatch('updateConfig', {\n section,\n config\n });\n } else if (event === 'showUpdated') {\n this.store.dispatch('updateShow', data);\n } else {\n window.displayNotification('info', event, data);\n }\n } // Resume normal 'passToStore' handling\n\n\n next(eventName, event);\n};\n\nconst websocketUrl = (() => {\n const {\n protocol,\n host\n } = window.location;\n const proto = protocol === 'https:' ? 'wss:' : 'ws:';\n const WSMessageUrl = '/ui';\n const webRoot = document.body.getAttribute('web-root');\n return \"\".concat(proto, \"//\").concat(host).concat(webRoot, \"/ws\").concat(WSMessageUrl);\n})();\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default.a, websocketUrl, {\n store,\n format: 'json',\n reconnection: true,\n // (Boolean) whether to reconnect automatically (false)\n reconnectionAttempts: 2,\n // (Number) number of reconnection attempts before giving up (Infinity),\n reconnectionDelay: 1000,\n // (Number) how long to initially wait before attempting a new (1000)\n passToStoreHandler,\n // (Function|) Handler for events triggered by the WebSocket (false)\n mutations: {\n SOCKET_ONOPEN: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONOPEN\"],\n SOCKET_ONCLOSE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONCLOSE\"],\n SOCKET_ONERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONERROR\"],\n SOCKET_ONMESSAGE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONMESSAGE\"],\n SOCKET_RECONNECT: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT\"],\n SOCKET_RECONNECT_ERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT_ERROR\"]\n }\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (store);\n\n//# sourceURL=webpack:///./src/store/index.js?"); /***/ }), @@ -3256,15 +3256,27 @@ eval("__webpack_require__.r(__webpack_exports__);\nconst state = {\n show: {\n /***/ }), +/***/ "./src/store/modules/history.js": +/*!**************************************!*\ + !*** ./src/store/modules/history.js ***! + \**************************************/ +/*! exports provided: default */ +/***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n history: [],\n page: 0\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"]](state, history) {\n // Update state\n state.history.push(...history);\n }\n\n};\nconst getters = {\n getShowHistoryBySlug: state => showSlug => state.history.find(history => history.series === showSlug)\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n getShowHistory(context, {\n slug\n }) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(\"/history/\".concat(slug)).then(res => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"], res.data);\n resolve(res.data);\n }).catch(error => {\n reject(error);\n });\n });\n },\n\n /**\n * Get history from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n async getHistory(context) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit\n };\n let lastPage = false;\n let response = null;\n\n while (!lastPage) {\n state.page += 1;\n params.page = state.page;\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(\"/history\", {\n params\n }); // No way around this.\n // response.data.forEach(history => {\n // commit(ADD_HISTORY, history);\n // });\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"], response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n }\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/history.js?"); + +/***/ }), + /***/ "./src/store/modules/index.js": /*!************************************!*\ !*** ./src/store/modules/index.js ***! \************************************/ -/*! exports provided: auth, clients, config, consts, defaults, metadata, notifications, notifiers, search, shows, socket, stats, system */ +/*! exports provided: auth, clients, config, consts, defaults, history, metadata, notifications, notifiers, search, shows, socket, stats, system */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./auth */ \"./src/store/modules/auth.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"auth\", function() { return _auth__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _clients__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./clients */ \"./src/store/modules/clients.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"clients\", function() { return _clients__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./config */ \"./src/store/modules/config.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"config\", function() { return _config__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _consts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./consts */ \"./src/store/modules/consts.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"consts\", function() { return _consts__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _defaults__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./defaults */ \"./src/store/modules/defaults.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defaults\", function() { return _defaults__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _metadata__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./metadata */ \"./src/store/modules/metadata.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"metadata\", function() { return _metadata__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony import */ var _notifications__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./notifications */ \"./src/store/modules/notifications.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"notifications\", function() { return _notifications__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony import */ var _notifiers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./notifiers */ \"./src/store/modules/notifiers/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"notifiers\", function() { return _notifiers__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony import */ var _search__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./search */ \"./src/store/modules/search.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"search\", function() { return _search__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony import */ var _shows__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./shows */ \"./src/store/modules/shows.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"shows\", function() { return _shows__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony import */ var _socket__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./socket */ \"./src/store/modules/socket.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"socket\", function() { return _socket__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* harmony import */ var _stats__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./stats */ \"./src/store/modules/stats.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"stats\", function() { return _stats__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./system */ \"./src/store/modules/system.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"system\", function() { return _system__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./src/store/modules/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./auth */ \"./src/store/modules/auth.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"auth\", function() { return _auth__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _clients__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./clients */ \"./src/store/modules/clients.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"clients\", function() { return _clients__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./config */ \"./src/store/modules/config.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"config\", function() { return _config__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _consts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./consts */ \"./src/store/modules/consts.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"consts\", function() { return _consts__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _defaults__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./defaults */ \"./src/store/modules/defaults.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defaults\", function() { return _defaults__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./history */ \"./src/store/modules/history.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"history\", function() { return _history__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony import */ var _metadata__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./metadata */ \"./src/store/modules/metadata.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"metadata\", function() { return _metadata__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony import */ var _notifications__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./notifications */ \"./src/store/modules/notifications.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"notifications\", function() { return _notifications__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony import */ var _notifiers__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./notifiers */ \"./src/store/modules/notifiers/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"notifiers\", function() { return _notifiers__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony import */ var _search__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./search */ \"./src/store/modules/search.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"search\", function() { return _search__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony import */ var _shows__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./shows */ \"./src/store/modules/shows.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"shows\", function() { return _shows__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* harmony import */ var _socket__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./socket */ \"./src/store/modules/socket.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"socket\", function() { return _socket__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* harmony import */ var _stats__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./stats */ \"./src/store/modules/stats.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"stats\", function() { return _stats__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./system */ \"./src/store/modules/system.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"system\", function() { return _system__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./src/store/modules/index.js?"); /***/ }), @@ -3644,11 +3656,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /*!*************************************!*\ !*** ./src/store/mutation-types.js ***! \*************************************/ -/*! exports provided: LOGIN_PENDING, LOGIN_SUCCESS, LOGIN_FAILED, LOGOUT, REFRESH_TOKEN, REMOVE_AUTH_ERROR, SOCKET_ONOPEN, SOCKET_ONCLOSE, SOCKET_ONERROR, SOCKET_ONMESSAGE, SOCKET_RECONNECT, SOCKET_RECONNECT_ERROR, NOTIFICATIONS_ENABLED, NOTIFICATIONS_DISABLED, ADD_CONFIG, ADD_SHOW, ADD_SHOW_EPISODE, ADD_STATS */ +/*! exports provided: LOGIN_PENDING, LOGIN_SUCCESS, LOGIN_FAILED, LOGOUT, REFRESH_TOKEN, REMOVE_AUTH_ERROR, SOCKET_ONOPEN, SOCKET_ONCLOSE, SOCKET_ONERROR, SOCKET_ONMESSAGE, SOCKET_RECONNECT, SOCKET_RECONNECT_ERROR, NOTIFICATIONS_ENABLED, NOTIFICATIONS_DISABLED, ADD_CONFIG, ADD_HISTORY, ADD_SHOW, ADD_SHOW_EPISODE, ADD_STATS */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGIN_PENDING\", function() { return LOGIN_PENDING; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGIN_SUCCESS\", function() { return LOGIN_SUCCESS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGIN_FAILED\", function() { return LOGIN_FAILED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGOUT\", function() { return LOGOUT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"REFRESH_TOKEN\", function() { return REFRESH_TOKEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"REMOVE_AUTH_ERROR\", function() { return REMOVE_AUTH_ERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONOPEN\", function() { return SOCKET_ONOPEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONCLOSE\", function() { return SOCKET_ONCLOSE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONERROR\", function() { return SOCKET_ONERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONMESSAGE\", function() { return SOCKET_ONMESSAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_RECONNECT\", function() { return SOCKET_RECONNECT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_RECONNECT_ERROR\", function() { return SOCKET_RECONNECT_ERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NOTIFICATIONS_ENABLED\", function() { return NOTIFICATIONS_ENABLED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NOTIFICATIONS_DISABLED\", function() { return NOTIFICATIONS_DISABLED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_CONFIG\", function() { return ADD_CONFIG; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_SHOW\", function() { return ADD_SHOW; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_SHOW_EPISODE\", function() { return ADD_SHOW_EPISODE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_STATS\", function() { return ADD_STATS; });\nconst LOGIN_PENDING = '🔒 Logging in';\nconst LOGIN_SUCCESS = '🔒 ✅ Login Successful';\nconst LOGIN_FAILED = '🔒 ❌ Login Failed';\nconst LOGOUT = '🔒 Logout';\nconst REFRESH_TOKEN = '🔒 Refresh Token';\nconst REMOVE_AUTH_ERROR = '🔒 Remove Auth Error';\nconst SOCKET_ONOPEN = '🔗 ✅ WebSocket connected';\nconst SOCKET_ONCLOSE = '🔗 ❌ WebSocket disconnected';\nconst SOCKET_ONERROR = '🔗 ❌ WebSocket error';\nconst SOCKET_ONMESSAGE = '🔗 ✉️ 📥 WebSocket message received';\nconst SOCKET_RECONNECT = '🔗 🔃 WebSocket reconnecting';\nconst SOCKET_RECONNECT_ERROR = '🔗 🔃 ❌ WebSocket reconnection attempt failed';\nconst NOTIFICATIONS_ENABLED = '🔔 Notifications Enabled';\nconst NOTIFICATIONS_DISABLED = '🔔 Notifications Disabled';\nconst ADD_CONFIG = '⚙️ Config added to store';\nconst ADD_SHOW = '📺 Show added to store';\nconst ADD_SHOW_EPISODE = '📺 Shows season with episodes added to store';\nconst ADD_STATS = 'ℹ️ Statistics added to store';\n\n\n//# sourceURL=webpack:///./src/store/mutation-types.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGIN_PENDING\", function() { return LOGIN_PENDING; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGIN_SUCCESS\", function() { return LOGIN_SUCCESS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGIN_FAILED\", function() { return LOGIN_FAILED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LOGOUT\", function() { return LOGOUT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"REFRESH_TOKEN\", function() { return REFRESH_TOKEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"REMOVE_AUTH_ERROR\", function() { return REMOVE_AUTH_ERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONOPEN\", function() { return SOCKET_ONOPEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONCLOSE\", function() { return SOCKET_ONCLOSE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONERROR\", function() { return SOCKET_ONERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_ONMESSAGE\", function() { return SOCKET_ONMESSAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_RECONNECT\", function() { return SOCKET_RECONNECT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SOCKET_RECONNECT_ERROR\", function() { return SOCKET_RECONNECT_ERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NOTIFICATIONS_ENABLED\", function() { return NOTIFICATIONS_ENABLED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NOTIFICATIONS_DISABLED\", function() { return NOTIFICATIONS_DISABLED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_CONFIG\", function() { return ADD_CONFIG; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_HISTORY\", function() { return ADD_HISTORY; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_SHOW\", function() { return ADD_SHOW; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_SHOW_EPISODE\", function() { return ADD_SHOW_EPISODE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ADD_STATS\", function() { return ADD_STATS; });\nconst LOGIN_PENDING = '🔒 Logging in';\nconst LOGIN_SUCCESS = '🔒 ✅ Login Successful';\nconst LOGIN_FAILED = '🔒 ❌ Login Failed';\nconst LOGOUT = '🔒 Logout';\nconst REFRESH_TOKEN = '🔒 Refresh Token';\nconst REMOVE_AUTH_ERROR = '🔒 Remove Auth Error';\nconst SOCKET_ONOPEN = '🔗 ✅ WebSocket connected';\nconst SOCKET_ONCLOSE = '🔗 ❌ WebSocket disconnected';\nconst SOCKET_ONERROR = '🔗 ❌ WebSocket error';\nconst SOCKET_ONMESSAGE = '🔗 ✉️ 📥 WebSocket message received';\nconst SOCKET_RECONNECT = '🔗 🔃 WebSocket reconnecting';\nconst SOCKET_RECONNECT_ERROR = '🔗 🔃 ❌ WebSocket reconnection attempt failed';\nconst NOTIFICATIONS_ENABLED = '🔔 Notifications Enabled';\nconst NOTIFICATIONS_DISABLED = '🔔 Notifications Disabled';\nconst ADD_CONFIG = '⚙️ Config added to store';\nconst ADD_SHOW = '📺 Show added to store';\nconst ADD_SHOW_EPISODE = '📺 Shows season with episodes added to store';\nconst ADD_STATS = 'ℹ️ Statistics added to store';\nconst ADD_HISTORY = '📺 History added to store';\n\n\n//# sourceURL=webpack:///./src/store/mutation-types.js?"); /***/ }), From fc6258aef009378b12af2a2d3771054e314b5336 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Mon, 18 Nov 2019 16:47:50 +0100 Subject: [PATCH 06/87] Add show-history.vue component. --- themes-default/slim/src/components/index.js | 1 + .../slim/src/components/show-history.vue | 145 ++++++++++++++++++ .../slim/src/components/snatch-selection.vue | 15 +- .../slim/src/store/modules/history.js | 33 ++-- .../slim/src/store/mutation-types.js | 4 +- 5 files changed, 177 insertions(+), 21 deletions(-) create mode 100644 themes-default/slim/src/components/show-history.vue diff --git a/themes-default/slim/src/components/index.js b/themes-default/slim/src/components/index.js index 7720d0036a..8e6a36d6b9 100644 --- a/themes-default/slim/src/components/index.js +++ b/themes-default/slim/src/components/index.js @@ -18,6 +18,7 @@ export { default as Logs } from './logs.vue'; export { default as ManualPostProcess } from './manual-post-process.vue'; export { default as RootDirs } from './root-dirs.vue'; export { default as ShowHeader } from './show-header.vue'; +export { default as ShowHistory } from './show-history.vue'; export { default as SnatchSelection } from './snatch-selection.vue'; export { default as Status } from './status.vue'; export { default as SubMenu } from './sub-menu.vue'; diff --git a/themes-default/slim/src/components/show-history.vue b/themes-default/slim/src/components/show-history.vue new file mode 100644 index 0000000000..6b237246d8 --- /dev/null +++ b/themes-default/slim/src/components/show-history.vue @@ -0,0 +1,145 @@ + + + diff --git a/themes-default/slim/src/components/snatch-selection.vue b/themes-default/slim/src/components/snatch-selection.vue index da635a7efa..9148e49d77 100644 --- a/themes-default/slim/src/components/snatch-selection.vue +++ b/themes-default/slim/src/components/snatch-selection.vue @@ -2,13 +2,15 @@ import { mapState, mapGetters, mapActions } from 'vuex'; import { AppLink } from './helpers'; import ShowHeader from './show-header.vue'; +import ShowHistory from './show-history.vue'; export default { name: 'snatch-selection', template: '#snatch-selection-template', components: { AppLink, - ShowHeader + ShowHeader, + ShowHistory }, metaInfo() { if (!this.show || !this.show.title) { @@ -31,7 +33,8 @@ export default { ...mapGetters({ show: 'getCurrentShow', effectiveIgnored: 'effectiveIgnored', - effectiveRequired: 'effectiveRequired' + effectiveRequired: 'effectiveRequired', + getShowHistoryBySlug: 'getShowHistoryBySlug' }), indexer() { return this.$route.query.indexername; @@ -44,6 +47,14 @@ export default { }, episode() { return Number(this.$route.query.episode) || undefined; + }, + showHistory() { + const { getShowHistoryBySlug, show } = this; + if (!show) { + return; + } + const history = getShowHistoryBySlug(show.id.slug); + return history; } }, methods: { diff --git a/themes-default/slim/src/store/modules/history.js b/themes-default/slim/src/store/modules/history.js index d876a67471..05b5c15e4f 100644 --- a/themes-default/slim/src/store/modules/history.js +++ b/themes-default/slim/src/store/modules/history.js @@ -1,22 +1,28 @@ import Vue from 'vue'; import { api } from '../../api'; -import { ADD_HISTORY } from '../mutation-types'; +import { ADD_HISTORY, ADD_SHOW_HISTORY } from '../mutation-types'; const state = { history: [], - page: 0 + page: 0, + showHistory: {} }; const mutations = { [ADD_HISTORY](state, history) { // Update state state.history.push(...history); + }, + [ADD_SHOW_HISTORY](state, { showSlug, history }) { + // Keep an array of shows, with their history + // Maybe we can just check the last id. And if the id's are newer, add them. Less fancy, much more fast. + Vue.set(state.showHistory, showSlug, history); } }; const getters = { - getShowHistoryBySlug: state => showSlug => state.history.find(history => history.series === showSlug) + getShowHistoryBySlug: state => showSlug => state.showHistory[showSlug] }; /** @@ -35,19 +41,13 @@ const actions = { * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters. * @returns {Promise} The API response. */ - getShowHistory(context, { slug }) { - return new Promise((resolve, reject) => { - const { commit } = context; + async getShowHistory(context, { slug }) { + const { commit } = context; - api.get(`/history/${slug}`) - .then(res => { - commit(ADD_HISTORY, res.data); - resolve(res.data); - }) - .catch(error => { - reject(error); - }); - }); + const response = await api.get(`/history/${slug}`); + if (response.data.length > 0) { + commit(ADD_SHOW_HISTORY, { showSlug: slug, history: response.data }); + } }, /** * Get history from API and commit them to the store. @@ -67,9 +67,6 @@ const actions = { state.page += 1; params.page = state.page; response = await api.get(`/history`, { params }); // No way around this. - // response.data.forEach(history => { - // commit(ADD_HISTORY, history); - // }); commit(ADD_HISTORY, response.data); if (response.data.length < limit) { diff --git a/themes-default/slim/src/store/mutation-types.js b/themes-default/slim/src/store/mutation-types.js index e8c47e4175..f16a5e866f 100644 --- a/themes-default/slim/src/store/mutation-types.js +++ b/themes-default/slim/src/store/mutation-types.js @@ -17,6 +17,7 @@ const ADD_SHOW = '📺 Show added to store'; const ADD_SHOW_EPISODE = '📺 Shows season with episodes added to store'; const ADD_STATS = 'ℹ️ Statistics added to store'; const ADD_HISTORY = '📺 History added to store'; +const ADD_SHOW_HISTORY = '📺 Show specific History added to store'; export { LOGIN_PENDING, @@ -37,5 +38,6 @@ export { ADD_HISTORY, ADD_SHOW, ADD_SHOW_EPISODE, - ADD_STATS + ADD_STATS, + ADD_SHOW_HISTORY }; From 146370adb4bd7791ce7d0668e383d9deaeb78adf Mon Sep 17 00:00:00 2001 From: P0psicles Date: Tue, 19 Nov 2019 09:04:40 +0100 Subject: [PATCH 07/87] Add apiv2 providers endpoint. * Return a list of providers in json. --- medusa/providers/generic_provider.py | 35 ++++++++ medusa/server/api/v2/history.py | 4 +- medusa/server/api/v2/providers.py | 57 ++++++++++++ medusa/server/core.py | 4 + themes/dark/assets/js/medusa-runtime.js | 106 +++++++++++++++++++++-- themes/light/assets/js/medusa-runtime.js | 106 +++++++++++++++++++++-- 6 files changed, 299 insertions(+), 13 deletions(-) create mode 100644 medusa/server/api/v2/providers.py diff --git a/medusa/providers/generic_provider.py b/medusa/providers/generic_provider.py index a37435d720..d77f819044 100644 --- a/medusa/providers/generic_provider.py +++ b/medusa/providers/generic_provider.py @@ -858,3 +858,38 @@ def __str__(self): def __unicode__(self): """Return provider name and provider type.""" return '{provider_name} ({provider_type})'.format(provider_name=self.name, provider_type=self.provider_type) + + def to_json(self): + """Return a json representation for a provider.""" + return { + 'name': self.name, + 'id': self.get_id(), + 'config': { + 'enabled': self.enabled, + 'search': { + 'backlog': { + 'enabled': self.enable_backlog + }, + 'manual': { + 'enabled': self.enable_backlog + }, + 'daily': { + 'enabled': self.enable_backlog + }, + 'fallback': self.search_fallback, + 'mode': self.search_mode, + 'separator': self.search_separator, + 'delay': self.search_delay + } + }, + 'animeOnly': self.anime_only, + 'type': self.provider_type, + 'public': self.public, + 'btCacheUrls': self.bt_cache_urls, + 'properStrings': self.proper_strings, + 'headers': self.headers, + 'supportsAbsoluteNumbering': self.supports_absolute_numbering, + 'supportsBacklog': self.supports_backlog, + 'url': self.url, + 'urls': self.urls + } diff --git a/medusa/server/api/v2/history.py b/medusa/server/api/v2/history.py index e02dbb152c..b9eacb9a7a 100644 --- a/medusa/server/api/v2/history.py +++ b/medusa/server/api/v2/history.py @@ -34,7 +34,6 @@ def get(self, series_slug, path_param): provider, version, resource, size, indexer_id, showid, season, episode FROM history - ORDER BY date DESC ''' params = [] @@ -49,6 +48,7 @@ def get(self, series_slug, path_param): sql_base += ' WHERE indexer_id = ? AND showid = ?' params += [series_identifier.indexer.id, series_identifier.id] + sql_base += ' ORDER BY date DESC' results = db.DBConnection().select(sql_base, params) def data_generator(): @@ -68,6 +68,8 @@ def data_generator(): d['resource'] = basename(item['resource']) d['size'] = item['size'] d['statusName'] = statusStrings.get(item['action']) + d['season'] = item['season'] + d['episode'] = item['episode'] provider = get_provider_class(GenericProvider.make_id(item['provider'])) d['provider'] = {} diff --git a/medusa/server/api/v2/providers.py b/medusa/server/api/v2/providers.py new file mode 100644 index 0000000000..f8d3446596 --- /dev/null +++ b/medusa/server/api/v2/providers.py @@ -0,0 +1,57 @@ +# coding=utf-8 +"""Request handler for series and episodes.""" +from __future__ import unicode_literals + +import logging + +from medusa import ws +from medusa.logger.adapters.style import BraceAdapter +from medusa.server.api.v2.base import ( + BaseRequestHandler, + BooleanField, + IntegerField, + ListField, + StringField, + iter_nested_items, + set_nested_value +) +from medusa import providers +from medusa.tv.series import Series, SeriesIdentifier + +from six import itervalues, viewitems + +from tornado.escape import json_decode + +log = BraceAdapter(logging.getLogger(__name__)) +log.logger.addHandler(logging.NullHandler()) + + +class ProvidersHandler(BaseRequestHandler): + """Providers request handler.""" + + #: resource name + name = 'providers' + #: identifier + identifier = ('provider', r'\w+') + #: path param + path_param = ('path_param', r'\w+') + #: allowed HTTP methods + allowed_methods = ('GET', 'POST', 'PATCH', 'DELETE', ) + + def get(self, provider, path_param=None): + """Query provider information. + + Return a list of provider id's. + + :param series_slug: series slug. E.g.: tvdb1234 + :param path_param: + """ + # arg_paused = self._parse_boolean(self.get_argument('paused', default=None)) + # + # def filter_series(current): + # return arg_paused is None or current.paused == arg_paused + + if not provider: + # return a list of provider id's + provider_list = providers.sorted_provider_list() + return self._ok([provider.to_json() for provider in provider_list]) diff --git a/medusa/server/core.py b/medusa/server/core.py index a8d8d32496..f9e2530c3d 100644 --- a/medusa/server/core.py +++ b/medusa/server/core.py @@ -26,6 +26,7 @@ from medusa.server.api.v2.history import HistoryHandler from medusa.server.api.v2.internal import InternalHandler from medusa.server.api.v2.log import LogHandler +from medusa.server.api.v2.providers import ProvidersHandler from medusa.server.api.v2.search import SearchHandler from medusa.server.api.v2.series import SeriesHandler from medusa.server.api.v2.series_asset import SeriesAssetHandler @@ -81,6 +82,9 @@ def get_apiv2_handlers(base): # Order: Most specific to most generic + # /api/v2/providers + ProvidersHandler.create_app_handler(base), + # /api/v2/history HistoryHandler.create_app_handler(base), diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index 02c455065c..9e6a971d28 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -444,6 +444,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ }), +/***/ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./src/components/show-history.vue?vue&type=script&lang=js&": +/*!****************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./src/components/show-history.vue?vue&type=script&lang=js& ***! + \****************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.es.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: [String, Number],\n required: true\n },\n episode: {\n type: [String, Number],\n required: true\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n\n /**\n * Vue-good-table sort overwrite function.\n * @param {Object} x - row1 value for column.\n * @param {object} y - row2 value for column.\n * @returns {Boolean} - if we want to display this row before the next\n */\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'status',\n sortable: false\n }, {\n label: 'Provider',\n sortable: false,\n field: 'provider.name'\n }, {\n label: 'Release',\n field: 'resource',\n sortable: false\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_3__[\"humanFileSize\"],\n sortable: false,\n type: 'number'\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n showHistory: state => state.showHistory\n }), {}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])(['getShowHistoryBySlug']), {\n showHistoryByEpisode() {\n const {\n episode,\n season,\n show,\n getShowHistoryBySlug\n } = this;\n const historyBySlug = getShowHistoryBySlug(show.id.slug);\n\n if (!historyBySlug) {\n return [];\n }\n\n return historyBySlug.filter(history => history.season === season && history.episode === episode) || [];\n }\n\n }),\n\n mounted() {\n const {\n getShowHistory,\n show\n } = this; // Get showHistory\n\n getShowHistory({\n slug: show.id.slug\n });\n },\n\n methods: _objectSpread({\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_3__[\"humanFileSize\"]\n }, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getShowHistory: 'getShowHistory'\n }), {\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.parentNode.removeChild(this.$el);\n }\n\n })\n});\n\n//# sourceURL=webpack:///./src/components/show-history.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/snatch-selection.vue?vue&type=script&lang=js&": /*!********************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./src/components/snatch-selection.vue?vue&type=script&lang=js& ***! @@ -452,7 +464,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config,\n history: state => state.history\n }), {}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired'\n }), {\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return Number(this.$route.query.season) || undefined;\n },\n\n episode() {\n return Number(this.$route.query.episode) || undefined;\n }\n\n }),\n methods: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getHistory: 'getHistory'\n }), {\n /**\n * Attaches IMDB tooltip,\n */\n reflowLayout() {\n attachImdbTooltip(); // eslint-disable-line no-undef\n },\n\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (this.$store.state.search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n /** Disabled for now. Because global + series ignored can be concatenated or excluded. So it's not that simple to color them. */\n // if (this.show.config.release.ignoredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-ignored');\n // }\n // if (this.show.config.release.requiredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-required');\n // }\n\n\n return classes.join(' ');\n }\n\n }),\n\n mounted() {\n const {\n getHistory,\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n });\n getHistory(); // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n }\n\n this.$watch('show', () => {\n this.$nextTick(() => this.reflowLayout());\n });\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.reflowLayout();\n });\n });\n\n const updateSpinner = function updateSpinner(message, showSpinner) {\n // Get spinner object as needed\n const spinner = $('#searchNotification');\n\n if (showSpinner) {\n message = ' ' + message;\n }\n\n $(spinner).empty().append(message);\n }; // Check the previous status of the history table, for hidden or shown, through the data attribute\n // data-history-toggle-hidden\n\n\n function toggleHistoryTable() {\n // eslint-disable-line no-unused-vars\n // Get previous state which was saved on the wrapper\n const showOrHide = $('#wrapper').attr('data-history-toggle');\n $('#historydata').collapse(showOrHide);\n }\n\n $.fn.loadContainer = function (path, loadingTxt, errorTxt, callback) {\n updateSpinner(loadingTxt);\n $('#manualSearchMeta').load(path + ' #manualSearchMeta meta');\n $(this).load(path + ' #manualSearchTbody tr', (response, status) => {\n if (status === 'error') {\n updateSpinner(errorTxt, false);\n }\n\n if (typeof callback !== 'undefined') {\n callback();\n }\n });\n }; // Click event for the download button for snatching a result\n\n\n $(document.body).on('click', '.epManualSearch', event => {\n event.preventDefault();\n const link = event.currentTarget;\n $(link).children('img').prop('src', 'images/loading16.gif');\n $.getJSON(event.currentTarget.href, data => {\n if (data.result === 'success') {\n $(link).children('img').prop('src', 'images/save.png');\n } else {\n $(link).children('img').prop('src', 'images/no16.png');\n }\n });\n });\n\n function initTableSorter(table) {\n // Nasty hack to re-initialize tablesorter after refresh\n $(table).tablesorter({\n widgets: ['saveSort', 'stickyHeaders', 'columnSelector', 'filter'],\n widgetOptions: {\n filter_columnFilters: true,\n // eslint-disable-line camelcase\n filter_hideFilters: true,\n // eslint-disable-line camelcase\n filter_saveFilters: true,\n // eslint-disable-line camelcase\n columnSelector_saveColumns: true,\n // eslint-disable-line camelcase\n columnSelector_layout: '',\n // eslint-disable-line camelcase\n columnSelector_mediaquery: false,\n // eslint-disable-line camelcase\n columnSelector_cssChecked: 'checked' // eslint-disable-line camelcase\n\n },\n textExtraction: function () {\n return {\n // 2: Provider\n 2(node) {\n return $(node).find('img').attr('title');\n },\n\n // 6: The size column needs an explicit field for the filtering on raw size.\n 6(node) {\n return node.getAttribute('data-size');\n },\n\n // 9: Published date\n 9(node) {\n return node.getAttribute('data-datetime');\n },\n\n // 10: Added date\n 10(node) {\n return node.getAttribute('data-datetime');\n }\n\n };\n }(),\n headers: {\n 9: {\n sorter: 'realISODate'\n },\n // Published\n 10: {\n sorter: 'realISODate'\n },\n // Added\n 11: {\n sorter: false,\n parser: false\n } // Snatch link\n\n }\n });\n }\n\n function checkCacheUpdates(repeat) {\n let pollInterval = 5000;\n repeat = repeat || true;\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const data = $('meta[data-last-prov-updates]').data('last-prov-updates');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + \" indexerName: \".concat(indexerName, \", seriesId: \").concat(seriesId, \", season: \").concat(season, \", episode: \").concat(episode));\n return;\n }\n\n let urlParams = '?indexername=' + indexerName + '&seriesid=' + seriesId + '&season=' + season + '&episode=' + episode;\n\n if (manualSearchType === 'season') {\n urlParams += '&manual_search_type=' + manualSearchType;\n }\n\n if (!$.isNumeric(seriesId) || !$.isNumeric(season) || !$.isNumeric(episode)) {\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 200);\n }\n\n $.ajax({\n url: 'home/manualSearchCheckCache' + urlParams,\n type: 'GET',\n data,\n contentType: 'application/json',\n\n error() {\n // Repeat = false;\n console.log('Error occurred!!');\n $('.manualSearchButton').removeAttr('disabled');\n },\n\n complete() {\n if (repeat) {\n setTimeout(checkCacheUpdates, pollInterval);\n }\n },\n\n timeout: 15000 // Timeout after 15s\n\n }).done(data => {\n // @TODO: Combine the lower if statements\n if (data === '') {\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n }\n\n if (data.result === 'refresh') {\n window.location.reload();\n updateSpinner('Refreshed results...', true);\n }\n\n if (data.result === 'searching') {\n // Ep is searched, you will get a results any minute now\n pollInterval = 5000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode is being searched, please wait......', true);\n }\n\n if (data.result === 'queued') {\n // Ep is queued, this might take some time to get results\n pollInterval = 7000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode has been queued, because another search is taking place. please wait..', true);\n }\n\n if (data.result === 'finished') {\n // Ep search is finished\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n $('#srchresults').trigger('update', true);\n $('[datetime]').timeago();\n }\n\n if (data.result === 'error') {\n // Ep search is finished but with an error\n console.log('Probably tried to call manualSelectCheckCache, while page was being refreshed.');\n $('.manualSearchButton').removeAttr('disabled');\n repeat = true;\n }\n });\n }\n\n setTimeout(checkCacheUpdates, 2000); // Click event for the reload results and force search buttons\n\n $(document.body).on('click', '.manualSearchButton', event => {\n event.preventDefault();\n $('.manualSearchButton').prop('disabled', true);\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const forceSearch = $(event.currentTarget).attr('data-force-search');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + \" indexerName: \".concat(indexerName, \", seriesId: \").concat(seriesId, \", season: \").concat(season, \", episode: \").concat(episode));\n return;\n }\n\n if ($.isNumeric(seriesId) && $.isNumeric(season) && $.isNumeric(episode)) {\n updateSpinner('Started a forced manual search...', true);\n $.getJSON('home/snatchSelection', {\n indexername: indexerName,\n seriesid: seriesId,\n season,\n episode,\n manual_search_type: manualSearchType,\n // eslint-disable-line camelcase\n perform_search: forceSearch // eslint-disable-line camelcase\n\n }); // Force the search, but give the checkCacheUpdates the time to start up a search thread\n\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 2000);\n }\n }); // Moved and rewritten this from displayShow. This changes the button when clicked for collapsing/expanding the\n // \"Show History\" button to show or hide the snatch/download/failed history for a manual searched episode or pack.\n\n $('#popover').popover({\n placement: 'bottom',\n html: true,\n // Required if content has HTML\n content: '
'\n }).on('shown.bs.popover', () => {\n // Bootstrap popover event triggered when the popover opens\n $.tablesorter.columnSelector.attachTo($('#srchresults'), '#popover-target');\n });\n $('#btnReset').click(() => {\n $('#showTable').trigger('saveSortReset') // Clear saved sort\n .trigger('sortReset'); // Reset current table sort\n\n return false;\n });\n initTableSorter('#srchresults');\n this.reflowLayout();\n $('body').on('hide.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Show History');\n $('#wrapper').prop('data-history-toggle', 'hide');\n });\n $('body').on('show.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Hide History');\n $('#wrapper').prop('data-history-toggle', 'show');\n });\n $(document.body).on('click', '.release-name-ellipses, .release-name-ellipses-toggled', event => {\n const target = $(event.currentTarget);\n\n if (target.hasClass('release-name-ellipses')) {\n target.switchClass('release-name-ellipses', 'release-name-ellipses-toggled', 100);\n } else {\n target.switchClass('release-name-ellipses-toggled', 'release-name-ellipses', 100);\n }\n });\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n ShowHistory: _show_history_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config,\n history: state => state.history\n }), {}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired',\n getShowHistoryBySlug: 'getShowHistoryBySlug'\n }), {\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return Number(this.$route.query.season) || undefined;\n },\n\n episode() {\n return Number(this.$route.query.episode) || undefined;\n },\n\n showHistory() {\n const {\n getShowHistoryBySlug,\n show\n } = this;\n\n if (!show) {\n return;\n }\n\n const history = getShowHistoryBySlug(show.id.slug);\n return history;\n }\n\n }),\n methods: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getHistory: 'getHistory'\n }), {\n /**\n * Attaches IMDB tooltip,\n */\n reflowLayout() {\n attachImdbTooltip(); // eslint-disable-line no-undef\n },\n\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (this.$store.state.search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n /** Disabled for now. Because global + series ignored can be concatenated or excluded. So it's not that simple to color them. */\n // if (this.show.config.release.ignoredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-ignored');\n // }\n // if (this.show.config.release.requiredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-required');\n // }\n\n\n return classes.join(' ');\n }\n\n }),\n\n mounted() {\n const {\n getHistory,\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n });\n getHistory(); // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n }\n\n this.$watch('show', () => {\n this.$nextTick(() => this.reflowLayout());\n });\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.reflowLayout();\n });\n });\n\n const updateSpinner = function updateSpinner(message, showSpinner) {\n // Get spinner object as needed\n const spinner = $('#searchNotification');\n\n if (showSpinner) {\n message = ' ' + message;\n }\n\n $(spinner).empty().append(message);\n }; // Check the previous status of the history table, for hidden or shown, through the data attribute\n // data-history-toggle-hidden\n\n\n function toggleHistoryTable() {\n // eslint-disable-line no-unused-vars\n // Get previous state which was saved on the wrapper\n const showOrHide = $('#wrapper').attr('data-history-toggle');\n $('#historydata').collapse(showOrHide);\n }\n\n $.fn.loadContainer = function (path, loadingTxt, errorTxt, callback) {\n updateSpinner(loadingTxt);\n $('#manualSearchMeta').load(path + ' #manualSearchMeta meta');\n $(this).load(path + ' #manualSearchTbody tr', (response, status) => {\n if (status === 'error') {\n updateSpinner(errorTxt, false);\n }\n\n if (typeof callback !== 'undefined') {\n callback();\n }\n });\n }; // Click event for the download button for snatching a result\n\n\n $(document.body).on('click', '.epManualSearch', event => {\n event.preventDefault();\n const link = event.currentTarget;\n $(link).children('img').prop('src', 'images/loading16.gif');\n $.getJSON(event.currentTarget.href, data => {\n if (data.result === 'success') {\n $(link).children('img').prop('src', 'images/save.png');\n } else {\n $(link).children('img').prop('src', 'images/no16.png');\n }\n });\n });\n\n function initTableSorter(table) {\n // Nasty hack to re-initialize tablesorter after refresh\n $(table).tablesorter({\n widgets: ['saveSort', 'stickyHeaders', 'columnSelector', 'filter'],\n widgetOptions: {\n filter_columnFilters: true,\n // eslint-disable-line camelcase\n filter_hideFilters: true,\n // eslint-disable-line camelcase\n filter_saveFilters: true,\n // eslint-disable-line camelcase\n columnSelector_saveColumns: true,\n // eslint-disable-line camelcase\n columnSelector_layout: '',\n // eslint-disable-line camelcase\n columnSelector_mediaquery: false,\n // eslint-disable-line camelcase\n columnSelector_cssChecked: 'checked' // eslint-disable-line camelcase\n\n },\n textExtraction: function () {\n return {\n // 2: Provider\n 2(node) {\n return $(node).find('img').attr('title');\n },\n\n // 6: The size column needs an explicit field for the filtering on raw size.\n 6(node) {\n return node.getAttribute('data-size');\n },\n\n // 9: Published date\n 9(node) {\n return node.getAttribute('data-datetime');\n },\n\n // 10: Added date\n 10(node) {\n return node.getAttribute('data-datetime');\n }\n\n };\n }(),\n headers: {\n 9: {\n sorter: 'realISODate'\n },\n // Published\n 10: {\n sorter: 'realISODate'\n },\n // Added\n 11: {\n sorter: false,\n parser: false\n } // Snatch link\n\n }\n });\n }\n\n function checkCacheUpdates(repeat) {\n let pollInterval = 5000;\n repeat = repeat || true;\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const data = $('meta[data-last-prov-updates]').data('last-prov-updates');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + \" indexerName: \".concat(indexerName, \", seriesId: \").concat(seriesId, \", season: \").concat(season, \", episode: \").concat(episode));\n return;\n }\n\n let urlParams = '?indexername=' + indexerName + '&seriesid=' + seriesId + '&season=' + season + '&episode=' + episode;\n\n if (manualSearchType === 'season') {\n urlParams += '&manual_search_type=' + manualSearchType;\n }\n\n if (!$.isNumeric(seriesId) || !$.isNumeric(season) || !$.isNumeric(episode)) {\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 200);\n }\n\n $.ajax({\n url: 'home/manualSearchCheckCache' + urlParams,\n type: 'GET',\n data,\n contentType: 'application/json',\n\n error() {\n // Repeat = false;\n console.log('Error occurred!!');\n $('.manualSearchButton').removeAttr('disabled');\n },\n\n complete() {\n if (repeat) {\n setTimeout(checkCacheUpdates, pollInterval);\n }\n },\n\n timeout: 15000 // Timeout after 15s\n\n }).done(data => {\n // @TODO: Combine the lower if statements\n if (data === '') {\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n }\n\n if (data.result === 'refresh') {\n window.location.reload();\n updateSpinner('Refreshed results...', true);\n }\n\n if (data.result === 'searching') {\n // Ep is searched, you will get a results any minute now\n pollInterval = 5000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode is being searched, please wait......', true);\n }\n\n if (data.result === 'queued') {\n // Ep is queued, this might take some time to get results\n pollInterval = 7000;\n $('.manualSearchButton').prop('disabled', true);\n updateSpinner('The episode has been queued, because another search is taking place. please wait..', true);\n }\n\n if (data.result === 'finished') {\n // Ep search is finished\n updateSpinner('Search finished', false);\n $('.manualSearchButton').removeAttr('disabled');\n repeat = false;\n $('#srchresults').trigger('update', true);\n $('[datetime]').timeago();\n }\n\n if (data.result === 'error') {\n // Ep search is finished but with an error\n console.log('Probably tried to call manualSelectCheckCache, while page was being refreshed.');\n $('.manualSearchButton').removeAttr('disabled');\n repeat = true;\n }\n });\n }\n\n setTimeout(checkCacheUpdates, 2000); // Click event for the reload results and force search buttons\n\n $(document.body).on('click', '.manualSearchButton', event => {\n event.preventDefault();\n $('.manualSearchButton').prop('disabled', true);\n const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n const season = $('meta[data-last-prov-updates]').attr('data-season');\n const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n const forceSearch = $(event.currentTarget).attr('data-force-search');\n const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n return checkIsTrue;\n });\n\n if (!checkParams) {\n console.log('Something went wrong in getting the paramaters from dom.' + \" indexerName: \".concat(indexerName, \", seriesId: \").concat(seriesId, \", season: \").concat(season, \", episode: \").concat(episode));\n return;\n }\n\n if ($.isNumeric(seriesId) && $.isNumeric(season) && $.isNumeric(episode)) {\n updateSpinner('Started a forced manual search...', true);\n $.getJSON('home/snatchSelection', {\n indexername: indexerName,\n seriesid: seriesId,\n season,\n episode,\n manual_search_type: manualSearchType,\n // eslint-disable-line camelcase\n perform_search: forceSearch // eslint-disable-line camelcase\n\n }); // Force the search, but give the checkCacheUpdates the time to start up a search thread\n\n setTimeout(() => {\n checkCacheUpdates(true);\n }, 2000);\n }\n }); // Moved and rewritten this from displayShow. This changes the button when clicked for collapsing/expanding the\n // \"Show History\" button to show or hide the snatch/download/failed history for a manual searched episode or pack.\n\n $('#popover').popover({\n placement: 'bottom',\n html: true,\n // Required if content has HTML\n content: '
'\n }).on('shown.bs.popover', () => {\n // Bootstrap popover event triggered when the popover opens\n $.tablesorter.columnSelector.attachTo($('#srchresults'), '#popover-target');\n });\n $('#btnReset').click(() => {\n $('#showTable').trigger('saveSortReset') // Clear saved sort\n .trigger('sortReset'); // Reset current table sort\n\n return false;\n });\n initTableSorter('#srchresults');\n this.reflowLayout();\n $('body').on('hide.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Show History');\n $('#wrapper').prop('data-history-toggle', 'hide');\n });\n $('body').on('show.bs.collapse', '.collapse.toggle', () => {\n $('#showhistory').text('Hide History');\n $('#wrapper').prop('data-history-toggle', 'show');\n });\n $(document.body).on('click', '.release-name-ellipses, .release-name-ellipses-toggled', event => {\n const target = $(event.currentTarget);\n\n if (target.hasClass('release-name-ellipses')) {\n target.switchClass('release-name-ellipses', 'release-name-ellipses-toggled', 100);\n } else {\n target.switchClass('release-name-ellipses-toggled', 'release-name-ellipses', 100);\n }\n });\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -701,6 +713,17 @@ eval("exports = module.exports = __webpack_require__(/*! ../../node_modules/css- /***/ }), +/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./src/components/show-history.vue?vue&type=style&index=0&id=c645b858&scoped=true&lang=css&": +/*!***************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./src/components/show-history.vue?vue&type=style&index=0&id=c645b858&scoped=true&lang=css& ***! + \***************************************************************************************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("exports = module.exports = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.i, \"\\n.show-history-wrapper[data-v-c645b858] {\\n display: table-row;\\n column-span: all;\\n}\\n.show-history-wrapper[data-v-c645b858] table.subtitle-table tr {\\n background-color: rgb(190, 222, 237);\\n}\\n.show-history-wrapper > td[data-v-c645b858] {\\n padding: 0;\\n}\\n.search-question[data-v-c645b858],\\n.loading-message[data-v-c645b858] {\\n background-color: rgb(51, 51, 51);\\n color: rgb(255, 255, 255);\\n padding: 10px;\\n line-height: 55px;\\n}\\nspan.subtitle-name[data-v-c645b858] {\\n color: rgb(0, 0, 0);\\n}\\n\", \"\"]);\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./src/components/snatch-selection.vue?vue&type=style&index=0&lang=css&": /*!*******************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./src/components/snatch-selection.vue?vue&type=style&index=0&lang=css& ***! @@ -1142,6 +1165,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/show-history.vue?vue&type=template&id=c645b858&scoped=true&": +/*!******************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/show-history.vue?vue&type=template&id=c645b858&scoped=true& ***! + \******************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\",\n class: { fanartBackground: _vm.config.fanartBackground }\n },\n [\n _vm.showHistoryByEpisode.length > 0\n ? _c(\"vue-good-table\", {\n attrs: {\n columns: _vm.columns,\n rows: _vm.showHistoryByEpisode,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\"\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./src/components/sub-menu.vue?vue&type=template&id=0f7fe6dc&scoped=true&": /*!**************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/sub-menu.vue?vue&type=template&id=0f7fe6dc&scoped=true& ***! @@ -1375,6 +1410,17 @@ eval("// style-loader: Adds some css to the DOM by adding a From 692aa74be1d240444a211d3980cc184b6dd8e3b5 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sat, 30 May 2020 15:47:57 +0200 Subject: [PATCH 16/87] Added store and actions for provider.js. * Added webSocket support for provider's search results. --- themes-default/slim/src/components/index.js | 1 + themes-default/slim/src/store/index.js | 4 + .../slim/src/store/modules/defaults.js | 6 + .../slim/src/store/modules/index.js | 1 + .../slim/src/store/modules/provider.js | 148 ++++++++++++++++++ .../slim/src/store/mutation-types.js | 10 +- 6 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 themes-default/slim/src/store/modules/provider.js diff --git a/themes-default/slim/src/components/index.js b/themes-default/slim/src/components/index.js index 2a11b26f24..02d936483c 100644 --- a/themes-default/slim/src/components/index.js +++ b/themes-default/slim/src/components/index.js @@ -22,6 +22,7 @@ export { default as RootDirs } from './root-dirs.vue'; export { default as Schedule } from './schedule.vue'; export { default as ShowHeader } from './show-header.vue'; export { default as ShowHistory } from './show-history.vue'; +export { default as ShowResults } from './show-results.vue'; export { default as SnatchSelection } from './snatch-selection.vue'; export { default as Status } from './status.vue'; export { default as SubMenu } from './sub-menu.vue'; diff --git a/themes-default/slim/src/store/index.js b/themes-default/slim/src/store/index.js index 34330e611d..66cb1bfdb4 100644 --- a/themes-default/slim/src/store/index.js +++ b/themes-default/slim/src/store/index.js @@ -14,6 +14,7 @@ import { notifications, notifiers, postprocessing, + provider, search, shows, socket, @@ -45,6 +46,7 @@ const store = new Store({ notifications, notifiers, postprocessing, + provider, search, shows, socket, @@ -75,6 +77,8 @@ const passToStoreHandler = function(eventName, event, next) { this.store.dispatch('updateConfig', { section, config }); } else if (event === 'showUpdated') { this.store.dispatch('updateShow', data); + } else if (event === 'addManualSearchResult') { + this.store.dispatch('addManualSearchResult', data); } else { window.displayNotification('info', event, data); } diff --git a/themes-default/slim/src/store/modules/defaults.js b/themes-default/slim/src/store/modules/defaults.js index f709a2ee69..84396f172b 100644 --- a/themes-default/slim/src/store/modules/defaults.js +++ b/themes-default/slim/src/store/modules/defaults.js @@ -95,6 +95,12 @@ const state = { // but we currently check to see if this property is defined before fetching the show with `?episodes=true`. // seasons: [], episodeCount: null + }, + provider: { + id: null, + name: null, + config: {}, + cache: [] } }; diff --git a/themes-default/slim/src/store/modules/index.js b/themes-default/slim/src/store/modules/index.js index 6991c4d3da..c147934647 100644 --- a/themes-default/slim/src/store/modules/index.js +++ b/themes-default/slim/src/store/modules/index.js @@ -10,6 +10,7 @@ export { default as metadata } from './metadata'; export { default as notifications } from './notifications'; export { default as notifiers } from './notifiers'; export { default as postprocessing } from './postprocessing'; +export { default as provider } from './provider'; export { default as search } from './search'; export { default as shows } from './shows'; export { default as socket } from './socket'; diff --git a/themes-default/slim/src/store/modules/provider.js b/themes-default/slim/src/store/modules/provider.js new file mode 100644 index 0000000000..e7cecc5f6b --- /dev/null +++ b/themes-default/slim/src/store/modules/provider.js @@ -0,0 +1,148 @@ +import Vue from 'vue'; + +import { api } from '../../api'; +import { ADD_PROVIDERS, ADD_PROVIDER_CACHE, ADD_SEARCH_RESULTS, SET_PROVIDER_CACHE } from '../mutation-types'; + +const state = { + providers: {} +}; + +const mutations = { + [ADD_PROVIDERS](state, providers) { + for (const provider of providers) { + Vue.set(state.providers, provider.id, { ...state.providers[provider.id], ...provider }); + } + }, + [ADD_PROVIDER_CACHE](state, { providerId, cache }) { + // Check if this provider has already been added. + if (!state.providers[providerId]) { + state.providers[providerId] = { + name: '', + config: {}, + cache: [] + }; + } + + Vue.set(state.providers[providerId], 'cache', [...state.providers[providerId].cache || [], ...cache]); + }, + [SET_PROVIDER_CACHE](state, { providerId, cache }) { + Vue.set(state.providers[providerId], 'cache', cache); + }, + /** + * Add search results which have been retreived through the webSocket. + * @param {*} state - Vue state + * @param {Array} searchResults - One or more search results. + */ + [ADD_SEARCH_RESULTS](state, searchResults) { + for (const searchResult of searchResults) { + const { cache } = state.providers[searchResult.provider.id]; + + // Check if we don't allready have this result in our store. + // In that case, we update the existing object. + const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier); + if (existingSearchResult) { + // Because this is an existing result, whe're not overwriting the dateAdded field and time field. + const { dateAdded, time, ...rest } = existingSearchResult; + Vue.set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), rest); + } else { + Vue.set(state.providers[searchResult.provider.id], 'cache', [...cache || [], ...[searchResult]]); + } + } + } +}; + +const getters = {}; + +/** + * An object representing request parameters for getting a show from the API. + * + * @typedef {object} ShowGetParameters + * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering) + * @property {boolean} episodes Fetch seasons & episodes? + */ + +const actions = { + /** + * Get providers. + * + * @param {*} context The store context. + * @returns {Promise} The API response. + */ + getProviders(context) { + return new Promise((resolve, reject) => { + const { commit } = context; + api.get('/providers') + .then(response => { + commit(ADD_PROVIDERS, response.data); + resolve(); + }) + .catch(error => { + console.error(`Could not get providers with error: ${error}`); + reject(); + }); + }); + }, + /** + * Get provider cache results for enabled providers. + * + * @param {*} context The store context. + * @param {String} The provider id. + * @returns {void}. + */ + async getProviderCacheResults(context, { showSlug, season, episode }) { + const { commit, state } = context; + const limit = 1000; + const params = { limit, showslug: showSlug, season }; + if (episode) { + params.episode = episode; + } + + let page = 0; + let lastPage = false; + let response = null; + + for (const provider in state.providers) { + if (!state.providers[provider].config.enabled) { + continue; + } + + // Empty the providers cache + commit(SET_PROVIDER_CACHE, { providerId: provider, cache: [] }); + + const { id: providerId } = state.providers[provider]; + + page = 0; + lastPage = false; + + while (!lastPage) { + page += 1; + + params.page = page; + response = await api.get(`/providers/${providerId}/results`, { params }); // eslint-disable-line no-await-in-loop + commit(ADD_PROVIDER_CACHE, { providerId, cache: response.data }); + + if (response.data.length < limit) { + lastPage = true; + } + } + } + }, + /** + * Get provider cache results for enabled providers. + * + * @param {*} context The store context. + * @param {String} The provider id. + * @returns {void}. + */ + addManualSearchResult({ commit }, searchResult) { + commit(ADD_SEARCH_RESULTS, [searchResult]); + } + +}; + +export default { + state, + mutations, + getters, + actions +}; diff --git a/themes-default/slim/src/store/mutation-types.js b/themes-default/slim/src/store/mutation-types.js index 46fde1ff65..72c4429fec 100644 --- a/themes-default/slim/src/store/mutation-types.js +++ b/themes-default/slim/src/store/mutation-types.js @@ -24,6 +24,10 @@ const REMOVE_SHOW_SCENE_EXCEPTION = '📺 Remove a scene exception'; const ADD_HISTORY = '📺 History added to store'; const ADD_SHOW_HISTORY = '📺 Show specific History added to store'; const ADD_SHOW_EPISODE_HISTORY = "📺 Show's episode specific History added to store"; +const ADD_PROVIDERS = '⛽ Provider list added to store'; +const ADD_PROVIDER_CACHE = '⛽ Provider cache results added to store'; +const SET_PROVIDER_CACHE = '⛽ Provider cache results set in store'; +const ADD_SEARCH_RESULTS = '⛽ New search results added for provider'; export { LOGIN_PENDING, @@ -51,5 +55,9 @@ export { ADD_SHOW_SCENE_EXCEPTION, REMOVE_SHOW_SCENE_EXCEPTION, ADD_SHOW_HISTORY, - ADD_SHOW_EPISODE_HISTORY + ADD_SHOW_EPISODE_HISTORY, + ADD_PROVIDERS, + ADD_PROVIDER_CACHE, + ADD_SEARCH_RESULTS, + SET_PROVIDER_CACHE }; From f4836d4f2f2e33905bc2e0e84fb41c21a4009ec6 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sat, 30 May 2020 15:48:38 +0200 Subject: [PATCH 17/87] Updated snatch-selection.vue with components for history and results. --- .../slim/src/components/show-history.vue | 17 +- .../slim/src/components/snatch-selection.vue | 156 ++++++++++++++++-- themes-default/slim/src/utils/core.js | 10 ++ themes/dark/assets/js/medusa-runtime.js | 152 ++++++++++++----- themes/light/assets/js/medusa-runtime.js | 152 ++++++++++++----- 5 files changed, 383 insertions(+), 104 deletions(-) diff --git a/themes-default/slim/src/components/show-history.vue b/themes-default/slim/src/components/show-history.vue index c3a364d1c1..4745b92fbd 100644 --- a/themes-default/slim/src/components/show-history.vue +++ b/themes-default/slim/src/components/show-history.vue @@ -1,8 +1,13 @@ @@ -31,16 +23,17 @@ import { mapState, mapGetters, mapActions } from 'vuex'; import { AppLink } from './helpers'; import ShowHeader from './show-header.vue'; import ShowHistory from './show-history.vue'; +import ShowResults from './show-results.vue'; import Backstretch from './backstretch.vue'; export default { name: 'snatch-selection', template: '#snatch-selection-template', components: { - AppLink, Backstretch, ShowHeader, - ShowHistory + ShowHistory, + ShowResults }, metaInfo() { if (!this.show || !this.show.title) { @@ -423,7 +416,7 @@ export default { }; - diff --git a/themes-default/slim/src/utils/core.js b/themes-default/slim/src/utils/core.js index cbbca79010..e6125ccd8a 100644 --- a/themes-default/slim/src/utils/core.js +++ b/themes-default/slim/src/utils/core.js @@ -175,3 +175,13 @@ export const waitFor = /* istanbul ignore next */ async (check, poll = 100, time } return ms; }; + +/** + * Transform a season and episode number to an episode slug. + * @param {number} season - Season number. + * @param {number} episode - Episode number. + * @returns {string} Episode slug. + */ +export const episodeToSlug = (season, episode) => { + return `s${season.toString().padStart(2, '0')}e${episode.toString().padStart(2, '0')}`; +}; diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index 3667a0da71..e53bda8d00 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -536,7 +536,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n\n /**\n * Vue-good-table sort overwrite function.\n * @param {Object} x - row1 value for column.\n * @param {object} y - row2 value for column.\n * @returns {Boolean} - if we want to display this row before the next\n */\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'status',\n sortable: false\n }, {\n label: 'Provider',\n sortable: false,\n field: 'provider.name'\n }, {\n label: 'Release',\n field: 'resource',\n sortable: false\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n sortable: false,\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: []\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return `s${season.toString().padStart(2, '0')}e${episode.toString().padStart(2, '0')}`;\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episodeSlug,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: episodeSlug()\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episodeSlug,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: episodeSlug()\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n\n /**\n * Vue-good-table sort overwrite function.\n * @param {Object} x - row1 value for column.\n * @param {object} y - row2 value for column.\n * @returns {Boolean} - if we want to display this row before the next\n */\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'status',\n sortable: false\n }, {\n label: 'Provider',\n sortable: false,\n field: 'provider.name'\n }, {\n label: 'Release',\n field: 'resource',\n sortable: false\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n sortable: false,\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return `s${season.toString().padStart(2, '0')}e${episode.toString().padStart(2, '0')}`;\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episodeSlug,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: episodeSlug()\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episodeSlug,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: episodeSlug()\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -600,6 +600,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ }), +/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./src/components/show-results.vue?vue&type=script&lang=js&": +/*!************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options!./src/components/show-results.vue?vue&type=script&lang=js& ***! + \************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"StateSwitch\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Date Added',\n field: 'dateAdded',\n type: 'date',\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Date Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_3__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n mounted() {\n const {\n getProviders,\n getProviderResults\n } = this;\n getProviders().then(() => {\n // We need to get the providers, before we know which providers to query.\n getProviderResults();\n });\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n providers: state => state.provider.providers\n }),\n\n combinedResults() {\n const {\n providers\n } = this;\n let results = [];\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache];\n }\n }\n\n return results;\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_3__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season\n } = this;\n const unwatch = this.$watch('show.id.slug', showSlug => {\n // Use apiv2 to get latest provider cache results\n getProviderCacheResults({\n showSlug,\n season,\n episode\n });\n unwatch();\n });\n },\n\n refreshResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_3__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = `Manual searching providers for episode ${episodes.join(' ,')}`;\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`started search for show: ${show.id.slug} episode: ${episodes[0]}`);\n this.loadingMessage = `started search for show: ${show.id.slug} episode: ${episodes[0]}`;\n }).catch(error => {\n console.error(String(error));\n });\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./src/components/snatch-selection.vue?vue&type=script&lang=js&": /*!****************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options!./src/components/snatch-selection.vue?vue&type=script&lang=js& ***! @@ -608,7 +620,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__[\"AppLink\"],\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n ShowHistory: _show_history_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config,\n history: state => state.history\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired',\n getShowHistoryBySlug: 'getShowHistoryBySlug',\n getEpisode: 'getEpisode'\n }),\n\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid);\n },\n\n season() {\n return Number(this.$route.query.season);\n },\n\n episode() {\n return Number(this.$route.query.episode);\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getHistory: 'getHistory'\n }),\n\n // /**\n // * Attaches IMDB tooltip,\n // */\n // reflowLayout() {\n // attachImdbTooltip(); // eslint-disable-line no-undef\n // },\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (this.$store.state.search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n /** Disabled for now. Because global + series ignored can be concatenated or excluded. So it's not that simple to color them. */\n // if (this.show.config.release.ignoredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-ignored');\n // }\n // if (this.show.config.release.requiredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-required');\n // }\n\n\n return classes.join(' ');\n }\n\n },\n\n mounted() {\n const {\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n }); // getHistory();\n // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n } // this.$watch('show', () => {\n // this.$nextTick(() => this.reflowLayout());\n // });\n // ['load', 'resize'].map(event => {\n // return window.addEventListener(event, () => {\n // this.reflowLayout();\n // });\n // });\n\n\n const updateSpinner = function (message, showSpinner) {\n // Get spinner object as needed\n const spinner = $('#searchNotification');\n\n if (showSpinner) {\n message = ' ' + message;\n }\n\n $(spinner).empty().append(message);\n }; // // Check the previous status of the history table, for hidden or shown, through the data attribute\n // // data-history-toggle-hidden\n // function toggleHistoryTable() { // eslint-disable-line no-unused-vars\n // // Get previous state which was saved on the wrapper\n // const showOrHide = $('#wrapper').attr('data-history-toggle');\n // $('#historydata').collapse(showOrHide);\n // }\n // $.fn.loadContainer = function(path, loadingTxt, errorTxt, callback) {\n // updateSpinner(loadingTxt);\n // $('#manualSearchMeta').load(path + ' #manualSearchMeta meta');\n // $(this).load(path + ' #manualSearchTbody tr', (response, status) => {\n // if (status === 'error') {\n // updateSpinner(errorTxt, false);\n // }\n // if (typeof callback !== 'undefined') {\n // callback();\n // }\n // });\n // };\n // // Click event for the download button for snatching a result\n // $(document.body).on('click', '.epManualSearch', event => {\n // event.preventDefault();\n // const link = event.currentTarget;\n // $(link).children('img').prop('src', 'images/loading16.gif');\n // $.getJSON(event.currentTarget.href, data => {\n // if (data.result === 'success') {\n // $(link).children('img').prop('src', 'images/save.png');\n // } else {\n // $(link).children('img').prop('src', 'images/no16.png');\n // }\n // });\n // });\n // function initTableSorter(table) {\n // // Nasty hack to re-initialize tablesorter after refresh\n // $(table).tablesorter({\n // widgets: ['saveSort', 'stickyHeaders', 'columnSelector', 'filter'],\n // widgetOptions: {\n // filter_columnFilters: true, // eslint-disable-line camelcase\n // filter_hideFilters: true, // eslint-disable-line camelcase\n // filter_saveFilters: true, // eslint-disable-line camelcase\n // columnSelector_saveColumns: true, // eslint-disable-line camelcase\n // columnSelector_layout: '', // eslint-disable-line camelcase\n // columnSelector_mediaquery: false, // eslint-disable-line camelcase\n // columnSelector_cssChecked: 'checked' // eslint-disable-line camelcase\n // },\n // textExtraction: (function() {\n // return {\n // // 2: Provider\n // 2(node) {\n // return $(node).find('img').attr('title');\n // },\n // // 6: The size column needs an explicit field for the filtering on raw size.\n // 6(node) {\n // return node.getAttribute('data-size');\n // },\n // // 9: Published date\n // 9(node) {\n // return node.getAttribute('data-datetime');\n // },\n // // 10: Added date\n // 10(node) {\n // return node.getAttribute('data-datetime');\n // }\n // };\n // })(),\n // headers: {\n // 9: { sorter: 'realISODate' }, // Published\n // 10: { sorter: 'realISODate' }, // Added\n // 11: { sorter: false, parser: false } // Snatch link\n // }\n // });\n // }\n // function checkCacheUpdates(repeat) {\n // let pollInterval = 5000;\n // repeat = repeat || true;\n // const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n // const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n // const season = $('meta[data-last-prov-updates]').attr('data-season');\n // const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n // const data = $('meta[data-last-prov-updates]').data('last-prov-updates');\n // const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n // const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n // return checkIsTrue;\n // });\n // if (!checkParams) {\n // console.log(\n // 'Something went wrong in getting the paramaters from dom.' +\n // ` indexerName: ${indexerName}, seriesId: ${seriesId}, season: ${season}, episode: ${episode}`\n // );\n // return;\n // }\n // let urlParams = '?indexername=' + indexerName + '&seriesid=' + seriesId + '&season=' + season + '&episode=' + episode;\n // if (manualSearchType === 'season') {\n // urlParams += '&manual_search_type=' + manualSearchType;\n // }\n // if (!$.isNumeric(seriesId) || !$.isNumeric(season) || !$.isNumeric(episode)) {\n // setTimeout(() => {\n // checkCacheUpdates(true);\n // }, 200);\n // }\n // $.ajax({\n // url: 'home/manualSearchCheckCache' + urlParams,\n // type: 'GET',\n // data,\n // contentType: 'application/json',\n // error() {\n // // Repeat = false;\n // console.log('Error occurred!!');\n // $('.manualSearchButton').removeAttr('disabled');\n // },\n // complete() {\n // if (repeat) {\n // setTimeout(checkCacheUpdates, pollInterval);\n // }\n // },\n // timeout: 15000 // Timeout after 15s\n // }).done(data => {\n // // @TODO: Combine the lower if statements\n // if (data === '') {\n // updateSpinner('Search finished', false);\n // $('.manualSearchButton').removeAttr('disabled');\n // repeat = false;\n // }\n // if (data.result === 'refresh') {\n // window.location.reload();\n // updateSpinner('Refreshed results...', true);\n // }\n // if (data.result === 'searching') {\n // // Ep is searched, you will get a results any minute now\n // pollInterval = 5000;\n // $('.manualSearchButton').prop('disabled', true);\n // updateSpinner('The episode is being searched, please wait......', true);\n // }\n // if (data.result === 'queued') {\n // // Ep is queued, this might take some time to get results\n // pollInterval = 7000;\n // $('.manualSearchButton').prop('disabled', true);\n // updateSpinner('The episode has been queued, because another search is taking place. please wait..', true);\n // }\n // if (data.result === 'finished') {\n // // Ep search is finished\n // updateSpinner('Search finished', false);\n // $('.manualSearchButton').removeAttr('disabled');\n // repeat = false;\n // $('#srchresults').trigger('update', true);\n // $('[datetime]').timeago();\n // }\n // if (data.result === 'error') {\n // // Ep search is finished but with an error\n // console.log('Probably tried to call manualSelectCheckCache, while page was being refreshed.');\n // $('.manualSearchButton').removeAttr('disabled');\n // repeat = true;\n // }\n // });\n // }\n // setTimeout(checkCacheUpdates, 2000);\n // // Click event for the reload results and force search buttons\n // $(document.body).on('click', '.manualSearchButton', event => {\n // event.preventDefault();\n // $('.manualSearchButton').prop('disabled', true);\n // const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n // const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n // const season = $('meta[data-last-prov-updates]').attr('data-season');\n // const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n // const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n // const forceSearch = $(event.currentTarget).attr('data-force-search');\n // const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n // return checkIsTrue;\n // });\n // if (!checkParams) {\n // console.log(\n // 'Something went wrong in getting the paramaters from dom.' +\n // ` indexerName: ${indexerName}, seriesId: ${seriesId}, season: ${season}, episode: ${episode}`\n // );\n // return;\n // }\n // if ($.isNumeric(seriesId) && $.isNumeric(season) && $.isNumeric(episode)) {\n // updateSpinner('Started a forced manual search...', true);\n // $.getJSON('home/snatchSelection', {\n // indexername: indexerName,\n // seriesid: seriesId,\n // season,\n // episode,\n // manual_search_type: manualSearchType, // eslint-disable-line camelcase\n // perform_search: forceSearch // eslint-disable-line camelcase\n // });\n // // Force the search, but give the checkCacheUpdates the time to start up a search thread\n // setTimeout(() => {\n // checkCacheUpdates(true);\n // }, 2000);\n // }\n // });\n // Moved and rewritten this from displayShow. This changes the button when clicked for collapsing/expanding the\n // \"Show History\" button to show or hide the snatch/download/failed history for a manual searched episode or pack.\n // $('#popover').popover({\n // placement: 'bottom',\n // html: true, // Required if content has HTML\n // content: '
'\n // }).on('shown.bs.popover', () => { // Bootstrap popover event triggered when the popover opens\n // $.tablesorter.columnSelector.attachTo($('#srchresults'), '#popover-target');\n // });\n // $('#btnReset').click(() => {\n // $('#showTable')\n // .trigger('saveSortReset') // Clear saved sort\n // .trigger('sortReset'); // Reset current table sort\n // return false;\n // });\n // initTableSorter('#srchresults');\n // this.reflowLayout();\n // $('body').on('hide.bs.collapse', '.collapse.toggle', () => {\n // $('#showhistory').text('Show History');\n // $('#wrapper').prop('data-history-toggle', 'hide');\n // });\n // $('body').on('show.bs.collapse', '.collapse.toggle', () => {\n // $('#showhistory').text('Hide History');\n // $('#wrapper').prop('data-history-toggle', 'show');\n // });\n // $(document.body).on('click', '.release-name-ellipses, .release-name-ellipses-toggled', event => {\n // const target = $(event.currentTarget);\n // if (target.hasClass('release-name-ellipses')) {\n // target.switchClass('release-name-ellipses', 'release-name-ellipses-toggled', 100);\n // } else {\n // target.switchClass('release-name-ellipses-toggled', 'release-name-ellipses', 100);\n // }\n // });\n\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _show_results_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./show-results.vue */ \"./src/components/show-results.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n ShowHistory: _show_history_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n ShowResults: _show_results_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config,\n history: state => state.history\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired',\n getShowHistoryBySlug: 'getShowHistoryBySlug',\n getEpisode: 'getEpisode'\n }),\n\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid);\n },\n\n season() {\n return Number(this.$route.query.season);\n },\n\n episode() {\n return Number(this.$route.query.episode);\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getHistory: 'getHistory'\n }),\n\n // /**\n // * Attaches IMDB tooltip,\n // */\n // reflowLayout() {\n // attachImdbTooltip(); // eslint-disable-line no-undef\n // },\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (this.$store.state.search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n /** Disabled for now. Because global + series ignored can be concatenated or excluded. So it's not that simple to color them. */\n // if (this.show.config.release.ignoredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-ignored');\n // }\n // if (this.show.config.release.requiredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-required');\n // }\n\n\n return classes.join(' ');\n }\n\n },\n\n mounted() {\n const {\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n }); // getHistory();\n // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n } // this.$watch('show', () => {\n // this.$nextTick(() => this.reflowLayout());\n // });\n // ['load', 'resize'].map(event => {\n // return window.addEventListener(event, () => {\n // this.reflowLayout();\n // });\n // });\n\n\n const updateSpinner = function (message, showSpinner) {\n // Get spinner object as needed\n const spinner = $('#searchNotification');\n\n if (showSpinner) {\n message = ' ' + message;\n }\n\n $(spinner).empty().append(message);\n }; // // Check the previous status of the history table, for hidden or shown, through the data attribute\n // // data-history-toggle-hidden\n // function toggleHistoryTable() { // eslint-disable-line no-unused-vars\n // // Get previous state which was saved on the wrapper\n // const showOrHide = $('#wrapper').attr('data-history-toggle');\n // $('#historydata').collapse(showOrHide);\n // }\n // $.fn.loadContainer = function(path, loadingTxt, errorTxt, callback) {\n // updateSpinner(loadingTxt);\n // $('#manualSearchMeta').load(path + ' #manualSearchMeta meta');\n // $(this).load(path + ' #manualSearchTbody tr', (response, status) => {\n // if (status === 'error') {\n // updateSpinner(errorTxt, false);\n // }\n // if (typeof callback !== 'undefined') {\n // callback();\n // }\n // });\n // };\n // // Click event for the download button for snatching a result\n // $(document.body).on('click', '.epManualSearch', event => {\n // event.preventDefault();\n // const link = event.currentTarget;\n // $(link).children('img').prop('src', 'images/loading16.gif');\n // $.getJSON(event.currentTarget.href, data => {\n // if (data.result === 'success') {\n // $(link).children('img').prop('src', 'images/save.png');\n // } else {\n // $(link).children('img').prop('src', 'images/no16.png');\n // }\n // });\n // });\n // function initTableSorter(table) {\n // // Nasty hack to re-initialize tablesorter after refresh\n // $(table).tablesorter({\n // widgets: ['saveSort', 'stickyHeaders', 'columnSelector', 'filter'],\n // widgetOptions: {\n // filter_columnFilters: true, // eslint-disable-line camelcase\n // filter_hideFilters: true, // eslint-disable-line camelcase\n // filter_saveFilters: true, // eslint-disable-line camelcase\n // columnSelector_saveColumns: true, // eslint-disable-line camelcase\n // columnSelector_layout: '', // eslint-disable-line camelcase\n // columnSelector_mediaquery: false, // eslint-disable-line camelcase\n // columnSelector_cssChecked: 'checked' // eslint-disable-line camelcase\n // },\n // textExtraction: (function() {\n // return {\n // // 2: Provider\n // 2(node) {\n // return $(node).find('img').attr('title');\n // },\n // // 6: The size column needs an explicit field for the filtering on raw size.\n // 6(node) {\n // return node.getAttribute('data-size');\n // },\n // // 9: Published date\n // 9(node) {\n // return node.getAttribute('data-datetime');\n // },\n // // 10: Added date\n // 10(node) {\n // return node.getAttribute('data-datetime');\n // }\n // };\n // })(),\n // headers: {\n // 9: { sorter: 'realISODate' }, // Published\n // 10: { sorter: 'realISODate' }, // Added\n // 11: { sorter: false, parser: false } // Snatch link\n // }\n // });\n // }\n // function checkCacheUpdates(repeat) {\n // let pollInterval = 5000;\n // repeat = repeat || true;\n // const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n // const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n // const season = $('meta[data-last-prov-updates]').attr('data-season');\n // const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n // const data = $('meta[data-last-prov-updates]').data('last-prov-updates');\n // const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n // const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n // return checkIsTrue;\n // });\n // if (!checkParams) {\n // console.log(\n // 'Something went wrong in getting the paramaters from dom.' +\n // ` indexerName: ${indexerName}, seriesId: ${seriesId}, season: ${season}, episode: ${episode}`\n // );\n // return;\n // }\n // let urlParams = '?indexername=' + indexerName + '&seriesid=' + seriesId + '&season=' + season + '&episode=' + episode;\n // if (manualSearchType === 'season') {\n // urlParams += '&manual_search_type=' + manualSearchType;\n // }\n // if (!$.isNumeric(seriesId) || !$.isNumeric(season) || !$.isNumeric(episode)) {\n // setTimeout(() => {\n // checkCacheUpdates(true);\n // }, 200);\n // }\n // $.ajax({\n // url: 'home/manualSearchCheckCache' + urlParams,\n // type: 'GET',\n // data,\n // contentType: 'application/json',\n // error() {\n // // Repeat = false;\n // console.log('Error occurred!!');\n // $('.manualSearchButton').removeAttr('disabled');\n // },\n // complete() {\n // if (repeat) {\n // setTimeout(checkCacheUpdates, pollInterval);\n // }\n // },\n // timeout: 15000 // Timeout after 15s\n // }).done(data => {\n // // @TODO: Combine the lower if statements\n // if (data === '') {\n // updateSpinner('Search finished', false);\n // $('.manualSearchButton').removeAttr('disabled');\n // repeat = false;\n // }\n // if (data.result === 'refresh') {\n // window.location.reload();\n // updateSpinner('Refreshed results...', true);\n // }\n // if (data.result === 'searching') {\n // // Ep is searched, you will get a results any minute now\n // pollInterval = 5000;\n // $('.manualSearchButton').prop('disabled', true);\n // updateSpinner('The episode is being searched, please wait......', true);\n // }\n // if (data.result === 'queued') {\n // // Ep is queued, this might take some time to get results\n // pollInterval = 7000;\n // $('.manualSearchButton').prop('disabled', true);\n // updateSpinner('The episode has been queued, because another search is taking place. please wait..', true);\n // }\n // if (data.result === 'finished') {\n // // Ep search is finished\n // updateSpinner('Search finished', false);\n // $('.manualSearchButton').removeAttr('disabled');\n // repeat = false;\n // $('#srchresults').trigger('update', true);\n // $('[datetime]').timeago();\n // }\n // if (data.result === 'error') {\n // // Ep search is finished but with an error\n // console.log('Probably tried to call manualSelectCheckCache, while page was being refreshed.');\n // $('.manualSearchButton').removeAttr('disabled');\n // repeat = true;\n // }\n // });\n // }\n // setTimeout(checkCacheUpdates, 2000);\n // // Click event for the reload results and force search buttons\n // $(document.body).on('click', '.manualSearchButton', event => {\n // event.preventDefault();\n // $('.manualSearchButton').prop('disabled', true);\n // const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n // const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n // const season = $('meta[data-last-prov-updates]').attr('data-season');\n // const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n // const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n // const forceSearch = $(event.currentTarget).attr('data-force-search');\n // const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n // return checkIsTrue;\n // });\n // if (!checkParams) {\n // console.log(\n // 'Something went wrong in getting the paramaters from dom.' +\n // ` indexerName: ${indexerName}, seriesId: ${seriesId}, season: ${season}, episode: ${episode}`\n // );\n // return;\n // }\n // if ($.isNumeric(seriesId) && $.isNumeric(season) && $.isNumeric(episode)) {\n // updateSpinner('Started a forced manual search...', true);\n // $.getJSON('home/snatchSelection', {\n // indexername: indexerName,\n // seriesid: seriesId,\n // season,\n // episode,\n // manual_search_type: manualSearchType, // eslint-disable-line camelcase\n // perform_search: forceSearch // eslint-disable-line camelcase\n // });\n // // Force the search, but give the checkCacheUpdates the time to start up a search thread\n // setTimeout(() => {\n // checkCacheUpdates(true);\n // }, 2000);\n // }\n // });\n // Moved and rewritten this from displayShow. This changes the button when clicked for collapsing/expanding the\n // \"Show History\" button to show or hide the snatch/download/failed history for a manual searched episode or pack.\n // $('#popover').popover({\n // placement: 'bottom',\n // html: true, // Required if content has HTML\n // content: '
'\n // }).on('shown.bs.popover', () => { // Bootstrap popover event triggered when the popover opens\n // $.tablesorter.columnSelector.attachTo($('#srchresults'), '#popover-target');\n // });\n // $('#btnReset').click(() => {\n // $('#showTable')\n // .trigger('saveSortReset') // Clear saved sort\n // .trigger('sortReset'); // Reset current table sort\n // return false;\n // });\n // initTableSorter('#srchresults');\n // this.reflowLayout();\n // $('body').on('hide.bs.collapse', '.collapse.toggle', () => {\n // $('#showhistory').text('Show History');\n // $('#wrapper').prop('data-history-toggle', 'hide');\n // });\n // $('body').on('show.bs.collapse', '.collapse.toggle', () => {\n // $('#showhistory').text('Hide History');\n // $('#wrapper').prop('data-history-toggle', 'show');\n // });\n // $(document.body).on('click', '.release-name-ellipses, .release-name-ellipses-toggled', event => {\n // const target = $(event.currentTarget);\n // if (target.hasClass('release-name-ellipses')) {\n // target.switchClass('release-name-ellipses', 'release-name-ellipses-toggled', 100);\n // } else {\n // target.switchClass('release-name-ellipses-toggled', 'release-name-ellipses', 100);\n // }\n // });\n\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -930,7 +942,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.show-history-wrapper[data-v-c645b858] {\\n display: table-row;\\n column-span: all;\\n}\\n.show-history-wrapper[data-v-c645b858] table.subtitle-table tr {\\n background-color: rgb(190, 222, 237);\\n}\\n.show-history-wrapper > td[data-v-c645b858] {\\n padding: 0;\\n}\\n.search-question[data-v-c645b858],\\n.loading-message[data-v-c645b858] {\\n background-color: rgb(51, 51, 51);\\n color: rgb(255, 255, 255);\\n padding: 10px;\\n line-height: 55px;\\n}\\nspan.subtitle-name[data-v-c645b858] {\\n color: rgb(0, 0, 0);\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.show-history-wrapper[data-v-c645b858] table.subtitle-table tr {\\n background-color: rgb(190, 222, 237);\\n}\\n.show-history-wrapper > td[data-v-c645b858] {\\n padding: 0;\\n}\\n.search-question[data-v-c645b858],\\n.loading-message[data-v-c645b858] {\\n background-color: rgb(51, 51, 51);\\n color: rgb(255, 255, 255);\\n padding: 10px;\\n line-height: 55px;\\n}\\nspan.subtitle-name[data-v-c645b858] {\\n color: rgb(0, 0, 0);\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -956,14 +968,14 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /***/ }), -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./src/components/snatch-selection.vue?vue&type=style&index=0&lang=css&": -/*!*******************************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./src/components/snatch-selection.vue?vue&type=style&index=0&lang=css& ***! - \*******************************************************************************************************************************************************************************************************************************/ +/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./src/components/snatch-selection.vue?vue&type=style&index=0&id=0ad4c7fc&scoped=true&lang=css&": +/*!*******************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options!./src/components/snatch-selection.vue?vue&type=style&index=0&id=0ad4c7fc&scoped=true&lang=css& ***! + \*******************************************************************************************************************************************************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\nspan.global-ignored {\\n color: red;\\n}\\nspan.show-ignored {\\n color: red;\\n font-style: italic;\\n}\\nspan.global-required {\\n color: green;\\n}\\nspan.show-required {\\n color: green;\\n font-style: italic;\\n}\\nspan.global-undesired {\\n color: orange;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\nspan.global-ignored[data-v-0ad4c7fc] {\\n color: red;\\n}\\nspan.show-ignored[data-v-0ad4c7fc] {\\n color: red;\\n font-style: italic;\\n}\\nspan.global-required[data-v-0ad4c7fc] {\\n color: green;\\n}\\nspan.show-required[data-v-0ad4c7fc] {\\n color: green;\\n font-style: italic;\\n}\\nspan.global-undesired[data-v-0ad4c7fc] {\\n color: orange;\\n}\\n\\n/** Use this as table styling for all table layouts */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th:first-child,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-0ad4c7fc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\nshow-history[data-v-0ad4c7fc] {\\n margin-bottom: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1477,7 +1489,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\",\n class: { fanartBackground: _vm.config.fanartBackground }\n },\n [\n _vm.show.id.slug && _vm.history.length > 0\n ? _c(\"vue-good-table\", {\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\"\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-md-12 top-15 displayShow horizontal-scroll table-layout\",\n class: { fanartBackground: _vm.config.fanartBackground }\n },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.hideHistory ? \"Show History\" : \"Hide History\") +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression: \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\"\n }\n })\n ],\n 1\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1541,15 +1553,27 @@ 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/snatch-selection.vue?vue&type=template&id=0ad4c7fc&": -/*!**********************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/snatch-selection.vue?vue&type=template&id=0ad4c7fc& ***! - \**********************************************************************************************************************************************************************************************************/ +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./src/components/show-results.vue?vue&type=template&id=68e9fa36&scoped=true&": +/*!******************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/show-results.vue?vue&type=template&id=68e9fa36&scoped=true& ***! + \******************************************************************************************************************************************************************************************************************/ /*! exports provided: render, staticRenderFns */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _vm.show.id.slug\n ? _c(\"backstretch\", { attrs: { slug: _vm.show.id.slug } })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"show-header\", {\n ref: \"show-header\",\n attrs: {\n type: \"snatch-selection\",\n \"show-id\": _vm.id,\n \"show-indexer\": _vm.indexer,\n \"manual-search-type\": \"episode\"\n },\n on: {\n \"update-overview-status\": function($event) {\n _vm.filterByOverviewStatus = $event\n }\n }\n }),\n _vm._v(\" \"),\n _vm.show && _vm.season\n ? _c(\n \"show-history\",\n _vm._b(\n { key: _vm.show.id.slug + _vm.season + _vm.episode || \"\" },\n \"show-history\",\n { show: _vm.show, season: _vm.season, episode: _vm.episode },\n false\n )\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm._m(0)\n ],\n 1\n )\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12 horizontal-scroll\" }, [\n _c(\"div\", { staticClass: \"clearfix\" }),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"wrapper\", \"data-history-toggle\": \"hide\" } }, [\n _c(\"div\", { attrs: { id: \"container\" } }, [\n _vm._v(\"\\n Table here\\n \")\n ])\n ])\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-results-wrapper\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\",\n class: { fanartBackground: _vm.config.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"button-row\" },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Refresh Results\" },\n on: { click: _vm.refreshResults }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Force Search\" },\n on: { click: _vm.forceSearch }\n }),\n _vm._v(\" \"),\n _vm.loading\n ? [\n _c(\"state-switch\", { attrs: { state: \"loading\" } }),\n _vm._v(\" \"),\n _c(\"span\", [_vm._v(_vm._s(_vm.loadingMessage))])\n ]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show.id.slug,\n expression: \"show.id.slug\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.combinedResults,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"pubdate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\"\n }\n })\n ],\n 1\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./src/components/snatch-selection.vue?vue&type=template&id=0ad4c7fc&scoped=true&": +/*!**********************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/components/snatch-selection.vue?vue&type=template&id=0ad4c7fc&scoped=true& ***! + \**********************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"snatch-selection-template\",\n attrs: { id: \"snatch-selection-template\" }\n },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _vm.show.id.slug\n ? _c(\"backstretch\", { attrs: { slug: _vm.show.id.slug } })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"show-header\", {\n ref: \"show-header\",\n attrs: {\n type: \"snatch-selection\",\n \"show-id\": _vm.id,\n \"show-indexer\": _vm.indexer,\n \"manual-search-type\": \"episode\"\n },\n on: {\n \"update-overview-status\": function($event) {\n _vm.filterByOverviewStatus = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"show-history\",\n _vm._b(\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show && _vm.season,\n expression: \"show && season\"\n }\n ],\n key:\n \"history-\" +\n _vm.show.id.slug +\n \"-\" +\n _vm.season +\n \"-\" +\n (_vm.episode || \"\")\n },\n \"show-history\",\n { show: _vm.show, season: _vm.season, episode: _vm.episode },\n false\n )\n ),\n _vm._v(\" \"),\n _c(\n \"show-results\",\n _vm._b(\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show && _vm.season,\n expression: \"show && season\"\n }\n ],\n key:\n \"results-\" +\n _vm.show.id.slug +\n \"-\" +\n _vm.season +\n \"-\" +\n (_vm.episode || \"\"),\n staticClass: \"table-layout\"\n },\n \"show-results\",\n { show: _vm.show, season: _vm.season, episode: _vm.episode },\n false\n )\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1885,14 +1909,14 @@ eval("// style-loader: Adds some css to the DOM by adding a From f29ba895b5bfbc11891ec138871dc609dde9fcbb Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sun, 7 Jun 2020 19:04:20 +0200 Subject: [PATCH 35/87] Fixed vue-good-table styling --- .../slim/src/components/snatch-selection.vue | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/themes-default/slim/src/components/snatch-selection.vue b/themes-default/slim/src/components/snatch-selection.vue index ad7ee44092..53efcba61a 100644 --- a/themes-default/slim/src/components/snatch-selection.vue +++ b/themes-default/slim/src/components/snatch-selection.vue @@ -567,6 +567,49 @@ span.global-undesired { display: inline-block; } +.snatch-selection-template >>> .fanartBackground { + clear: both; + opacity: 0.9; +} + +.snatch-selection-template >>> .fanartBackground table { + table-layout: auto; + width: 100%; + border-collapse: collapse; + border-spacing: 0; + text-align: center; + border: none; + empty-cells: show; + color: rgb(0, 0, 0) !important; +} + +.snatch-selection-template >>> .fanartBackground > table th.vgt-row-header { + border: none !important; + background-color: transparent !important; + color: rgb(255, 255, 255) !important; + padding-top: 15px !important; + text-align: left !important; +} + +.snatch-selection-template >>> .fanartBackground td.col-search { + text-align: center; +} + +.snatch-selection-template >>> .skipped { + background-color: rgb(190, 222, 237); +} + +.snatch-selection-template >>> .snatched { + background-color: rgb(235, 193, 234); +} + +.snatch-selection-template >>> .downloaded { + background-color: rgb(255, 218, 138); +} + +.snatch-selection-template >>> .failed { + background-color: rgb(255, 153, 153); +} show-history { margin-bottom: 10px; } From 402f170e11b5e9c49b4257a981246f1074cdb651 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sun, 7 Jun 2020 19:04:52 +0200 Subject: [PATCH 36/87] Also the setCurrentTab fix. --- themes-default/slim/src/store/modules/config/layout.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/themes-default/slim/src/store/modules/config/layout.js b/themes-default/slim/src/store/modules/config/layout.js index a3f2ec2d4a..1093553f62 100644 --- a/themes-default/slim/src/store/modules/config/layout.js +++ b/themes-default/slim/src/store/modules/config/layout.js @@ -164,6 +164,12 @@ const actions = { section: 'layout', config: { [key]: value } }); }); + }, + setCurrentTab(context, value) { + const { commit } = context; + return commit(ADD_CONFIG, { + section: 'layout', config: { currentShowTab: value } + }); } }; From f95aef16531249063491d0fa34aff09967c2b5d6 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sun, 7 Jun 2020 19:05:26 +0200 Subject: [PATCH 37/87] updated history.js and provider.js stores. --- .../slim/src/store/modules/history.js | 24 +++++++++++-------- .../slim/src/store/modules/provider.js | 11 +++++---- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/themes-default/slim/src/store/modules/history.js b/themes-default/slim/src/store/modules/history.js index f6e2c10e31..7a4a517b87 100644 --- a/themes-default/slim/src/store/modules/history.js +++ b/themes-default/slim/src/store/modules/history.js @@ -123,17 +123,21 @@ const actions = { * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters. * @returns {Promise} The API response. */ - async getShowEpisodeHistory(context, { showSlug, episodeSlug }) { - const { commit } = context; + getShowEpisodeHistory(context, { showSlug, episodeSlug }) { + return new Promise(resolve => { + const { commit } = context; - try { - const response = await api.get(`/history/${showSlug}/episode/${episodeSlug}`); - if (response.data.length > 0) { - commit(ADD_SHOW_EPISODE_HISTORY, { showSlug, episodeSlug, history: response.data }); - } - } catch { - console.warn(`No episode history found for show ${showSlug} and episode ${episodeSlug}`); - } + api.get(`/history/${showSlug}/episode/${episodeSlug}`) + .then(response => { + if (response.data.length > 0) { + commit(ADD_SHOW_EPISODE_HISTORY, { showSlug, episodeSlug, history: response.data }); + } + resolve(); + }) + .catch(() => { + console.warn(`No episode history found for show ${showSlug} and episode ${episodeSlug}`); + }); + }); } }; diff --git a/themes-default/slim/src/store/modules/provider.js b/themes-default/slim/src/store/modules/provider.js index 9255c2509d..be62e6b869 100644 --- a/themes-default/slim/src/store/modules/provider.js +++ b/themes-default/slim/src/store/modules/provider.js @@ -119,11 +119,14 @@ const actions = { params.page = page; response = await api.get(`/providers/${providerId}/results`, { params }); // eslint-disable-line no-await-in-loop - commit(ADD_PROVIDER_CACHE, { providerId, cache: response.data }); + return new Promise(resolve => { + commit(ADD_PROVIDER_CACHE, { providerId, cache: response.data }); - if (response.data.length < limit) { - lastPage = true; - } + if (response.data.length < limit) { + lastPage = true; + } + resolve(); + }); } } }, From 8d8319fdd808560e1ec46c6601a11cb0c2130391 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sun, 7 Jun 2020 19:05:53 +0200 Subject: [PATCH 38/87] runtime bundles --- themes/dark/assets/js/medusa-runtime.js | 28 ++++++++++++------------ themes/light/assets/js/medusa-runtime.js | 28 ++++++++++++------------ 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index 36cb3ea034..28eaa4c438 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -104,7 +104,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api.js */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config-notifications',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTemplate\"],\n ConfigTextbox: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextbox\"],\n ConfigTextboxNumber: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextboxNumber\"],\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigToggleSlider\"],\n SelectList: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"SelectList\"],\n ShowSelector: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ShowSelector\"]\n },\n\n data() {\n return {\n prowlSelectedShow: null,\n prowlSelectedShowApiKeys: [],\n prowlPriorityOptions: [{\n text: 'Very Low',\n value: -2\n }, {\n text: 'Moderate',\n value: -1\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 1\n }, {\n text: 'Emergency',\n value: 2\n }],\n pushoverPriorityOptions: [{\n text: 'Lowest',\n value: -2\n }, {\n text: 'Low',\n value: -1\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 1\n }, {\n text: 'Emergency',\n value: 2\n }],\n pushoverSoundOptions: [{\n text: 'Default',\n value: 'default'\n }, {\n text: 'Pushover',\n value: 'pushover'\n }, {\n text: 'Bike',\n value: 'bike'\n }, {\n text: 'Bugle',\n value: 'bugle'\n }, {\n text: 'Cash Register',\n value: 'cashregister'\n }, {\n text: 'classical',\n value: 'classical'\n }, {\n text: 'Cosmic',\n value: 'cosmic'\n }, {\n text: 'Falling',\n value: 'falling'\n }, {\n text: 'Gamelan',\n value: 'gamelan'\n }, {\n text: 'Incoming',\n value: 'incoming'\n }, {\n text: 'Intermission',\n value: 'intermission'\n }, {\n text: 'Magic',\n value: 'magic'\n }, {\n text: 'Mechanical',\n value: 'mechanical'\n }, {\n text: 'Piano Bar',\n value: 'pianobar'\n }, {\n text: 'Siren',\n value: 'siren'\n }, {\n text: 'Space Alarm',\n value: 'spacealarm'\n }, {\n text: 'Tug Boat',\n value: 'tugboat'\n }, {\n text: 'Alien Alarm (long)',\n value: 'alien'\n }, {\n text: 'Climb (long)',\n value: 'climb'\n }, {\n text: 'Persistent (long)',\n value: 'persistant'\n }, {\n text: 'Pushover Echo (long)',\n value: 'echo'\n }, {\n text: 'Up Down (long)',\n value: 'updown'\n }, {\n text: 'None (silent)',\n value: 'none'\n }],\n pushbulletDeviceOptions: [{\n text: 'All devices',\n value: ''\n }],\n traktMethodOptions: [{\n text: 'Skip all',\n value: 0\n }, {\n text: 'Download pilot only',\n value: 1\n }, {\n text: 'Get whole show',\n value: 2\n }],\n pushbulletTestInfo: 'Click below to test.',\n joinTestInfo: 'Click below to test.',\n twitterTestInfo: 'Click below to test.',\n twitterKey: '',\n emailSelectedShow: null,\n emailSelectedShowAdresses: []\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n indexers: state => state.config.indexers,\n notifiers: state => state.config.notifiers\n }),\n\n traktNewTokenMessage() {\n const {\n accessToken\n } = this.notifiers.trakt;\n return true ? 'New ' : undefined;\n },\n\n traktIndexersOptions() {\n const {\n indexers\n } = this;\n const {\n traktIndexers\n } = indexers.main;\n const validTraktIndexer = Object.keys(indexers.indexers).filter(k => traktIndexers[k]);\n return validTraktIndexer.map(indexer => {\n return {\n text: indexer,\n value: indexers.indexers[indexer].id\n };\n });\n }\n\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n mounted() {\n // TODO: vueify this.\n $('#trakt_pin').on('keyup change', () => {\n if ($('#trakt_pin').val().length === 0) {\n $('#TraktGetPin').removeClass('hide');\n $('#authTrakt').addClass('hide');\n } else {\n $('#TraktGetPin').addClass('hide');\n $('#authTrakt').removeClass('hide');\n }\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])(['getShows', 'setConfig']),\n\n onChangeProwlApi(items) {\n this.notifiers.prowl.api = items.map(item => item.value);\n },\n\n savePerShowNotifyList(listType, values) {\n const {\n emailSelectedShow,\n prowlSelectedShow\n } = this;\n const form = new FormData();\n\n if (listType === 'prowl') {\n form.set('show', prowlSelectedShow);\n form.set('prowlAPIs', values.map(apiKey => apiKey.value));\n } else {\n form.set('show', emailSelectedShow);\n form.set('emails', values.map(apiKey => apiKey.value));\n } // Save the list\n\n\n _api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"].post('home/saveShowNotifyList', form);\n },\n\n async prowlUpdateApiKeys(selectedShow) {\n this.prowlSelectedShow = selectedShow;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/loadShowNotifyLists');\n\n if (response.data._size > 0) {\n const list = response.data[selectedShow].prowl_notify_list ? response.data[selectedShow].prowl_notify_list.split(',') : [];\n this.prowlSelectedShowApiKeys = selectedShow ? list : [];\n }\n },\n\n async emailUpdateShowEmail(selectedShow) {\n this.emailSelectedShow = selectedShow;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/loadShowNotifyLists');\n\n if (response.data._size > 0) {\n const list = response.data[selectedShow].list ? response.data[selectedShow].list.split(',') : [];\n this.emailSelectedShowAdresses = selectedShow ? list : [];\n }\n },\n\n emailUpdateAddressList(items) {\n this.notifiers.email.addressList = items.map(x => x.value);\n },\n\n async getPushbulletDeviceOptions() {\n const {\n api: pushbulletApiKey\n } = this.notifiers.pushbullet;\n\n if (!pushbulletApiKey) {\n this.pushbulletTestInfo = 'You didn\\'t supply a Pushbullet api key';\n $('#pushbullet_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/getPushbulletDevices', {\n params: {\n api: pushbulletApiKey\n }\n });\n const options = [];\n const {\n data\n } = response;\n\n if (!data) {\n return false;\n }\n\n options.push({\n text: 'All devices',\n value: ''\n });\n\n for (const device of data.devices) {\n if (device.active === true) {\n options.push({\n text: device.nickname,\n value: device.iden\n });\n }\n }\n\n this.pushbulletDeviceOptions = options;\n this.pushbulletTestInfo = 'Device list updated. Please choose a device to push to.';\n },\n\n async testPushbulletApi() {\n const {\n api: pushbulletApiKey\n } = this.notifiers.pushbullet;\n\n if (!pushbulletApiKey) {\n this.pushbulletTestInfo = 'You didn\\'t supply a Pushbullet api key';\n $('#pushbullet_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testPushbullet', {\n params: {\n api: pushbulletApiKey\n }\n });\n const {\n data\n } = response;\n\n if (data) {\n this.pushbulletTestInfo = data;\n }\n },\n\n async testJoinApi() {\n const {\n api: joinApiKey\n } = this.notifiers.join;\n\n if (!joinApiKey) {\n this.joinTestInfo = 'You didn\\'t supply a Join api key';\n $('#join_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testJoin', {\n params: {\n api: joinApiKey\n }\n });\n const {\n data\n } = response;\n\n if (data) {\n this.joinTestInfo = data;\n }\n },\n\n async twitterStep1() {\n this.twitterTestInfo = MEDUSA.config.loading;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/twitterStep1');\n const {\n data\n } = response;\n window.open(data);\n this.twitterTestInfo = 'Step1: Confirm Authorization';\n },\n\n async twitterStep2() {\n const twitter = {};\n const {\n twitterKey\n } = this;\n twitter.key = twitterKey;\n\n if (twitter.key) {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/twitterStep2', {\n params: {\n key: twitter.key\n }\n });\n const {\n data\n } = response;\n this.twitterTestInfo = data;\n } else {\n this.twitterTestInfo = 'Please fill out the necessary fields above.';\n }\n },\n\n async twitterTest() {\n try {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testTwitter');\n const {\n data\n } = response;\n this.twitterTestInfo = data;\n } catch (error) {\n this.twitterTestInfo = 'Error while trying to request for a test on the twitter api.';\n }\n },\n\n async save() {\n const {\n notifiers,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true;\n const section = 'main';\n\n try {\n await setConfig({\n section,\n config: {\n notifiers\n }\n });\n this.$snotify.success('Saved Notifiers config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save notifiers config', 'Error');\n } finally {\n this.saving = false;\n }\n },\n\n testGrowl() {\n const growl = {};\n growl.host = $.trim($('#growl_host').val());\n growl.password = $.trim($('#growl_password').val());\n\n if (!growl.host) {\n $('#testGrowl-result').html('Please fill out the necessary fields above.');\n $('#growl_host').addClass('warning');\n return;\n }\n\n $('#growl_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testGrowl-result').html(MEDUSA.config.loading);\n $.get('home/testGrowl', {\n host: growl.host,\n password: growl.password\n }).done(data => {\n $('#testGrowl-result').html(data);\n $('#testGrowl').prop('disabled', false);\n });\n },\n\n testProwl() {\n const prowl = {};\n prowl.api = $.trim($('#prowl_api').find('input').val());\n prowl.priority = $('#prowl_priority').find('input').val();\n\n if (!prowl.api) {\n $('#testProwl-result').html('Please fill out the necessary fields above.');\n $('#prowl_api').find('input').addClass('warning');\n return;\n }\n\n $('#prowl_api').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testProwl-result').html(MEDUSA.config.loading);\n $.get('home/testProwl', {\n prowl_api: prowl.api,\n // eslint-disable-line camelcase\n prowl_priority: prowl.priority // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testProwl-result').html(data);\n $('#testProwl').prop('disabled', false);\n });\n },\n\n testKODI() {\n const kodi = {};\n const kodiHostInput = $('#kodi_host').find('input');\n const kodiHosts = kodiHostInput.toArray().map(value => value.value).filter(item => item !== '');\n kodi.host = kodiHosts.join(',');\n kodi.username = $.trim($('#kodi_username').val());\n kodi.password = $.trim($('#kodi_password').val());\n\n if (!kodi.host) {\n $('#testKODI-result').html('Please fill out the necessary fields above.');\n $('#kodi_host').find('input').addClass('warning');\n return;\n }\n\n $('#kodi_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testKODI-result').html(MEDUSA.config.loading);\n $.get('home/testKODI', {\n host: kodi.host,\n username: kodi.username,\n password: kodi.password\n }).done(data => {\n $('#testKODI-result').html(data);\n $('#testKODI').prop('disabled', false);\n });\n },\n\n testPHT() {\n const plex = {};\n plex.client = {};\n const plexHostsInput = $('#plex_client_host').find('input');\n const plexHosts = plexHostsInput.toArray().map(value => value.value).filter(item => item !== '');\n plex.client.host = plexHosts.join(',');\n plex.client.username = $.trim($('#plex_client_username').val());\n plex.client.password = $.trim($('#plex_client_password').val());\n\n if (!plex.client.host) {\n $('#testPHT-result').html('Please fill out the necessary fields above.');\n $('#plex_client_host').find('input').addClass('warning');\n return;\n }\n\n $('#plex_client_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPHT-result').html(MEDUSA.config.loading);\n $.get('home/testPHT', {\n host: plex.client.host,\n username: plex.client.username,\n password: plex.client.password\n }).done(data => {\n $('#testPHT-result').html(data);\n $('#testPHT').prop('disabled', false);\n });\n },\n\n testPMS() {\n const plex = {};\n plex.server = {};\n const plexHostsInput = $('#plex_server_host').find('input');\n const plexHosts = plexHostsInput.toArray().map(value => value.value).filter(item => item !== '');\n plex.server.host = plexHosts.join(',');\n plex.server.username = $.trim($('#plex_server_username').val());\n plex.server.password = $.trim($('#plex_server_password').val());\n plex.server.token = $.trim($('#plex_server_token').val());\n\n if (!plex.server.host) {\n $('#testPMS-result').html('Please fill out the necessary fields above.');\n $('#plex_server_host').find('input').addClass('warning');\n return;\n }\n\n $('#plex_server_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPMS-result').html(MEDUSA.config.loading);\n $.get('home/testPMS', {\n host: plex.server.host,\n username: plex.server.username,\n password: plex.server.password,\n plex_server_token: plex.server.token // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testPMS-result').html(data);\n $('#testPMS').prop('disabled', false);\n });\n },\n\n testEMBY() {\n const emby = {};\n emby.host = $('#emby_host').val();\n emby.apikey = $('#emby_apikey').val();\n\n if (!emby.host || !emby.apikey) {\n $('#testEMBY-result').html('Please fill out the necessary fields above.');\n $('#emby_host').addRemoveWarningClass(emby.host);\n $('#emby_apikey').addRemoveWarningClass(emby.apikey);\n return;\n }\n\n $('#emby_host,#emby_apikey').children('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testEMBY-result').html(MEDUSA.config.loading);\n $.get('home/testEMBY', {\n host: emby.host,\n emby_apikey: emby.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testEMBY-result').html(data);\n $('#testEMBY').prop('disabled', false);\n });\n },\n\n testBoxcar2() {\n const boxcar2 = {};\n boxcar2.accesstoken = $.trim($('#boxcar2_accesstoken').val());\n\n if (!boxcar2.accesstoken) {\n $('#testBoxcar2-result').html('Please fill out the necessary fields above.');\n $('#boxcar2_accesstoken').addClass('warning');\n return;\n }\n\n $('#boxcar2_accesstoken').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testBoxcar2-result').html(MEDUSA.config.loading);\n $.get('home/testBoxcar2', {\n accesstoken: boxcar2.accesstoken\n }).done(data => {\n $('#testBoxcar2-result').html(data);\n $('#testBoxcar2').prop('disabled', false);\n });\n },\n\n testPushover() {\n const pushover = {};\n pushover.userkey = $('#pushover_userkey').val();\n pushover.apikey = $('#pushover_apikey').val();\n\n if (!pushover.userkey || !pushover.apikey) {\n $('#testPushover-result').html('Please fill out the necessary fields above.');\n $('#pushover_userkey').addRemoveWarningClass(pushover.userkey);\n $('#pushover_apikey').addRemoveWarningClass(pushover.apikey);\n return;\n }\n\n $('#pushover_userkey,#pushover_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPushover-result').html(MEDUSA.config.loading);\n $.get('home/testPushover', {\n userKey: pushover.userkey,\n apiKey: pushover.apikey\n }).done(data => {\n $('#testPushover-result').html(data);\n $('#testPushover').prop('disabled', false);\n });\n },\n\n testLibnotify() {\n $('#testLibnotify-result').html(MEDUSA.config.loading);\n $.get('home/testLibnotify', data => {\n $('#testLibnotify-result').html(data);\n });\n },\n\n settingsNMJ() {\n const nmj = {};\n nmj.host = $('#nmj_host').val();\n\n if (nmj.host) {\n $('#testNMJ-result').html(MEDUSA.config.loading);\n $.get('home/settingsNMJ', {\n host: nmj.host\n }, data => {\n if (data === null) {\n $('#nmj_database').removeAttr('readonly');\n $('#nmj_mount').removeAttr('readonly');\n }\n\n const JSONData = $.parseJSON(data);\n $('#testNMJ-result').html(JSONData.message);\n $('#nmj_database').val(JSONData.database);\n $('#nmj_mount').val(JSONData.mount);\n\n if (JSONData.database) {\n $('#nmj_database').prop('readonly', true);\n } else {\n $('#nmj_database').removeAttr('readonly');\n }\n\n if (JSONData.mount) {\n $('#nmj_mount').prop('readonly', true);\n } else {\n $('#nmj_mount').removeAttr('readonly');\n }\n });\n } else {\n alert('Please fill in the Popcorn IP address'); // eslint-disable-line no-alert\n\n $('#nmj_host').focus();\n }\n },\n\n testNMJ() {\n const nmj = {};\n nmj.host = $.trim($('#nmj_host').val());\n nmj.database = $('#nmj_database').val();\n nmj.mount = $('#nmj_mount').val();\n\n if (nmj.host) {\n $('#nmj_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testNMJ-result').html(MEDUSA.config.loading);\n $.get('home/testNMJ', {\n host: nmj.host,\n database: nmj.database,\n mount: nmj.mount\n }).done(data => {\n $('#testNMJ-result').html(data);\n $('#testNMJ').prop('disabled', false);\n });\n } else {\n $('#testNMJ-result').html('Please fill out the necessary fields above.');\n $('#nmj_host').addClass('warning');\n }\n },\n\n settingsNMJv2() {\n const nmjv2 = {};\n nmjv2.host = $('#nmjv2_host').val();\n\n if (nmjv2.host) {\n $('#testNMJv2-result').html(MEDUSA.config.loading);\n nmjv2.dbloc = '';\n const radios = document.getElementsByName('nmjv2_dbloc');\n\n for (let i = 0, len = radios.length; i < len; i++) {\n if (radios[i].checked) {\n nmjv2.dbloc = radios[i].value;\n break;\n }\n }\n\n nmjv2.dbinstance = $('#NMJv2db_instance').val();\n $.get('home/settingsNMJv2', {\n host: nmjv2.host,\n dbloc: nmjv2.dbloc,\n instance: nmjv2.dbinstance\n }, data => {\n if (data === null) {\n $('#nmjv2_database').removeAttr('readonly');\n }\n\n const JSONData = $.parseJSON(data);\n $('#testNMJv2-result').html(JSONData.message);\n $('#nmjv2_database').val(JSONData.database);\n\n if (JSONData.database) {\n $('#nmjv2_database').prop('readonly', true);\n } else {\n $('#nmjv2_database').removeAttr('readonly');\n }\n });\n } else {\n alert('Please fill in the Popcorn IP address'); // eslint-disable-line no-alert\n\n $('#nmjv2_host').focus();\n }\n },\n\n testNMJv2() {\n const nmjv2 = {};\n nmjv2.host = $.trim($('#nmjv2_host').val());\n\n if (nmjv2.host) {\n $('#nmjv2_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testNMJv2-result').html(MEDUSA.config.loading);\n $.get('home/testNMJv2', {\n host: nmjv2.host\n }).done(data => {\n $('#testNMJv2-result').html(data);\n $('#testNMJv2').prop('disabled', false);\n });\n } else {\n $('#testNMJv2-result').html('Please fill out the necessary fields above.');\n $('#nmjv2_host').addClass('warning');\n }\n },\n\n testFreeMobile() {\n const freemobile = {};\n freemobile.id = $.trim($('#freemobile_id').val());\n freemobile.apikey = $.trim($('#freemobile_apikey').val());\n\n if (!freemobile.id || !freemobile.apikey) {\n $('#testFreeMobile-result').html('Please fill out the necessary fields above.');\n\n if (freemobile.id) {\n $('#freemobile_id').removeClass('warning');\n } else {\n $('#freemobile_id').addClass('warning');\n }\n\n if (freemobile.apikey) {\n $('#freemobile_apikey').removeClass('warning');\n } else {\n $('#freemobile_apikey').addClass('warning');\n }\n\n return;\n }\n\n $('#freemobile_id,#freemobile_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testFreeMobile-result').html(MEDUSA.config.loading);\n $.get('home/testFreeMobile', {\n freemobile_id: freemobile.id,\n // eslint-disable-line camelcase\n freemobile_apikey: freemobile.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testFreeMobile-result').html(data);\n $('#testFreeMobile').prop('disabled', false);\n });\n },\n\n testTelegram() {\n const telegram = {};\n telegram.id = $.trim($('#telegram_id').val());\n telegram.apikey = $.trim($('#telegram_apikey').val());\n\n if (!telegram.id || !telegram.apikey) {\n $('#testTelegram-result').html('Please fill out the necessary fields above.');\n $('#telegram_id').addRemoveWarningClass(telegram.id);\n $('#telegram_apikey').addRemoveWarningClass(telegram.apikey);\n return;\n }\n\n $('#telegram_id,#telegram_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testTelegram-result').html(MEDUSA.config.loading);\n $.get('home/testTelegram', {\n telegram_id: telegram.id,\n // eslint-disable-line camelcase\n telegram_apikey: telegram.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTelegram-result').html(data);\n $('#testTelegram').prop('disabled', false);\n });\n },\n\n testDiscord() {\n const {\n notifiers\n } = this;\n\n if (!notifiers.discord.webhook) {\n $('#testDiscord-result').html('Please fill out the necessary fields above.');\n $('#discord_webhook').addRemoveWarningClass(notifiers.discord.webhook);\n return;\n }\n\n $('#discord_id,#discord_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testDiscord-result').html(MEDUSA.config.loading);\n $.get('home/testDiscord', {\n discord_webhook: notifiers.discord.webhook,\n // eslint-disable-line camelcase\n discord_tts: notifiers.discord.tts // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testDiscord-result').html(data);\n $('#testDiscord').prop('disabled', false);\n });\n },\n\n testSlack() {\n const slack = {};\n slack.webhook = $.trim($('#slack_webhook').val());\n\n if (!slack.webhook) {\n $('#testSlack-result').html('Please fill out the necessary fields above.');\n $('#slack_webhook').addRemoveWarningClass(slack.webhook);\n return;\n }\n\n $('#slack_webhook').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testSlack-result').html(MEDUSA.config.loading);\n $.get('home/testslack', {\n slack_webhook: slack.webhook // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testSlack-result').html(data);\n $('#testSlack').prop('disabled', false);\n });\n },\n\n TraktGetPin() {\n window.open($('#trakt_pin_url').val(), 'popUp', 'toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550');\n $('#trakt_pin').prop('disabled', false);\n },\n\n authTrakt() {\n const trakt = {};\n trakt.pin = $('#trakt_pin').val();\n\n if (trakt.pin.length !== 0) {\n $.get('home/getTraktToken', {\n trakt_pin: trakt.pin // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTrakt-result').html(data);\n $('#authTrakt').addClass('hide');\n $('#trakt_pin').prop('disabled', true);\n $('#trakt_pin').val('');\n $('#TraktGetPin').removeClass('hide');\n });\n }\n },\n\n testTrakt() {\n const trakt = {};\n trakt.username = $.trim($('#trakt_username').val());\n trakt.trendingBlacklist = $.trim($('#trakt_blacklist_name').val());\n\n if (!trakt.username) {\n $('#testTrakt-result').html('Please fill out the necessary fields above.');\n $('#trakt_username').addRemoveWarningClass(trakt.username);\n return;\n }\n\n if (/\\s/g.test(trakt.trendingBlacklist)) {\n $('#testTrakt-result').html('Check blacklist name; the value needs to be a trakt slug');\n $('#trakt_blacklist_name').addClass('warning');\n return;\n }\n\n $('#trakt_username').removeClass('warning');\n $('#trakt_blacklist_name').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testTrakt-result').html(MEDUSA.config.loading);\n $.get('home/testTrakt', {\n username: trakt.username,\n blacklist_name: trakt.trendingBlacklist // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTrakt-result').html(data);\n $('#testTrakt').prop('disabled', false);\n });\n },\n\n traktForceSync() {\n $('#testTrakt-result').html(MEDUSA.config.loading);\n $.getJSON('home/forceTraktSync', data => {\n $('#testTrakt-result').html(data.result);\n });\n },\n\n testEmail() {\n let to = '';\n const status = $('#testEmail-result');\n status.html(MEDUSA.config.loading);\n let host = $('#email_host').val();\n host = host.length > 0 ? host : null;\n let port = $('#email_port').val();\n port = port.length > 0 ? port : null;\n const tls = $('#email_tls').find('input').is(':checked') ? 1 : 0;\n let from = $('#email_from').val();\n from = from.length > 0 ? from : 'root@localhost';\n const user = $('#email_username').val().trim();\n const pwd = $('#email_password').val();\n let err = '';\n\n if (host === null) {\n err += '
  • You must specify an SMTP hostname!
  • ';\n }\n\n if (port === null) {\n err += '
  • You must specify an SMTP port!
  • ';\n } else if (port.match(/^\\d+$/) === null || Number.parseInt(port, 10) > 65535) {\n err += '
  • SMTP port must be between 0 and 65535!
  • ';\n }\n\n if (err.length > 0) {\n err = '
      ' + err + '
    ';\n status.html(err);\n } else {\n to = prompt('Enter an email address to send the test to:', null); // eslint-disable-line no-alert\n\n if (to === null || to.length === 0 || to.match(/.*@.*/) === null) {\n status.html('

    You must provide a recipient email address!

    ');\n } else {\n $.get('home/testEmail', {\n host,\n port,\n smtp_from: from,\n // eslint-disable-line camelcase\n use_tls: tls,\n // eslint-disable-line camelcase\n user,\n pwd,\n to\n }, msg => {\n $('#testEmail-result').html(msg);\n });\n }\n }\n },\n\n testPushalot() {\n const pushalot = {};\n pushalot.authToken = $.trim($('#pushalot_authorizationtoken').val());\n\n if (!pushalot.authToken) {\n $('#testPushalot-result').html('Please fill out the necessary fields above.');\n $('#pushalot_authorizationtoken').addClass('warning');\n return;\n }\n\n $('#pushalot_authorizationtoken').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPushalot-result').html(MEDUSA.config.loading);\n $.get('home/testPushalot', {\n authorizationToken: pushalot.authToken\n }).done(data => {\n $('#testPushalot-result').html(data);\n $('#testPushalot').prop('disabled', false);\n });\n }\n\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/config-notifications.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api.js */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config-notifications',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTemplate\"],\n ConfigTextbox: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextbox\"],\n ConfigTextboxNumber: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextboxNumber\"],\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigToggleSlider\"],\n SelectList: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"SelectList\"],\n ShowSelector: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ShowSelector\"]\n },\n\n data() {\n return {\n prowlSelectedShow: null,\n prowlSelectedShowApiKeys: [],\n prowlPriorityOptions: [{\n text: 'Very Low',\n value: -2\n }, {\n text: 'Moderate',\n value: -1\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 1\n }, {\n text: 'Emergency',\n value: 2\n }],\n pushoverPriorityOptions: [{\n text: 'Lowest',\n value: -2\n }, {\n text: 'Low',\n value: -1\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 1\n }, {\n text: 'Emergency',\n value: 2\n }],\n pushoverSoundOptions: [{\n text: 'Default',\n value: 'default'\n }, {\n text: 'Pushover',\n value: 'pushover'\n }, {\n text: 'Bike',\n value: 'bike'\n }, {\n text: 'Bugle',\n value: 'bugle'\n }, {\n text: 'Cash Register',\n value: 'cashregister'\n }, {\n text: 'classical',\n value: 'classical'\n }, {\n text: 'Cosmic',\n value: 'cosmic'\n }, {\n text: 'Falling',\n value: 'falling'\n }, {\n text: 'Gamelan',\n value: 'gamelan'\n }, {\n text: 'Incoming',\n value: 'incoming'\n }, {\n text: 'Intermission',\n value: 'intermission'\n }, {\n text: 'Magic',\n value: 'magic'\n }, {\n text: 'Mechanical',\n value: 'mechanical'\n }, {\n text: 'Piano Bar',\n value: 'pianobar'\n }, {\n text: 'Siren',\n value: 'siren'\n }, {\n text: 'Space Alarm',\n value: 'spacealarm'\n }, {\n text: 'Tug Boat',\n value: 'tugboat'\n }, {\n text: 'Alien Alarm (long)',\n value: 'alien'\n }, {\n text: 'Climb (long)',\n value: 'climb'\n }, {\n text: 'Persistent (long)',\n value: 'persistant'\n }, {\n text: 'Pushover Echo (long)',\n value: 'echo'\n }, {\n text: 'Up Down (long)',\n value: 'updown'\n }, {\n text: 'None (silent)',\n value: 'none'\n }],\n pushbulletDeviceOptions: [{\n text: 'All devices',\n value: ''\n }],\n traktMethodOptions: [{\n text: 'Skip all',\n value: 0\n }, {\n text: 'Download pilot only',\n value: 1\n }, {\n text: 'Get whole show',\n value: 2\n }],\n pushbulletTestInfo: 'Click below to test.',\n joinTestInfo: 'Click below to test.',\n twitterTestInfo: 'Click below to test.',\n twitterKey: '',\n emailSelectedShow: null,\n emailSelectedShowAdresses: []\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n indexers: state => state.config.indexers,\n notifiers: state => state.config.notifiers\n }),\n\n traktNewTokenMessage() {\n const {\n accessToken\n } = this.notifiers.trakt;\n return true ? 'New ' : undefined;\n },\n\n traktIndexersOptions() {\n const {\n indexers\n } = this;\n const {\n traktIndexers\n } = indexers.main;\n const validTraktIndexer = Object.keys(indexers.indexers).filter(k => traktIndexers[k]);\n return validTraktIndexer.map(indexer => {\n return {\n text: indexer,\n value: indexers.indexers[indexer].id\n };\n });\n }\n\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n mounted() {\n // TODO: vueify this.\n $('#trakt_pin').on('keyup change', () => {\n if ($('#trakt_pin').val().length === 0) {\n $('#TraktGetPin').removeClass('hide');\n $('#authTrakt').addClass('hide');\n } else {\n $('#TraktGetPin').addClass('hide');\n $('#authTrakt').removeClass('hide');\n }\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])(['getShows', 'setConfig']),\n\n onChangeProwlApi(items) {\n this.notifiers.prowl.api = items.map(item => item.value);\n },\n\n savePerShowNotifyList(listType, values) {\n const {\n emailSelectedShow,\n prowlSelectedShow\n } = this;\n const form = new FormData();\n\n if (listType === 'prowl') {\n form.set('show', prowlSelectedShow);\n form.set('prowlAPIs', values.map(apiKey => apiKey.value));\n } else {\n form.set('show', emailSelectedShow);\n form.set('emails', values.map(apiKey => apiKey.value));\n } // Save the list\n\n\n _api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"].post('home/saveShowNotifyList', form);\n },\n\n async prowlUpdateApiKeys(selectedShow) {\n this.prowlSelectedShow = selectedShow;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/loadShowNotifyLists');\n\n if (response.data._size > 0) {\n const list = response.data[selectedShow].prowl_notify_list ? response.data[selectedShow].prowl_notify_list.split(',') : [];\n this.prowlSelectedShowApiKeys = selectedShow ? list : [];\n }\n },\n\n async emailUpdateShowEmail(selectedShow) {\n this.emailSelectedShow = selectedShow;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/loadShowNotifyLists');\n\n if (response.data._size > 0) {\n const list = response.data[selectedShow].list ? response.data[selectedShow].list.split(',') : [];\n this.emailSelectedShowAdresses = selectedShow ? list : [];\n }\n },\n\n emailUpdateAddressList(items) {\n this.notifiers.email.addressList = items.map(x => x.value);\n },\n\n async getPushbulletDeviceOptions() {\n const {\n api: pushbulletApiKey\n } = this.notifiers.pushbullet;\n\n if (!pushbulletApiKey) {\n this.pushbulletTestInfo = 'You didn\\'t supply a Pushbullet api key';\n $('#pushbullet_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/getPushbulletDevices', {\n params: {\n api: pushbulletApiKey\n }\n });\n const options = [];\n const {\n data\n } = response;\n\n if (!data) {\n return false;\n }\n\n options.push({\n text: 'All devices',\n value: ''\n });\n\n for (const device of data.devices) {\n if (device.active === true) {\n options.push({\n text: device.nickname,\n value: device.iden\n });\n }\n }\n\n this.pushbulletDeviceOptions = options;\n this.pushbulletTestInfo = 'Device list updated. Please choose a device to push to.';\n },\n\n async testPushbulletApi() {\n const {\n api: pushbulletApiKey\n } = this.notifiers.pushbullet;\n\n if (!pushbulletApiKey) {\n this.pushbulletTestInfo = 'You didn\\'t supply a Pushbullet api key';\n $('#pushbullet_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testPushbullet', {\n params: {\n api: pushbulletApiKey\n }\n });\n const {\n data\n } = response;\n\n if (data) {\n this.pushbulletTestInfo = data;\n }\n },\n\n async testJoinApi() {\n const {\n api: joinApiKey\n } = this.notifiers.join;\n\n if (!joinApiKey) {\n this.joinTestInfo = 'You didn\\'t supply a Join api key';\n $('#join_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testJoin', {\n params: {\n api: joinApiKey\n }\n });\n const {\n data\n } = response;\n\n if (data) {\n this.joinTestInfo = data;\n }\n },\n\n async twitterStep1() {\n this.twitterTestInfo = MEDUSA.config.loading;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/twitterStep1');\n const {\n data\n } = response;\n window.open(data);\n this.twitterTestInfo = 'Step1: Confirm Authorization';\n },\n\n async twitterStep2() {\n const twitter = {};\n const {\n twitterKey\n } = this;\n twitter.key = twitterKey;\n\n if (twitter.key) {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/twitterStep2', {\n params: {\n key: twitter.key\n }\n });\n const {\n data\n } = response;\n this.twitterTestInfo = data;\n } else {\n this.twitterTestInfo = 'Please fill out the necessary fields above.';\n }\n },\n\n async twitterTest() {\n try {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testTwitter');\n const {\n data\n } = response;\n this.twitterTestInfo = data;\n } catch (error) {\n this.twitterTestInfo = 'Error while trying to request for a test on the twitter api.';\n }\n },\n\n async save() {\n const {\n notifiers,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true;\n const section = 'main';\n\n try {\n await setConfig({\n section,\n config: {\n notifiers\n }\n });\n this.$snotify.success('Saved Notifiers config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save notifiers config', 'Error');\n } finally {\n this.saving = false;\n }\n },\n\n testGrowl() {\n const growl = {};\n growl.host = $.trim($('#growl_host').val());\n growl.password = $.trim($('#growl_password').val());\n\n if (!growl.host) {\n $('#testGrowl-result').html('Please fill out the necessary fields above.');\n $('#growl_host').addClass('warning');\n return;\n }\n\n $('#growl_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testGrowl-result').html(MEDUSA.config.loading);\n $.get('home/testGrowl', {\n host: growl.host,\n password: growl.password\n }).done(data => {\n $('#testGrowl-result').html(data);\n $('#testGrowl').prop('disabled', false);\n });\n },\n\n testProwl() {\n const prowl = {};\n prowl.api = $.trim($('#prowl_api').find('input').val());\n prowl.priority = $('#prowl_priority').find('input').val();\n\n if (!prowl.api) {\n $('#testProwl-result').html('Please fill out the necessary fields above.');\n $('#prowl_api').find('input').addClass('warning');\n return;\n }\n\n $('#prowl_api').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testProwl-result').html(MEDUSA.config.loading);\n $.get('home/testProwl', {\n prowl_api: prowl.api,\n // eslint-disable-line camelcase\n prowl_priority: prowl.priority // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testProwl-result').html(data);\n $('#testProwl').prop('disabled', false);\n });\n },\n\n testKODI() {\n const kodi = {};\n const kodiHostInput = $('#kodi_host').find('input');\n const kodiHosts = kodiHostInput.toArray().map(value => value.value).filter(item => item !== '');\n kodi.host = kodiHosts.join(',');\n kodi.username = $.trim($('#kodi_username').val());\n kodi.password = $.trim($('#kodi_password').val());\n\n if (!kodi.host) {\n $('#testKODI-result').html('Please fill out the necessary fields above.');\n $('#kodi_host').find('input').addClass('warning');\n return;\n }\n\n $('#kodi_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testKODI-result').html(MEDUSA.config.loading);\n $.get('home/testKODI', {\n host: kodi.host,\n username: kodi.username,\n password: kodi.password\n }).done(data => {\n $('#testKODI-result').html(data);\n $('#testKODI').prop('disabled', false);\n });\n },\n\n testPHT() {\n const plex = {};\n plex.client = {};\n const plexHostsInput = $('#plex_client_host').find('input');\n const plexHosts = plexHostsInput.toArray().map(value => value.value).filter(item => item !== '');\n plex.client.host = plexHosts.join(',');\n plex.client.username = $.trim($('#plex_client_username').val());\n plex.client.password = $.trim($('#plex_client_password').val());\n\n if (!plex.client.host) {\n $('#testPHT-result').html('Please fill out the necessary fields above.');\n $('#plex_client_host').find('input').addClass('warning');\n return;\n }\n\n $('#plex_client_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPHT-result').html(MEDUSA.config.loading);\n $.get('home/testPHT', {\n host: plex.client.host,\n username: plex.client.username,\n password: plex.client.password\n }).done(data => {\n $('#testPHT-result').html(data);\n $('#testPHT').prop('disabled', false);\n });\n },\n\n testPMS() {\n const plex = {};\n plex.server = {};\n const plexHostsInput = $('#plex_server_host').find('input');\n const plexHosts = plexHostsInput.toArray().map(value => value.value).filter(item => item !== '');\n plex.server.host = plexHosts.join(',');\n plex.server.username = $.trim($('#plex_server_username').val());\n plex.server.password = $.trim($('#plex_server_password').val());\n plex.server.token = $.trim($('#plex_server_token').val());\n\n if (!plex.server.host) {\n $('#testPMS-result').html('Please fill out the necessary fields above.');\n $('#plex_server_host').find('input').addClass('warning');\n return;\n }\n\n $('#plex_server_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPMS-result').html(MEDUSA.config.loading);\n $.get('home/testPMS', {\n host: plex.server.host,\n username: plex.server.username,\n password: plex.server.password,\n plex_server_token: plex.server.token // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testPMS-result').html(data);\n $('#testPMS').prop('disabled', false);\n });\n },\n\n testEMBY() {\n const emby = {};\n emby.host = $('#emby_host').val();\n emby.apikey = $('#emby_apikey').val();\n\n if (!emby.host || !emby.apikey) {\n $('#testEMBY-result').html('Please fill out the necessary fields above.');\n $('#emby_host').addRemoveWarningClass(emby.host);\n $('#emby_apikey').addRemoveWarningClass(emby.apikey);\n return;\n }\n\n $('#emby_host,#emby_apikey').children('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testEMBY-result').html(MEDUSA.config.loading);\n $.get('home/testEMBY', {\n host: emby.host,\n emby_apikey: emby.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testEMBY-result').html(data);\n $('#testEMBY').prop('disabled', false);\n });\n },\n\n testBoxcar2() {\n const boxcar2 = {};\n boxcar2.accesstoken = $.trim($('#boxcar2_accesstoken').val());\n\n if (!boxcar2.accesstoken) {\n $('#testBoxcar2-result').html('Please fill out the necessary fields above.');\n $('#boxcar2_accesstoken').addClass('warning');\n return;\n }\n\n $('#boxcar2_accesstoken').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testBoxcar2-result').html(MEDUSA.config.loading);\n $.get('home/testBoxcar2', {\n accesstoken: boxcar2.accesstoken\n }).done(data => {\n $('#testBoxcar2-result').html(data);\n $('#testBoxcar2').prop('disabled', false);\n });\n },\n\n testPushover() {\n const pushover = {};\n pushover.userkey = $('#pushover_userkey').val();\n pushover.apikey = $('#pushover_apikey').val();\n\n if (!pushover.userkey || !pushover.apikey) {\n $('#testPushover-result').html('Please fill out the necessary fields above.');\n $('#pushover_userkey').addRemoveWarningClass(pushover.userkey);\n $('#pushover_apikey').addRemoveWarningClass(pushover.apikey);\n return;\n }\n\n $('#pushover_userkey,#pushover_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPushover-result').html(MEDUSA.config.loading);\n $.get('home/testPushover', {\n userKey: pushover.userkey,\n apiKey: pushover.apikey\n }).done(data => {\n $('#testPushover-result').html(data);\n $('#testPushover').prop('disabled', false);\n });\n },\n\n testLibnotify() {\n $('#testLibnotify-result').html(MEDUSA.config.loading);\n $.get('home/testLibnotify', data => {\n $('#testLibnotify-result').html(data);\n });\n },\n\n settingsNMJ() {\n const nmj = {};\n nmj.host = $('#nmj_host').val();\n\n if (nmj.host) {\n $('#testNMJ-result').html(MEDUSA.config.loading);\n $.get('home/settingsNMJ', {\n host: nmj.host\n }, data => {\n if (data === null) {\n $('#nmj_database').removeAttr('readonly');\n $('#nmj_mount').removeAttr('readonly');\n }\n\n const JSONData = $.parseJSON(data);\n $('#testNMJ-result').html(JSONData.message);\n $('#nmj_database').val(JSONData.database);\n $('#nmj_mount').val(JSONData.mount);\n\n if (JSONData.database) {\n $('#nmj_database').prop('readonly', true);\n } else {\n $('#nmj_database').removeAttr('readonly');\n }\n\n if (JSONData.mount) {\n $('#nmj_mount').prop('readonly', true);\n } else {\n $('#nmj_mount').removeAttr('readonly');\n }\n });\n } else {\n alert('Please fill in the Popcorn IP address'); // eslint-disable-line no-alert\n\n $('#nmj_host').focus();\n }\n },\n\n testNMJ() {\n const nmj = {};\n nmj.host = $.trim($('#nmj_host').val());\n nmj.database = $('#nmj_database').val();\n nmj.mount = $('#nmj_mount').val();\n\n if (nmj.host) {\n $('#nmj_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testNMJ-result').html(MEDUSA.config.loading);\n $.get('home/testNMJ', {\n host: nmj.host,\n database: nmj.database,\n mount: nmj.mount\n }).done(data => {\n $('#testNMJ-result').html(data);\n $('#testNMJ').prop('disabled', false);\n });\n } else {\n $('#testNMJ-result').html('Please fill out the necessary fields above.');\n $('#nmj_host').addClass('warning');\n }\n },\n\n settingsNMJv2() {\n const nmjv2 = {};\n nmjv2.host = $('#nmjv2_host').val();\n\n if (nmjv2.host) {\n $('#testNMJv2-result').html(MEDUSA.config.loading);\n nmjv2.dbloc = '';\n const radios = document.getElementsByName('nmjv2_dbloc');\n\n for (let i = 0, len = radios.length; i < len; i++) {\n if (radios[i].checked) {\n nmjv2.dbloc = radios[i].value;\n break;\n }\n }\n\n nmjv2.dbinstance = $('#NMJv2db_instance').val();\n $.get('home/settingsNMJv2', {\n host: nmjv2.host,\n dbloc: nmjv2.dbloc,\n instance: nmjv2.dbinstance\n }, data => {\n if (data === null) {\n $('#nmjv2_database').removeAttr('readonly');\n }\n\n const JSONData = $.parseJSON(data);\n $('#testNMJv2-result').html(JSONData.message);\n $('#nmjv2_database').val(JSONData.database);\n\n if (JSONData.database) {\n $('#nmjv2_database').prop('readonly', true);\n } else {\n $('#nmjv2_database').removeAttr('readonly');\n }\n });\n } else {\n alert('Please fill in the Popcorn IP address'); // eslint-disable-line no-alert\n\n $('#nmjv2_host').focus();\n }\n },\n\n testNMJv2() {\n const nmjv2 = {};\n nmjv2.host = $.trim($('#nmjv2_host').val());\n\n if (nmjv2.host) {\n $('#nmjv2_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testNMJv2-result').html(MEDUSA.config.loading);\n $.get('home/testNMJv2', {\n host: nmjv2.host\n }).done(data => {\n $('#testNMJv2-result').html(data);\n $('#testNMJv2').prop('disabled', false);\n });\n } else {\n $('#testNMJv2-result').html('Please fill out the necessary fields above.');\n $('#nmjv2_host').addClass('warning');\n }\n },\n\n testFreeMobile() {\n const freemobile = {};\n freemobile.id = $.trim($('#freemobile_id').val());\n freemobile.apikey = $.trim($('#freemobile_apikey').val());\n\n if (!freemobile.id || !freemobile.apikey) {\n $('#testFreeMobile-result').html('Please fill out the necessary fields above.');\n\n if (freemobile.id) {\n $('#freemobile_id').removeClass('warning');\n } else {\n $('#freemobile_id').addClass('warning');\n }\n\n if (freemobile.apikey) {\n $('#freemobile_apikey').removeClass('warning');\n } else {\n $('#freemobile_apikey').addClass('warning');\n }\n\n return;\n }\n\n $('#freemobile_id,#freemobile_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testFreeMobile-result').html(MEDUSA.config.loading);\n $.get('home/testFreeMobile', {\n freemobile_id: freemobile.id,\n // eslint-disable-line camelcase\n freemobile_apikey: freemobile.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testFreeMobile-result').html(data);\n $('#testFreeMobile').prop('disabled', false);\n });\n },\n\n testTelegram() {\n const telegram = {};\n telegram.id = $.trim($('#telegram_id').val());\n telegram.apikey = $.trim($('#telegram_apikey').val());\n\n if (!telegram.id || !telegram.apikey) {\n $('#testTelegram-result').html('Please fill out the necessary fields above.');\n $('#telegram_id').addRemoveWarningClass(telegram.id);\n $('#telegram_apikey').addRemoveWarningClass(telegram.apikey);\n return;\n }\n\n $('#telegram_id,#telegram_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testTelegram-result').html(MEDUSA.config.loading);\n $.get('home/testTelegram', {\n telegram_id: telegram.id,\n // eslint-disable-line camelcase\n telegram_apikey: telegram.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTelegram-result').html(data);\n $('#testTelegram').prop('disabled', false);\n });\n },\n\n testDiscord() {\n const {\n notifiers\n } = this;\n\n if (!notifiers.discord.webhook) {\n $('#testDiscord-result').html('Please fill out the necessary fields above.');\n $('#discord_webhook').addRemoveWarningClass(notifiers.discord.webhook);\n return;\n }\n\n $('#discord_id,#discord_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testDiscord-result').html(MEDUSA.config.loading);\n $.get('home/testDiscord', {\n discord_webhook: notifiers.discord.webhook,\n // eslint-disable-line camelcase\n discord_tts: notifiers.discord.tts // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testDiscord-result').html(data);\n $('#testDiscord').prop('disabled', false);\n });\n },\n\n testSlack() {\n const slack = {};\n slack.webhook = $.trim($('#slack_webhook').val());\n\n if (!slack.webhook) {\n $('#testSlack-result').html('Please fill out the necessary fields above.');\n $('#slack_webhook').addRemoveWarningClass(slack.webhook);\n return;\n }\n\n $('#slack_webhook').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testSlack-result').html(MEDUSA.config.loading);\n $.get('home/testslack', {\n slack_webhook: slack.webhook // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testSlack-result').html(data);\n $('#testSlack').prop('disabled', false);\n });\n },\n\n TraktGetPin() {\n window.open($('#trakt_pin_url').val(), 'popUp', 'toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550');\n $('#trakt_pin').prop('disabled', false);\n },\n\n authTrakt() {\n const trakt = {};\n trakt.pin = $('#trakt_pin').val();\n\n if (trakt.pin.length !== 0) {\n $.get('home/getTraktToken', {\n trakt_pin: trakt.pin // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTrakt-result').html(data);\n $('#authTrakt').addClass('hide');\n $('#trakt_pin').prop('disabled', true);\n $('#trakt_pin').val('');\n $('#TraktGetPin').removeClass('hide');\n });\n }\n },\n\n testTrakt() {\n const trakt = {};\n trakt.username = $.trim($('#trakt_username').val());\n trakt.trendingBlacklist = $.trim($('#trakt_blacklist_name').val());\n\n if (!trakt.username) {\n $('#testTrakt-result').html('Please fill out the necessary fields above.');\n $('#trakt_username').addRemoveWarningClass(trakt.username);\n return;\n }\n\n if (/\\s/g.test(trakt.trendingBlacklist)) {\n $('#testTrakt-result').html('Check blacklist name; the value needs to be a trakt slug');\n $('#trakt_blacklist_name').addClass('warning');\n return;\n }\n\n $('#trakt_username').removeClass('warning');\n $('#trakt_blacklist_name').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testTrakt-result').html(MEDUSA.config.loading);\n $.get('home/testTrakt', {\n username: trakt.username,\n blacklist_name: trakt.trendingBlacklist // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTrakt-result').html(data);\n $('#testTrakt').prop('disabled', false);\n });\n },\n\n traktForceSync() {\n $('#testTrakt-result').html(MEDUSA.config.loading);\n $.getJSON('home/forceTraktSync', data => {\n $('#testTrakt-result').html(data.result);\n });\n },\n\n testEmail() {\n let to = '';\n const status = $('#testEmail-result');\n status.html(MEDUSA.config.loading);\n let host = $('#email_host').val();\n host = host.length > 0 ? host : null;\n let port = $('#email_port').val();\n port = port.length > 0 ? port : null;\n const tls = $('#email_tls').find('input').is(':checked') ? 1 : 0;\n let from = $('#email_from').val();\n from = from.length > 0 ? from : 'root@localhost';\n const user = $('#email_username').val().trim();\n const pwd = $('#email_password').val();\n let err = '';\n\n if (host === null) {\n err += '
  • You must specify an SMTP hostname!
  • ';\n }\n\n if (port === null) {\n err += '
  • You must specify an SMTP port!
  • ';\n } else if (port.match(/^\\d+$/) === null || Number.parseInt(port, 10) > 65535) {\n err += '
  • SMTP port must be between 0 and 65535!
  • ';\n }\n\n if (err.length > 0) {\n err = '
      ' + err + '
    ';\n status.html(err);\n } else {\n to = prompt('Enter an email address to send the test to:', null); // eslint-disable-line no-alert\n\n if (to === null || to.length === 0 || to.match(/.*@.*/) === null) {\n status.html('

    You must provide a recipient email address!

    ');\n } else {\n $.get('home/testEmail', {\n host,\n port,\n smtp_from: from,\n // eslint-disable-line camelcase\n use_tls: tls,\n // eslint-disable-line camelcase\n user,\n pwd,\n to\n }, msg => {\n $('#testEmail-result').html(msg);\n });\n }\n }\n },\n\n testPushalot() {\n const pushalot = {};\n pushalot.authToken = $.trim($('#pushalot_authorizationtoken').val());\n\n if (!pushalot.authToken) {\n $('#testPushalot-result').html('Please fill out the necessary fields above.');\n $('#pushalot_authorizationtoken').addClass('warning');\n return;\n }\n\n $('#pushalot_authorizationtoken').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPushalot-result').html(MEDUSA.config.loading);\n $.get('home/testPushalot', {\n authorizationToken: pushalot.authToken\n }).done(data => {\n $('#testPushalot-result').html(data);\n $('#testPushalot').prop('disabled', false);\n });\n }\n\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/config-notifications.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -428,7 +428,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _show_list__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./show-list */ \"./src/components/show-list/index.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vanilla-lazyload */ \"./node_modules/vanilla-lazyload/dist/lazyload.min.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-nav-tabs/dist/vue-tabs.js */ \"./node_modules/vue-nav-tabs/dist/vue-tabs.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuedraggable */ \"./node_modules/vuedraggable/dist/vuedraggable.common.js\");\n/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vuedraggable__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'home',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n ShowList: _show_list__WEBPACK_IMPORTED_MODULE_1__[\"ShowList\"],\n VueTabs: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__[\"VueTabs\"],\n VTab: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__[\"VTab\"],\n Draggable: (vuedraggable__WEBPACK_IMPORTED_MODULE_4___default())\n },\n\n data() {\n return {\n layoutOptions: [{\n value: 'poster',\n text: 'Poster'\n }, {\n value: 'small',\n text: 'Small Poster'\n }, {\n value: 'banner',\n text: 'Banner'\n }, {\n value: 'simple',\n text: 'Simple'\n }],\n selectedRootDir: 0\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n // Renamed because of the computed property 'layout'.\n stateLayout: state => state.config.layout,\n stats: state => state.stats\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n showsWithStats: 'showsWithStats'\n }),\n layout: {\n get() {\n const {\n stateLayout\n } = this;\n return stateLayout.home;\n },\n\n set(layout) {\n const {\n setLayout\n } = this;\n const page = 'home';\n setLayout({\n page,\n layout\n });\n }\n\n },\n filterByName: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n showFilterByName\n } = stateLayout;\n return showFilterByName;\n },\n\n set(value) {\n const {\n setShowFilterByName\n } = this;\n setShowFilterByName({\n filter: value\n });\n }\n\n },\n showList: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n show\n } = stateLayout;\n return show.showListOrder;\n },\n\n set(value) {\n const {\n setShowListOrder\n } = this;\n setShowListOrder({\n value\n });\n }\n\n },\n\n showLists() {\n const {\n config,\n filterByName,\n stateLayout,\n showsWithStats\n } = this;\n const {\n rootDirs\n } = config;\n const {\n animeSplitHome,\n selectedRootIndex,\n show\n } = stateLayout;\n\n if (!config.indexers.indexers) {\n return;\n }\n\n let shows = null; // Filter root dirs\n\n shows = showsWithStats.filter(show => selectedRootIndex === -1 || show.config.location.includes(rootDirs.slice(1)[selectedRootIndex])); // Filter by text\n\n shows = shows.filter(show => show.title.toLowerCase().includes(filterByName.toLowerCase()));\n\n if (animeSplitHome) {\n return show.showListOrder.map(listTitle => {\n return {\n listTitle,\n shows: shows.filter(show => show.config.anime === (listTitle === 'Anime'))\n };\n });\n }\n\n return [{\n listTitle: 'Series',\n shows\n }];\n },\n\n imgLazyLoad() {\n console.log('imgLazyLoad object constructud!');\n return new vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2___default.a({\n // Example of options object -> see options section\n threshold: 500\n });\n },\n\n selectedRootIndexOptions() {\n const {\n config\n } = this;\n const {\n rootDirs\n } = config;\n return [...[{\n value: -1,\n text: 'All Folders'\n }], ...rootDirs.slice(1).map((item, idx) => ({\n text: item,\n value: idx\n }))];\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setLayout: 'setLayout',\n setConfig: 'setConfig',\n setShowFilterByName: 'setShowFilterByName',\n setShowListOrder: 'setShowListOrder',\n setStoreLayout: 'setStoreLayout',\n getShows: 'getShows',\n getStats: 'getStats'\n }),\n\n async changePosterSortBy() {\n // Patch new posterSOrtBy value\n const {\n $snotify,\n posterSortby,\n setPosterSortBy\n } = this;\n\n try {\n await setPosterSortBy({\n section: 'layout',\n config: {\n posterSortby\n }\n });\n } catch (error) {\n $snotify.error('Error while trying to change poster sort option', 'Error');\n }\n },\n\n saveSelectedRootDir(value) {\n const {\n setStoreLayout\n } = this;\n setStoreLayout({\n key: 'selectedRootIndex',\n value\n });\n },\n\n updateTabContent(tabIndex, newTab) {\n const {\n setStoreLayout\n } = this;\n setStoreLayout({\n key: 'currentShowTab',\n value: newTab.title\n });\n }\n\n },\n\n mounted() {\n const {\n getStats\n } = this;\n getStats('show');\n }\n\n});\n\n//# sourceURL=webpack:///./src/components/home.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _show_list__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./show-list */ \"./src/components/show-list/index.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vanilla-lazyload */ \"./node_modules/vanilla-lazyload/dist/lazyload.min.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-nav-tabs/dist/vue-tabs.js */ \"./node_modules/vue-nav-tabs/dist/vue-tabs.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuedraggable */ \"./node_modules/vuedraggable/dist/vuedraggable.common.js\");\n/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vuedraggable__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'home',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n ShowList: _show_list__WEBPACK_IMPORTED_MODULE_1__[\"ShowList\"],\n VueTabs: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__[\"VueTabs\"],\n VTab: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__[\"VTab\"],\n Draggable: (vuedraggable__WEBPACK_IMPORTED_MODULE_4___default())\n },\n\n data() {\n return {\n layoutOptions: [{\n value: 'poster',\n text: 'Poster'\n }, {\n value: 'small',\n text: 'Small Poster'\n }, {\n value: 'banner',\n text: 'Banner'\n }, {\n value: 'simple',\n text: 'Simple'\n }],\n selectedRootDir: 0\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n // Renamed because of the computed property 'layout'.\n stateLayout: state => state.config.layout,\n stats: state => state.stats\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n showsWithStats: 'showsWithStats'\n }),\n layout: {\n get() {\n const {\n stateLayout\n } = this;\n return stateLayout.home;\n },\n\n set(layout) {\n const {\n setLayout\n } = this;\n const page = 'home';\n setLayout({\n page,\n layout\n });\n }\n\n },\n filterByName: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n showFilterByName\n } = stateLayout;\n return showFilterByName;\n },\n\n set(value) {\n const {\n setShowFilterByName\n } = this;\n setShowFilterByName({\n filter: value\n });\n }\n\n },\n showList: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n show\n } = stateLayout;\n return show.showListOrder;\n },\n\n set(value) {\n const {\n setShowListOrder\n } = this;\n setShowListOrder({\n value\n });\n }\n\n },\n\n showLists() {\n const {\n config,\n filterByName,\n stateLayout,\n showsWithStats\n } = this;\n const {\n rootDirs\n } = config;\n const {\n animeSplitHome,\n selectedRootIndex,\n show\n } = stateLayout;\n\n if (!config.indexers.indexers) {\n return;\n }\n\n let shows = null; // Filter root dirs\n\n shows = showsWithStats.filter(show => selectedRootIndex === -1 || show.config.location.includes(rootDirs.slice(1)[selectedRootIndex])); // Filter by text\n\n shows = shows.filter(show => show.title.toLowerCase().includes(filterByName.toLowerCase()));\n\n if (animeSplitHome) {\n return show.showListOrder.map(listTitle => {\n return {\n listTitle,\n shows: shows.filter(show => show.config.anime === (listTitle === 'Anime'))\n };\n });\n }\n\n return [{\n listTitle: 'Series',\n shows\n }];\n },\n\n imgLazyLoad() {\n console.log('imgLazyLoad object constructud!');\n return new vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2___default.a({\n // Example of options object -> see options section\n threshold: 500\n });\n },\n\n selectedRootIndexOptions() {\n const {\n config\n } = this;\n const {\n rootDirs\n } = config;\n return [...[{\n value: -1,\n text: 'All Folders'\n }], ...rootDirs.slice(1).map((item, idx) => ({\n text: item,\n value: idx\n }))];\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setLayout: 'setLayout',\n setConfig: 'setConfig',\n setShowFilterByName: 'setShowFilterByName',\n setShowListOrder: 'setShowListOrder',\n setStoreLayout: 'setStoreLayout',\n setCurrentTab: 'setCurrentTab',\n getShows: 'getShows',\n getStats: 'getStats'\n }),\n\n async changePosterSortBy() {\n // Patch new posterSOrtBy value\n const {\n $snotify,\n posterSortby,\n setPosterSortBy\n } = this;\n\n try {\n await setPosterSortBy({\n section: 'layout',\n config: {\n posterSortby\n }\n });\n } catch (error) {\n $snotify.error('Error while trying to change poster sort option', 'Error');\n }\n },\n\n saveSelectedRootDir(value) {\n const {\n setStoreLayout\n } = this;\n setStoreLayout({\n key: 'selectedRootIndex',\n value\n });\n },\n\n updateTabContent(tabIndex, newTab) {\n const {\n setCurrentTab\n } = this;\n setCurrentTab(newTab.title);\n }\n\n },\n\n mounted() {\n const {\n getStats\n } = this;\n getStats('show');\n }\n\n});\n\n//# sourceURL=webpack:///./src/components/home.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -536,7 +536,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n\n /**\n * Vue-good-table sort overwrite function.\n * @param {Object} x - row1 value for column.\n * @param {object} y - row2 value for column.\n * @returns {Boolean} - if we want to display this row before the next\n */\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'status',\n sortable: false\n }, {\n label: 'Provider',\n sortable: false,\n field: 'provider.name'\n }, {\n label: 'Release',\n field: 'resource',\n sortable: false\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n sortable: false,\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return `s${season.toString().padStart(2, '0')}e${episode.toString().padStart(2, '0')}`;\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episodeSlug,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: episodeSlug()\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episodeSlug,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: episodeSlug()\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -608,7 +608,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_4__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n mounted() {\n const {\n getProviders,\n getProviderResults\n } = this;\n getProviders().then(() => {\n // We need to get the providers, before we know which providers to query.\n getProviderResults();\n });\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode))];\n }\n }\n\n return results;\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_4__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this; // const unwatch = this.$watch('show.id.slug', showSlug => {\n // Use apiv2 to get latest provider cache results\n\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // unwatch();\n // });\n },\n\n refreshResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_4__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n const classes = [];\n return classes;\n }\n\n },\n watch: {\n queueitems: {\n handler(queue) {\n const queueForThisEpisode = queue.filter(q => q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n mounted() {\n const {\n getProviders,\n getProviderResults\n } = this;\n getProviders().then(() => {\n // We need to get the providers, before we know which providers to query.\n getProviderResults();\n });\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -711,7 +711,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.vgt-global-search__input.vgt-pull-left[data-v-6dfe8938] {\\n float: left;\\n height: 40px;\\n}\\n.vgt-input[data-v-6dfe8938] {\\n border: 1px solid #ccc;\\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\\n height: 30px;\\n padding: 5px 10px;\\n font-size: 12px;\\n line-height: 1.5;\\n border-radius: 3px;\\n}\\ndiv.vgt-responsive > table tbody > tr > th.vgt-row-header > span[data-v-6dfe8938] {\\n font-size: 24px;\\n margin-top: 20px;\\n margin-bottom: 10px;\\n}\\n.fanartBackground.displayShow[data-v-6dfe8938] {\\n clear: both;\\n opacity: 0.9;\\n}\\n.defaultTable.displayShow[data-v-6dfe8938] {\\n clear: both;\\n}\\n.displayShowTable.displayShow[data-v-6dfe8938] {\\n clear: both;\\n}\\n.fanartBackground table[data-v-6dfe8938] {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.summaryFanArt[data-v-6dfe8938] {\\n opacity: 0.9;\\n}\\n.fanartBackground > table th.vgt-row-header[data-v-6dfe8938] {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.fanartBackground td.col-search[data-v-6dfe8938] {\\n text-align: center;\\n}\\n\\n/* Trying to migrate this from tablesorter */\\n\\n/* =======================================================================\\ntablesorter.css\\n========================================================================== */\\n.displayShow[data-v-6dfe8938] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n color: rgb(0, 0, 0);\\n text-align: left;\\n border-spacing: 0;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th,\\n.displayShow[data-v-6dfe8938] .vgt-table td {\\n padding: 4px;\\n border-top: rgb(34, 34, 34) 1px solid;\\n border-left: rgb(34, 34, 34) 1px solid;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.displayShow[data-v-6dfe8938] .vgt-table th:first-child,\\n.displayShow[data-v-6dfe8938] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th {\\n /* color: rgb(255, 255, 255); */\\n text-align: center;\\n text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);\\n background-color: rgb(51, 51, 51);\\n border-collapse: collapse;\\n font-weight: normal;\\n white-space: nowrap;\\n color: rgb(255, 255, 255);\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting.sorting-desc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting.sorting-asc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th {\\n background-image: none;\\n padding: 4px;\\n cursor: default;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tr.tablesorter-filter-row,\\n.displayShow[data-v-6dfe8938] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.displayShow[data-v-6dfe8938] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-6dfe8938] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tfoot tr {\\n color: rgb(255, 255, 255);\\n text-align: center;\\n text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);\\n background-color: rgb(51, 51, 51);\\n border-collapse: collapse;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tfoot a {\\n color: rgb(255, 255, 255);\\n text-decoration: none;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.displayShow[data-v-6dfe8938] .unaired {\\n background-color: rgb(245, 241, 228);\\n}\\n.displayShow[data-v-6dfe8938] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.displayShow[data-v-6dfe8938] .preferred {\\n background-color: rgb(195, 227, 200);\\n}\\n.displayShow[data-v-6dfe8938] .archived {\\n background-color: rgb(195, 227, 200);\\n}\\n.displayShow[data-v-6dfe8938] .allowed {\\n background-color: rgb(255, 218, 138);\\n}\\n.displayShow[data-v-6dfe8938] .wanted {\\n background-color: rgb(255, 176, 176);\\n}\\n.displayShow[data-v-6dfe8938] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.displayShow[data-v-6dfe8938] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.displayShow[data-v-6dfe8938] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.displayShow[data-v-6dfe8938] span.unaired {\\n color: rgb(88, 75, 32);\\n}\\n.displayShow[data-v-6dfe8938] span.skipped {\\n color: rgb(29, 80, 104);\\n}\\n.displayShow[data-v-6dfe8938] span.preffered {\\n color: rgb(41, 87, 48);\\n}\\n.displayShow[data-v-6dfe8938] span.allowed {\\n color: rgb(118, 81, 0);\\n}\\n.displayShow[data-v-6dfe8938] span.wanted {\\n color: rgb(137, 0, 0);\\n}\\n.displayShow[data-v-6dfe8938] span.snatched {\\n color: rgb(101, 33, 100);\\n}\\n.displayShow[data-v-6dfe8938] span.unaired b,\\n.displayShow[data-v-6dfe8938] span.skipped b,\\n.displayShow[data-v-6dfe8938] span.preferred b,\\n.displayShow[data-v-6dfe8938] span.allowed b,\\n.displayShow[data-v-6dfe8938] span.wanted b,\\n.displayShow[data-v-6dfe8938] span.snatched b {\\n color: rgb(0, 0, 0);\\n font-weight: 800;\\n}\\ntd.col-footer[data-v-6dfe8938] {\\n text-align: left !important;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer {\\n color: rgb(255, 255, 255);\\n padding: 1em;\\n background-color: rgb(51, 51, 51);\\n margin-bottom: 1em;\\n display: flex;\\n justify-content: space-between;\\n}\\n.displayShow[data-v-6dfe8938] .footer__row-count,\\n.displayShow[data-v-6dfe8938] .footer__navigation__page-info {\\n display: inline;\\n}\\n.displayShow[data-v-6dfe8938] .footer__row-count__label {\\n margin-right: 1em;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation {\\n font-size: 14px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-pull-right {\\n float: right !important;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__page-btn .chevron {\\n width: 24px;\\n height: 24px;\\n border-radius: 15%;\\n position: relative;\\n margin: 0 8px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__info,\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__page-info {\\n display: inline-flex;\\n color: #909399;\\n margin: 0 16px;\\n margin-top: 0;\\n margin-right: 16px;\\n margin-bottom: 0;\\n margin-left: 16px;\\n}\\n.select-info span[data-v-6dfe8938] {\\n margin-left: 5px;\\n line-height: 40px;\\n}\\n\\n/** Style the modal. This should be saved somewhere, where we create one modal template with slots, and style that. */\\n.modal-container[data-v-6dfe8938] {\\n border: 1px solid rgb(17, 17, 17);\\n box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.175);\\n border-radius: 0;\\n}\\n.modal-header[data-v-6dfe8938] {\\n padding: 9px 15px;\\n border-bottom: none;\\n border-radius: 0;\\n background-color: rgb(55, 55, 55);\\n}\\n.modal-content[data-v-6dfe8938] {\\n background: rgb(34, 34, 34);\\n border-radius: 0;\\n border: 1px solid rgba(0, 0, 0, 0.2);\\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\\n color: white;\\n}\\n.modal-body[data-v-6dfe8938] {\\n background: rgb(34, 34, 34);\\n overflow-y: auto;\\n}\\n.modal-footer[data-v-6dfe8938] {\\n border-top: none;\\n text-align: center;\\n}\\n.subtitles > div[data-v-6dfe8938] {\\n float: left;\\n}\\n.subtitles > div[data-v-6dfe8938]:not(:last-child) {\\n margin-right: 2px;\\n}\\n.align-center[data-v-6dfe8938] {\\n display: flex;\\n justify-content: center;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.vgt-global-search__input.vgt-pull-left[data-v-6dfe8938] {\\n float: left;\\n height: 40px;\\n}\\n.vgt-input[data-v-6dfe8938] {\\n border: 1px solid #ccc;\\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\\n height: 30px;\\n padding: 5px 10px;\\n font-size: 12px;\\n line-height: 1.5;\\n border-radius: 3px;\\n}\\ndiv.vgt-responsive > table tbody > tr > th.vgt-row-header > span[data-v-6dfe8938] {\\n font-size: 24px;\\n margin-top: 20px;\\n margin-bottom: 10px;\\n}\\n.defaultTable.displayShow[data-v-6dfe8938] {\\n clear: both;\\n}\\n.displayShowTable.displayShow[data-v-6dfe8938] {\\n clear: both;\\n}\\n.fanartBackground.displayShow[data-v-6dfe8938] {\\n clear: both;\\n opacity: 0.9;\\n}\\n.fanartBackground table[data-v-6dfe8938] {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.summaryFanArt[data-v-6dfe8938] {\\n opacity: 0.9;\\n}\\n.fanartBackground > table th.vgt-row-header[data-v-6dfe8938] {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.fanartBackground td.col-search[data-v-6dfe8938] {\\n text-align: center;\\n}\\n\\n/* Trying to migrate this from tablesorter */\\n\\n/* =======================================================================\\ntablesorter.css\\n========================================================================== */\\n.displayShow[data-v-6dfe8938] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n color: rgb(0, 0, 0);\\n text-align: left;\\n border-spacing: 0;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th,\\n.displayShow[data-v-6dfe8938] .vgt-table td {\\n padding: 4px;\\n border-top: rgb(34, 34, 34) 1px solid;\\n border-left: rgb(34, 34, 34) 1px solid;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.displayShow[data-v-6dfe8938] .vgt-table th:first-child,\\n.displayShow[data-v-6dfe8938] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th {\\n /* color: rgb(255, 255, 255); */\\n text-align: center;\\n text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);\\n background-color: rgb(51, 51, 51);\\n border-collapse: collapse;\\n font-weight: normal;\\n white-space: nowrap;\\n color: rgb(255, 255, 255);\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting.sorting-desc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting.sorting-asc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th {\\n background-image: none;\\n padding: 4px;\\n cursor: default;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tr.tablesorter-filter-row,\\n.displayShow[data-v-6dfe8938] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.displayShow[data-v-6dfe8938] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-6dfe8938] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tfoot tr {\\n color: rgb(255, 255, 255);\\n text-align: center;\\n text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);\\n background-color: rgb(51, 51, 51);\\n border-collapse: collapse;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tfoot a {\\n color: rgb(255, 255, 255);\\n text-decoration: none;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.displayShow[data-v-6dfe8938] .unaired {\\n background-color: rgb(245, 241, 228);\\n}\\n.displayShow[data-v-6dfe8938] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.displayShow[data-v-6dfe8938] .preferred {\\n background-color: rgb(195, 227, 200);\\n}\\n.displayShow[data-v-6dfe8938] .archived {\\n background-color: rgb(195, 227, 200);\\n}\\n.displayShow[data-v-6dfe8938] .allowed {\\n background-color: rgb(255, 218, 138);\\n}\\n.displayShow[data-v-6dfe8938] .wanted {\\n background-color: rgb(255, 176, 176);\\n}\\n.displayShow[data-v-6dfe8938] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.displayShow[data-v-6dfe8938] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.displayShow[data-v-6dfe8938] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.displayShow[data-v-6dfe8938] span.unaired {\\n color: rgb(88, 75, 32);\\n}\\n.displayShow[data-v-6dfe8938] span.skipped {\\n color: rgb(29, 80, 104);\\n}\\n.displayShow[data-v-6dfe8938] span.preffered {\\n color: rgb(41, 87, 48);\\n}\\n.displayShow[data-v-6dfe8938] span.allowed {\\n color: rgb(118, 81, 0);\\n}\\n.displayShow[data-v-6dfe8938] span.wanted {\\n color: rgb(137, 0, 0);\\n}\\n.displayShow[data-v-6dfe8938] span.snatched {\\n color: rgb(101, 33, 100);\\n}\\n.displayShow[data-v-6dfe8938] span.unaired b,\\n.displayShow[data-v-6dfe8938] span.skipped b,\\n.displayShow[data-v-6dfe8938] span.preferred b,\\n.displayShow[data-v-6dfe8938] span.allowed b,\\n.displayShow[data-v-6dfe8938] span.wanted b,\\n.displayShow[data-v-6dfe8938] span.snatched b {\\n color: rgb(0, 0, 0);\\n font-weight: 800;\\n}\\ntd.col-footer[data-v-6dfe8938] {\\n text-align: left !important;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer {\\n color: rgb(255, 255, 255);\\n padding: 1em;\\n background-color: rgb(51, 51, 51);\\n margin-bottom: 1em;\\n display: flex;\\n justify-content: space-between;\\n}\\n.displayShow[data-v-6dfe8938] .footer__row-count,\\n.displayShow[data-v-6dfe8938] .footer__navigation__page-info {\\n display: inline;\\n}\\n.displayShow[data-v-6dfe8938] .footer__row-count__label {\\n margin-right: 1em;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation {\\n font-size: 14px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-pull-right {\\n float: right !important;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__page-btn .chevron {\\n width: 24px;\\n height: 24px;\\n border-radius: 15%;\\n position: relative;\\n margin: 0 8px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__info,\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__page-info {\\n display: inline-flex;\\n color: #909399;\\n margin: 0 16px;\\n margin-top: 0;\\n margin-right: 16px;\\n margin-bottom: 0;\\n margin-left: 16px;\\n}\\n.select-info span[data-v-6dfe8938] {\\n margin-left: 5px;\\n line-height: 40px;\\n}\\n\\n/** Style the modal. This should be saved somewhere, where we create one modal template with slots, and style that. */\\n.modal-container[data-v-6dfe8938] {\\n border: 1px solid rgb(17, 17, 17);\\n box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.175);\\n border-radius: 0;\\n}\\n.modal-header[data-v-6dfe8938] {\\n padding: 9px 15px;\\n border-bottom: none;\\n border-radius: 0;\\n background-color: rgb(55, 55, 55);\\n}\\n.modal-content[data-v-6dfe8938] {\\n background: rgb(34, 34, 34);\\n border-radius: 0;\\n border: 1px solid rgba(0, 0, 0, 0.2);\\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\\n color: white;\\n}\\n.modal-body[data-v-6dfe8938] {\\n background: rgb(34, 34, 34);\\n overflow-y: auto;\\n}\\n.modal-footer[data-v-6dfe8938] {\\n border-top: none;\\n text-align: center;\\n}\\n.subtitles > div[data-v-6dfe8938] {\\n float: left;\\n}\\n.subtitles > div[data-v-6dfe8938]:not(:last-child) {\\n margin-right: 2px;\\n}\\n.align-center[data-v-6dfe8938] {\\n display: flex;\\n justify-content: center;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -975,7 +975,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\nspan.global-ignored[data-v-0ad4c7fc] {\\n color: red;\\n}\\nspan.show-ignored[data-v-0ad4c7fc] {\\n color: red;\\n font-style: italic;\\n}\\nspan.global-required[data-v-0ad4c7fc] {\\n color: green;\\n}\\nspan.show-required[data-v-0ad4c7fc] {\\n color: green;\\n font-style: italic;\\n}\\nspan.global-undesired[data-v-0ad4c7fc] {\\n color: orange;\\n}\\n\\n/** Use this as table styling for all table layouts */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th:first-child,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-0ad4c7fc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\nshow-history[data-v-0ad4c7fc] {\\n margin-bottom: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\nspan.global-ignored[data-v-0ad4c7fc] {\\n color: red;\\n}\\nspan.show-ignored[data-v-0ad4c7fc] {\\n color: red;\\n font-style: italic;\\n}\\nspan.global-required[data-v-0ad4c7fc] {\\n color: green;\\n}\\nspan.show-required[data-v-0ad4c7fc] {\\n color: green;\\n font-style: italic;\\n}\\nspan.global-undesired[data-v-0ad4c7fc] {\\n color: orange;\\n}\\n\\n/** Use this as table styling for all table layouts */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th:first-child,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-0ad4c7fc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground {\\n clear: both;\\n opacity: 0.9;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground table {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground > table th.vgt-row-header {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground td.col-search {\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\nshow-history[data-v-0ad4c7fc] {\\n margin-bottom: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1093,7 +1093,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { attrs: { id: \"config-notifications\" } },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"config\" } }, [\n _c(\"div\", { attrs: { id: \"config-content\" } }, [\n _c(\n \"form\",\n {\n attrs: { id: \"configForm\", method: \"post\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.save()\n }\n }\n },\n [\n _c(\"div\", { attrs: { id: \"config-components\" } }, [\n _c(\"ul\", [\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#home-theater-nas\" } }, [\n _vm._v(\"Home Theater / NAS\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#devices\" } }, [\n _vm._v(\"Devices\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#social\" } }, [\n _vm._v(\"Social\")\n ])\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"home-theater-nas\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-kodi\",\n attrs: { title: \"KODI\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://kodi.tv\" } },\n [_vm._v(\"KODI\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A free and open source cross-platform media center and home entertainment system software with a 10-foot user interface designed for the living-room TV.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_kodi\",\n explanations: [\"Send KODI commands?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.kodi, \"enabled\", $$v)\n },\n expression: \"notifiers.kodi.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.kodi.enabled,\n expression: \"notifiers.kodi.enabled\"\n }\n ],\n attrs: { id: \"content-use-kodi\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Always on\",\n id: \"kodi_always_on\",\n explanations: [\"log errors when unreachable?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.alwaysOn,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"alwaysOn\",\n $$v\n )\n },\n expression: \"notifiers.kodi.alwaysOn\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"kodi_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.kodi.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"kodi_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.kodi.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"kodi_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.kodi.notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.kodi.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Update library\",\n id: \"kodi_update_library\",\n explanations: [\n \"update KODI library when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.update.library,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi.update,\n \"library\",\n $$v\n )\n },\n expression: \"notifiers.kodi.update.library\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Full library update\",\n id: \"kodi_update_full\",\n explanations: [\n \"perform a full library update if update per-show fails?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.update.full,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi.update,\n \"full\",\n $$v\n )\n },\n expression: \"notifiers.kodi.update.full\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Clean library\",\n id: \"kodi_clean_library\",\n explanations: [\n \"clean KODI library when replaces a already downloaded episode?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.cleanLibrary,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"cleanLibrary\",\n $$v\n )\n },\n expression: \"notifiers.kodi.cleanLibrary\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Only update first host\",\n id: \"kodi_update_onlyfirst\",\n explanations: [\n \"only send library updates/clean to the first active host?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.update.onlyFirst,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi.update,\n \"onlyFirst\",\n $$v\n )\n },\n expression: \"notifiers.kodi.update.onlyFirst\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"col-sm-10 content\" },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"kodi_host\",\n id: \"kodi_host\",\n \"list-items\": _vm.notifiers.kodi.host\n },\n on: {\n change: function($event) {\n _vm.notifiers.kodi.host = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"host running KODI (eg. 192.168.1.100:8080)\"\n )\n ])\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"kodi_username\",\n explanations: [\n \"username for your KODI server (blank for none)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.kodi.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"kodi_password\",\n explanations: [\n \"password for your KODI server (blank for none)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.kodi.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testKODI-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test KODI\",\n id: \"testKODI\"\n },\n on: { click: _vm.testKODI }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-plex\",\n attrs: { title: \"Plex Media Server\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://plex.tv\" } },\n [_vm._v(\"Plex Media Server\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Experience your media on a visually stunning, easy to use interface on your Mac connected to your TV. Your media library has never looked this good!\"\n )\n ]),\n _vm._v(\" \"),\n _vm.notifiers.plex.server.enabled\n ? _c(\"p\", { staticClass: \"plexinfo\" }, [\n _vm._v(\n \"For sending notifications to Plex Home Theater (PHT) clients, use the KODI notifier with port \"\n ),\n _c(\"b\", [_vm._v(\"3005\")]),\n _vm._v(\".\")\n ])\n : _vm._e()\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_plex_server\",\n explanations: [\"Send Plex server notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.plex.server.enabled,\n expression: \"notifiers.plex.server.enabled\"\n }\n ],\n attrs: { id: \"content-use-plex-server\" }\n },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Plex Media Server Auth Token\",\n id: \"plex_server_token\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.token,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"token\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.token\"\n }\n },\n [\n _c(\"p\", [_vm._v(\"Auth Token used by plex\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\n \"span\",\n [\n _vm._v(\"See: \"),\n _c(\n \"app-link\",\n {\n staticClass: \"wiki\",\n attrs: {\n href:\n \"https://support.plex.tv/hc/en-us/articles/204059436-Finding-your-account-token-X-Plex-Token\"\n }\n },\n [\n _c(\"strong\", [\n _vm._v(\n \"Finding your account token\"\n )\n ])\n ]\n )\n ],\n 1\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"plex_server_username\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"plex_server_password\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Update Library\",\n id: \"plex_update_library\",\n explanations: [\"log errors when unreachable?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.server.updateLibrary,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"updateLibrary\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.server.updateLibrary\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"plex_server_host\",\n label: \"Plex Media Server IP:Port\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"plex_server_host\",\n id: \"plex_server_host\",\n \"list-items\":\n _vm.notifiers.plex.server.host\n },\n on: {\n change: function($event) {\n _vm.notifiers.plex.server.host = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"one or more hosts running Plex Media Server\"\n ),\n _c(\"br\"),\n _vm._v(\n \"(eg. 192.168.1.1:32400, 192.168.1.2:32400)\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"HTTPS\",\n id: \"plex_server_https\",\n explanations: [\n \"use https for plex media server requests?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.https,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"https\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.https\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"field-pair\" }, [\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPMS-result\" }\n },\n [\n _vm._v(\n \"Click below to test Plex Media Server(s)\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Plex Media Server\",\n id: \"testPMS\"\n },\n on: { click: _vm.testPMS }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: {\n type: \"submit\",\n value: \"Save Changes\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"clear-left\" }, [\n _vm._v(\" \")\n ])\n ])\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-plexth\",\n attrs: { title: \"Plex Media Client\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://plex.tv\" } },\n [_vm._v(\"Plex Home Theater\")]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_plex_client\",\n explanations: [\n \"Send Plex Home Theater notifications?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.client.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.plex.client.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.plex.client.enabled,\n expression: \"notifiers.plex.client.enabled\"\n }\n ],\n attrs: { id: \"content-use-plex-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"plex_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.client.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.client.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"plex_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.client.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.client.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"plex_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.client\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.client.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"plex_client_host\",\n label: \"Plex Home Theater IP:Port\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"plex_client_host\",\n id: \"plex_client_host\",\n \"list-items\":\n _vm.notifiers.plex.client.host\n },\n on: {\n change: function($event) {\n _vm.notifiers.plex.client.host = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"one or more hosts running Plex Home Theater\"\n ),\n _c(\"br\"),\n _vm._v(\n \"(eg. 192.168.1.100:3000, 192.168.1.101:3000)\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"plex_client_username\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.client.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.plex.client.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"plex_client_password\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.client.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.plex.client.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"field-pair\" }, [\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPHT-result\" }\n },\n [\n _vm._v(\n \"Click below to test Plex Home Theater(s)\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Plex Home Theater\",\n id: \"testPHT\"\n },\n on: { click: _vm.testPHT }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: {\n type: \"submit\",\n value: \"Save Changes\"\n }\n }),\n _vm._v(\" \"),\n _vm._m(1)\n ])\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-emby\",\n attrs: { title: \"Emby\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://emby.media\" } },\n [_vm._v(\"Emby\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A home media server built using other popular open source technologies.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_emby\",\n explanations: [\"Send update commands to Emby?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.emby.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.emby, \"enabled\", $$v)\n },\n expression: \"notifiers.emby.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.emby.enabled,\n expression: \"notifiers.emby.enabled\"\n }\n ],\n attrs: { id: \"content_use_emby\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Emby IP:Port\",\n id: \"emby_host\",\n explanations: [\n \"host running Emby (eg. 192.168.1.100:8096)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.emby.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.emby, \"host\", $$v)\n },\n expression: \"notifiers.emby.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: { label: \"Api Key\", id: \"emby_apikey\" },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.emby.apiKey,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.emby, \"apiKey\", $$v)\n },\n expression: \"notifiers.emby.apiKey\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testEMBY-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Emby\",\n id: \"testEMBY\"\n },\n on: { click: _vm.testEMBY }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-nmj\",\n attrs: { title: \"Networked Media Jukebox\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: { href: \"http://www.popcornhour.com/\" }\n },\n [_vm._v(\"NMJ\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"The Networked Media Jukebox, or NMJ, is the official media jukebox interface made available for the Popcorn Hour 200-series.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_nmj\",\n explanations: [\"Send update commands to NMJ?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"enabled\", $$v)\n },\n expression: \"notifiers.nmj.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.nmj.enabled,\n expression: \"notifiers.nmj.enabled\"\n }\n ],\n attrs: { id: \"content-use-nmj\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Popcorn IP address\",\n id: \"nmj_host\",\n explanations: [\n \"IP address of Popcorn 200-series (eg. 192.168.1.100)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"host\", $$v)\n },\n expression: \"notifiers.nmj.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"settingsNMJ\",\n label: \"Get settings\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Get Settings\",\n id: \"settingsNMJ\"\n },\n on: { click: _vm.settingsNMJ }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"the Popcorn Hour device must be powered on and NMJ running.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"NMJ database\",\n id: \"nmj_database\",\n explanations: [\n \"automatically filled via the 'Get Settings' button.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.database,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"database\", $$v)\n },\n expression: \"notifiers.nmj.database\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"NMJ mount\",\n id: \"nmj_mount\",\n explanations: [\n \"automatically filled via the 'Get Settings' button.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.mount,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"mount\", $$v)\n },\n expression: \"notifiers.nmj.mount\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testNMJ-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test NMJ\",\n id: \"testNMJ\"\n },\n on: { click: _vm.testNMJ }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-nmj\",\n attrs: { title: \"Networked Media Jukebox v2\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: { href: \"http://www.popcornhour.com/\" }\n },\n [_vm._v(\"NMJv2\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"The Networked Media Jukebox, or NMJv2, is the official media jukebox interface made available for the Popcorn Hour 300 & 400-series.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_nmjv2\",\n explanations: [\n \"Send popcorn hour (nmjv2) notifications?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmjv2.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmjv2, \"enabled\", $$v)\n },\n expression: \"notifiers.nmjv2.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.nmjv2.enabled,\n expression: \"notifiers.nmjv2.enabled\"\n }\n ],\n attrs: { id: \"content-use-nmjv2\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Popcorn IP address\",\n id: \"nmjv2_host\",\n explanations: [\n \"IP address of Popcorn 300/400-series (eg. 192.168.1.100)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmjv2.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmjv2, \"host\", $$v)\n },\n expression: \"notifiers.nmjv2.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"nmjv2_database_location\",\n label: \"Database location\"\n }\n },\n [\n _c(\n \"label\",\n {\n staticClass: \"space-right\",\n attrs: { for: \"NMJV2_DBLOC_A\" }\n },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.nmjv2.dbloc,\n expression: \"notifiers.nmjv2.dbloc\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"nmjv2_dbloc\",\n VALUE: \"local\",\n id: \"NMJV2_DBLOC_A\"\n },\n domProps: {\n checked: _vm._q(\n _vm.notifiers.nmjv2.dbloc,\n null\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.notifiers.nmjv2,\n \"dbloc\",\n null\n )\n }\n }\n }),\n _vm._v(\n \"\\n PCH Local Media\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"label\",\n { attrs: { for: \"NMJV2_DBLOC_B\" } },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.nmjv2.dbloc,\n expression: \"notifiers.nmjv2.dbloc\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"nmjv2_dbloc\",\n VALUE: \"network\",\n id: \"NMJV2_DBLOC_B\"\n },\n domProps: {\n checked: _vm._q(\n _vm.notifiers.nmjv2.dbloc,\n null\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.notifiers.nmjv2,\n \"dbloc\",\n null\n )\n }\n }\n }),\n _vm._v(\n \"\\n PCH Network Media\\n \"\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"nmjv2_database_instance\",\n label: \"Database instance\"\n }\n },\n [\n _c(\n \"select\",\n {\n staticClass: \"form-control input-sm\",\n attrs: { id: \"NMJv2db_instance\" }\n },\n [\n _c(\"option\", { attrs: { value: \"0\" } }, [\n _vm._v(\"#1 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"1\" } }, [\n _vm._v(\"#2 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"2\" } }, [\n _vm._v(\"#3 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"3\" } }, [\n _vm._v(\"#4 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"4\" } }, [\n _vm._v(\"#5 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"5\" } }, [\n _vm._v(\"#6 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"6\" } }, [\n _vm._v(\"#7 \")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"adjust this value if the wrong database is selected.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"get_nmjv2_find_database\",\n label: \"Find database\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Find Database\",\n id: \"settingsNMJv2\"\n },\n on: { click: _vm.settingsNMJv2 }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"the Popcorn Hour device must be powered on.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"NMJv2 database\",\n id: \"nmjv2_database\",\n explanations: [\n \"automatically filled via the 'Find Database' buttons.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmjv2.database,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.nmjv2,\n \"database\",\n $$v\n )\n },\n expression: \"notifiers.nmjv2.database\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testNMJv2-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test NMJv2\",\n id: \"testNMJv2\"\n },\n on: { click: _vm.testNMJv2 }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-syno1\",\n attrs: { title: \"Synology\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://synology.com/\" } },\n [_vm._v(\"Synology\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"The Synology DiskStation NAS.\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Synology Indexer is the daemon running on the Synology NAS to build its media database.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"HTTPS\",\n id: \"use_synoindex\",\n explanations: [\n \"Note: requires Medusa to be running on your Synology NAS.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.synologyIndex.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synologyIndex,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.synologyIndex.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.synologyIndex.enabled,\n expression: \"notifiers.synologyIndex.enabled\"\n }\n ],\n attrs: { id: \"content_use_synoindex\" }\n },\n [\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ]\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-syno2\",\n attrs: { title: \"Synology Indexer\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://synology.com/\" } },\n [_vm._v(\"Synology Notifier\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Synology Notifier is the notification system of Synology DSM\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_synologynotifier\",\n explanations: [\n \"Send notifications to the Synology Notifier?\",\n \"Note: requires Medusa to be running on your Synology DSM.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.synology.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.synology, \"enabled\", $$v)\n },\n expression: \"notifiers.synology.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.synology.enabled,\n expression: \"notifiers.synology.enabled\"\n }\n ],\n attrs: { id: \"content-use-synology-notifier\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.synology.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synology,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.synology.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"synology_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.synology.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synology,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.synology.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"synology_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.synology\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synology,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.synology.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pytivo\",\n attrs: { title: \"pyTivo\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://pytivo.sourceforge.net/wiki/index.php/PyTivo\"\n }\n },\n [_vm._v(\"pyTivo\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"pyTivo is both an HMO and GoBack server. This notifier will load the completed downloads to your Tivo.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pytivo\",\n explanations: [\"Send notifications to pyTivo?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pyTivo, \"enabled\", $$v)\n },\n expression: \"notifiers.pyTivo.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pyTivo.enabled,\n expression: \"notifiers.pyTivo.enabled\"\n }\n ],\n attrs: { id: \"content-use-pytivo\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"pyTivo IP:Port\",\n id: \"pytivo_host\",\n explanations: [\n \"host running pyTivo (eg. 192.168.1.1:9032)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pyTivo, \"host\", $$v)\n },\n expression: \"notifiers.pyTivo.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"pyTivo share name\",\n id: \"pytivo_name\",\n explanations: [\n \"(Messages & Settings > Account & System Information > System Information > DVR name)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.shareName,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pyTivo,\n \"shareName\",\n $$v\n )\n },\n expression: \"notifiers.pyTivo.shareName\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Tivo name\",\n id: \"pytivo_tivo_name\",\n explanations: [\n \"value used in pyTivo Web Configuration to name the share.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.name,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pyTivo, \"name\", $$v)\n },\n expression: \"notifiers.pyTivo.name\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"devices\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-growl\",\n attrs: { title: \"Growl\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://growl.info/\" } },\n [_vm._v(\"Growl\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A cross-platform unobtrusive global notification system.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_growl_client\",\n explanations: [\"Send Growl notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.growl, \"enabled\", $$v)\n },\n expression: \"notifiers.growl.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.growl.enabled,\n expression: \"notifiers.growl.enabled\"\n }\n ],\n attrs: { id: \"content-use-growl-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"growl_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.growl.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"growl_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.growl.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"growl_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.growl\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.growl.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Growl IP:Port\",\n id: \"growl_host\",\n explanations: [\n \"host running Growl (eg. 192.168.1.100:23053)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.growl, \"host\", $$v)\n },\n expression: \"notifiers.growl.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"growl_password\",\n explanations: [\n \"may leave blank if Medusa is on the same host.\",\n \"otherwise Growl requires a password to be used.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.growl.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testGrowl-result\" }\n },\n [\n _vm._v(\n \"Click below to register and test Growl, this is required for Growl notifications to work.\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Register Growl\",\n id: \"testGrowl\"\n },\n on: { click: _vm.testGrowl }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-prowl\",\n attrs: { title: \"Prowl\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://www.prowlapp.com/\" } },\n [_vm._v(\"Prowl\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"A Growl client for iOS.\")])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_prowl\",\n explanations: [\"Send Prowl notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.prowl, \"enabled\", $$v)\n },\n expression: \"notifiers.prowl.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.prowl.enabled,\n expression: \"notifiers.prowl.enabled\"\n }\n ],\n attrs: { id: \"content-use-prowl\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"prowl_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.prowl.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"prowl_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.prowl.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"prowl_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.prowl\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.prowl.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Prowl Message Title\",\n id: \"prowl_message_title\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.messageTitle,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"messageTitle\",\n $$v\n )\n },\n expression: \"notifiers.prowl.messageTitle\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"prowl_api\",\n label: \"Api\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"prowl_api\",\n id: \"prowl_api\",\n \"csv-enabled\": \"\",\n \"list-items\": _vm.notifiers.prowl.api\n },\n on: { change: _vm.onChangeProwlApi }\n }),\n _vm._v(\" \"),\n _c(\n \"span\",\n [\n _vm._v(\n \"Prowl API(s) listed here, will receive notifications for \"\n ),\n _c(\"b\", [_vm._v(\"all\")]),\n _vm._v(\n \" shows.\\n Your Prowl API key is available at:\\n \"\n ),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.prowlapp.com/api_settings.php\"\n }\n },\n [\n _vm._v(\n \"\\n https://www.prowlapp.com/api_settings.php\"\n )\n ]\n ),\n _c(\"br\"),\n _vm._v(\n \"\\n (This field may be blank except when testing.)\\n \"\n )\n ],\n 1\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"prowl_show_notification_list\",\n label: \"Show notification list\"\n }\n },\n [\n _c(\"show-selector\", {\n attrs: {\n \"select-class\":\n \"form-control input-sm max-input350\",\n placeholder: \"-- Select a Show --\"\n },\n on: {\n change: function($event) {\n return _vm.prowlUpdateApiKeys($event)\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"offset-sm-2 col-sm-offset-2 col-sm-10 content\"\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"prowl-show-list\",\n id: \"prowl-show-list\",\n \"list-items\":\n _vm.prowlSelectedShowApiKeys\n },\n on: {\n change: function($event) {\n return _vm.savePerShowNotifyList(\n \"prowl\",\n $event\n )\n }\n }\n }),\n _vm._v(\n \"\\n Configure per-show notifications here by entering Prowl API key(s), after selecting a show in the drop-down box.\\n Be sure to activate the 'Save for this show' button below after each entry.\\n \"\n ),\n _c(\"span\", [\n _vm._v(\n \"The values are automatically saved when adding the api key.\"\n )\n ])\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"prowl_priority\",\n label: \"Prowl priority\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.prowl.priority,\n expression: \"notifiers.prowl.priority\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"prowl_priority\",\n name: \"prowl_priority\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.prowl,\n \"priority\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.prowlPriorityOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"priority of Prowl messages from Medusa.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testProwl-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Prowl\",\n id: \"testProwl\"\n },\n on: { click: _vm.testProwl }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-libnotify\",\n attrs: { title: \"Libnotify\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://library.gnome.org/devel/libnotify/\"\n }\n },\n [_vm._v(\"Libnotify\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"p\",\n [\n _vm._v(\n \"The standard desktop notification API for Linux/*nix systems. This notifier will only function if the pynotify module is installed (Ubuntu/Debian package \"\n ),\n _c(\n \"app-link\",\n { attrs: { href: \"apt:python-notify\" } },\n [_vm._v(\"python-notify\")]\n ),\n _vm._v(\").\")\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_libnotify_client\",\n explanations: [\"Send Libnotify notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.libnotify.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.libnotify.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.libnotify.enabled,\n expression: \"notifiers.libnotify.enabled\"\n }\n ],\n attrs: { id: \"content-use-libnotify\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"libnotify_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.libnotify.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.libnotify.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"libnotify_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.libnotify.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.libnotify.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"libnotify_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.libnotify\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.libnotify.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testLibnotify-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Libnotify\",\n id: \"testLibnotify\"\n },\n on: { click: _vm.testLibnotify }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pushover\",\n attrs: { title: \"Pushover\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://pushover.net/\" } },\n [_vm._v(\"Pushover\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Pushover makes it easy to send real-time notifications to your Android and iOS devices.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pushover_client\",\n explanations: [\"Send Pushover notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pushover, \"enabled\", $$v)\n },\n expression: \"notifiers.pushover.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pushover.enabled,\n expression: \"notifiers.pushover.enabled\"\n }\n ],\n attrs: { id: \"content-use-pushover\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"pushover_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.pushover.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"pushover_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushover.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushover.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"pushover_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushover\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushover.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Pushover User Key\",\n id: \"pushover_userkey\",\n explanations: [\n \"User Key of your Pushover account\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.userKey,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"userKey\",\n $$v\n )\n },\n expression: \"notifiers.pushover.userKey\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Pushover API Key\",\n id: \"pushover_apikey\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.apiKey,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"apiKey\",\n $$v\n )\n },\n expression: \"notifiers.pushover.apiKey\"\n }\n },\n [\n _c(\n \"span\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://pushover.net/apps/build/\"\n }\n },\n [_c(\"b\", [_vm._v(\"Click here\")])]\n ),\n _vm._v(\" to create a Pushover API key\")\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushover_device\",\n label: \"Pushover Devices\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"pushover_device\",\n id: \"pushover_device\",\n \"list-items\":\n _vm.notifiers.pushover.device\n },\n on: {\n change: function($event) {\n _vm.notifiers.pushover.device = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"List of pushover devices you want to send notifications to\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushover_sound\",\n label: \"Pushover notification sound\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.pushover.sound,\n expression: \"notifiers.pushover.sound\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"pushover_sound\",\n name: \"pushover_sound\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.pushover,\n \"sound\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.pushoverSoundOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"Choose notification sound to use\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushover_priority\",\n label: \"Pushover notification priority\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.pushover.priority,\n expression:\n \"notifiers.pushover.priority\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"pushover_priority\",\n name: \"pushover_priority\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.pushover,\n \"priority\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(\n _vm.pushoverPriorityOptions,\n function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }\n ),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"priority of Pushover messages from Medusa\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPushover-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Pushover\",\n id: \"testPushover\"\n },\n on: { click: _vm.testPushover }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-boxcar2\",\n attrs: { title: \"Boxcar 2\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://new.boxcar.io/\" } },\n [_vm._v(\"Boxcar 2\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Read your messages where and when you want them!\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_boxcar2\",\n explanations: [\"Send boxcar2 notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.boxcar2, \"enabled\", $$v)\n },\n expression: \"notifiers.boxcar2.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.boxcar2.enabled,\n expression: \"notifiers.boxcar2.enabled\"\n }\n ],\n attrs: { id: \"content-use-boxcar2-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"boxcar2_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.boxcar2.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"boxcar2_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.boxcar2.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"boxcar2_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.boxcar2\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.boxcar2.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Boxcar2 Access token\",\n id: \"boxcar2_accesstoken\",\n explanations: [\n \"access token for your Boxcar account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.accessToken,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"accessToken\",\n $$v\n )\n },\n expression: \"notifiers.boxcar2.accessToken\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testBoxcar2-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Boxcar\",\n id: \"testBoxcar2\"\n },\n on: { click: _vm.testBoxcar2 }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pushalot\",\n attrs: { title: \"Pushalot\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://pushalot.com\" } },\n [_vm._v(\"Pushalot\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Pushalot is a platform for receiving custom push notifications to connected devices running Windows Phone or Windows 8.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pushalot\",\n explanations: [\"Send Pushalot notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushalot.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pushalot, \"enabled\", $$v)\n },\n expression: \"notifiers.pushalot.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pushalot.enabled,\n expression: \"notifiers.pushalot.enabled\"\n }\n ],\n attrs: { id: \"content-use-pushalot-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"pushalot_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushalot.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.pushalot.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"pushalot_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushalot.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushalot.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"pushalot_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushalot\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushalot.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Pushalot authorization token\",\n id: \"pushalot_authorizationtoken\",\n explanations: [\n \"authorization token of your Pushalot account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushalot.authToken,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"authToken\",\n $$v\n )\n },\n expression: \"notifiers.pushalot.authToken\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPushalot-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Pushalot\",\n id: \"testPushalot\"\n },\n on: { click: _vm.testPushalot }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pushbullet\",\n attrs: { title: \"Pushbullet\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://www.pushbullet.com\" } },\n [_vm._v(\"Pushbullet\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Pushbullet is a platform for receiving custom push notifications to connected devices running Android and desktop Chrome browsers.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pushbullet\",\n explanations: [\"Send pushbullet notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushbullet.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.pushbullet.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pushbullet.enabled,\n expression: \"notifiers.pushbullet.enabled\"\n }\n ],\n attrs: { id: \"content-use-pushbullet-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"pushbullet_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushbullet.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.pushbullet.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"pushbullet_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushbullet.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushbullet.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"pushbullet_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushbullet\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushbullet.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Pushbullet API key\",\n id: \"pushbullet_api\",\n explanations: [\n \"API key of your Pushbullet account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushbullet.api,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"api\",\n $$v\n )\n },\n expression: \"notifiers.pushbullet.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushbullet_device_list\",\n label: \"Pushbullet devices\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Update device list\",\n id: \"get-pushbullet-devices\"\n },\n on: {\n click: _vm.getPushbulletDeviceOptions\n }\n }),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.pushbullet.device,\n expression:\n \"notifiers.pushbullet.device\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"pushbullet_device_list\",\n name: \"pushbullet_device_list\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"device\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(\n _vm.pushbulletDeviceOptions,\n function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value },\n on: {\n change: function($event) {\n _vm.pushbulletTestInfo =\n \"Don't forget to save your new pushbullet settings.\"\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }\n ),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"select device you wish to push to.\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPushbullet-resultsfsf\" }\n },\n [_vm._v(_vm._s(_vm.pushbulletTestInfo))]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Pushbullet\",\n id: \"testPushbullet\"\n },\n on: { click: _vm.testPushbulletApi }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-join\",\n attrs: { title: \"Join\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://joaoapps.com/join/\" } },\n [_vm._v(\"Join\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Join is a platform for receiving custom push notifications to connected devices running Android and desktop Chrome browsers.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_join\",\n explanations: [\"Send join notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.join, \"enabled\", $$v)\n },\n expression: \"notifiers.join.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.join.enabled,\n expression: \"notifiers.join.enabled\"\n }\n ],\n attrs: { id: \"content-use-join-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"join_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.join,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.join.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"join_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.join,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.join.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"join_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.join.notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.join,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.join.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Join API key\",\n id: \"join_api\",\n explanations: [\n \"API key of your Join account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.api,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.join, \"api\", $$v)\n },\n expression: \"notifiers.join.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Join Device ID(s) key\",\n id: \"join_device\",\n explanations: [\n \"Enter DeviceID of the device(s) you wish to send notifications to, comma separated if using multiple.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.device,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.join, \"device\", $$v)\n },\n expression: \"notifiers.join.device\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testJoin-result\" }\n },\n [_vm._v(_vm._s(_vm.joinTestInfo))]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Join\",\n id: \"testJoin\"\n },\n on: { click: _vm.testJoinApi }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-freemobile\",\n attrs: { title: \"Free Mobile\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://mobile.free.fr/\" } },\n [_vm._v(\"Free Mobile\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Free Mobile is a famous French cellular network provider. It provides to their customer a free SMS API.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_freemobile\",\n explanations: [\"Send SMS notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.freemobile.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.freemobile.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.freemobile.enabled,\n expression: \"notifiers.freemobile.enabled\"\n }\n ],\n attrs: { id: \"content-use-freemobile-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"freemobile_notify_onsnatch\",\n explanations: [\n \"send an SMS when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.freemobile.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.freemobile.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"freemobile_notify_ondownload\",\n explanations: [\n \"send an SMS when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.freemobile.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.freemobile.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"freemobile_notify_onsubtitledownload\",\n explanations: [\n \"send an SMS when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.freemobile\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.freemobile.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Free Mobile customer ID\",\n id: \"freemobile_id\",\n explanations: [\n \"It's your Free Mobile customer ID (8 digits)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.freemobile.id,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"id\",\n $$v\n )\n },\n expression: \"notifiers.freemobile.id\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Free Mobile API Key\",\n id: \"freemobile_apikey\",\n explanations: [\n \"Find your API Key in your customer portal.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.freemobile.api,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"api\",\n $$v\n )\n },\n expression: \"notifiers.freemobile.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testFreeMobile-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test SMS\",\n id: \"testFreeMobile\"\n },\n on: { click: _vm.testFreeMobile }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-telegram\",\n attrs: { title: \"Telegram\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://telegram.org/\" } },\n [_vm._v(\"Telegram\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Telegram is a cloud-based instant messaging service.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_telegram\",\n explanations: [\"Send Telegram notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.telegram, \"enabled\", $$v)\n },\n expression: \"notifiers.telegram.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.telegram.enabled,\n expression: \"notifiers.telegram.enabled\"\n }\n ],\n attrs: { id: \"content-use-telegram-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"telegram_notify_onsnatch\",\n explanations: [\n \"Send a message when a download starts??\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.telegram,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.telegram.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"telegram_notify_ondownload\",\n explanations: [\n \"send a message when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.telegram.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.telegram,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.telegram.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"telegram_notify_onsubtitledownload\",\n explanations: [\n \"send a message when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.telegram\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.telegram,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.telegram.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"User/group ID\",\n id: \"telegram_id\",\n explanations: [\n \"Contact @myidbot on Telegram to get an ID\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.id,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.telegram, \"id\", $$v)\n },\n expression: \"notifiers.telegram.id\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Bot API token\",\n id: \"telegram_apikey\",\n explanations: [\n \"Contact @BotFather on Telegram to set up one\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.api,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.telegram, \"api\", $$v)\n },\n expression: \"notifiers.telegram.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testTelegram-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Telegram\",\n id: \"testTelegram\"\n },\n on: { click: _vm.testTelegram }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-discord\",\n attrs: { title: \"Discord\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://discordapp.com/\" } },\n [_vm._v(\"Discord\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Discord is a cloud-based All-in-one voice and text chat for gamers that's free, secure, and works on both your desktop and phone..\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_discord\",\n explanations: [\"Send Discord notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.discord, \"enabled\", $$v)\n },\n expression: \"notifiers.discord.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.discord.enabled,\n expression: \"notifiers.discord.enabled\"\n }\n ],\n attrs: { id: \"content-use-discord-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"discord_notify_onsnatch\",\n explanations: [\n \"Send a message when a download starts??\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.discord.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"discord_notify_ondownload\",\n explanations: [\n \"send a message when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.discord.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"discord_notify_onsubtitledownload\",\n explanations: [\n \"send a message when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.discord\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.discord.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Channel webhook\",\n id: \"discord_webhook\",\n explanations: [\n \"Add a webhook to a channel, use the returned url here\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.webhook,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"webhook\",\n $$v\n )\n },\n expression: \"notifiers.discord.webhook\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Text to speech\",\n id: \"discord_tts\",\n explanations: [\n \"Use discord text to speech feature\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.tts,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.discord, \"tts\", $$v)\n },\n expression: \"notifiers.discord.tts\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testDiscord-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Discord\",\n id: \"testDiscord\"\n },\n on: { click: _vm.testDiscord }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"social\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-twitter\",\n attrs: { title: \"Twitter\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://www.twitter.com\" } },\n [_vm._v(\"Twitter\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A social networking and microblogging service, enabling its users to send and read other users' messages called tweets.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_twitter\",\n explanations: [\n \"Should Medusa post tweets on Twitter?\",\n \"Note: you may want to use a secondary account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.twitter, \"enabled\", $$v)\n },\n expression: \"notifiers.twitter.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.twitter.enabled,\n expression: \"notifiers.twitter.enabled\"\n }\n ],\n attrs: { id: \"content-use-twitter\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"twitter_notify_onsnatch\",\n explanations: [\n \"send an SMS when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.twitter.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"twitter_notify_ondownload\",\n explanations: [\n \"send an SMS when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.twitter.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"twitter_notify_onsubtitledownload\",\n explanations: [\n \"send an SMS when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.twitter\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.twitter.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Send direct message\",\n id: \"twitter_usedm\",\n explanations: [\n \"send a notification via Direct Message, not via status update\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.directMessage,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"directMessage\",\n $$v\n )\n },\n expression: \"notifiers.twitter.directMessage\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Send DM to\",\n id: \"twitter_dmto\",\n explanations: [\n \"Twitter account to send Direct Messages to (must follow you)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.dmto,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.twitter, \"dmto\", $$v)\n },\n expression: \"notifiers.twitter.dmto\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"twitterStep1\",\n label: \"Step 1\"\n }\n },\n [\n _c(\n \"span\",\n { staticStyle: { \"font-size\": \"11px\" } },\n [\n _vm._v(\n 'Click the \"Request Authorization\" button. '\n ),\n _c(\"br\"),\n _vm._v(\n \"This will open a new page containing an auth key. \"\n ),\n _c(\"br\"),\n _vm._v(\n \"Note: if nothing happens check your popup blocker.\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Request Authorization\",\n id: \"twitter-step-1\"\n },\n on: {\n click: function($event) {\n return _vm.twitterStep1($event)\n }\n }\n })\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"twitterStep2\",\n label: \"Step 2\"\n }\n },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.twitterKey,\n expression: \"twitterKey\"\n }\n ],\n staticClass:\n \"form-control input-sm max-input350\",\n staticStyle: { display: \"inline\" },\n attrs: {\n type: \"text\",\n id: \"twitter_key\",\n placeholder:\n \"Enter the key Twitter gave you, and click 'Verify Key'\"\n },\n domProps: { value: _vm.twitterKey },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.twitterKey = $event.target.value\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Verify Key\",\n id: \"twitter-step-2\"\n },\n on: {\n click: function($event) {\n return _vm.twitterStep2($event)\n }\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"testNotification\",\n attrs: { id: \"testTwitter-result\" },\n domProps: {\n innerHTML: _vm._s(_vm.twitterTestInfo)\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Twitter\",\n id: \"testTwitter\"\n },\n on: { click: _vm.twitterTest }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-trakt\",\n attrs: { title: \"Trakt\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://trakt.tv/\" } },\n [_vm._v(\"Trakt\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"trakt helps keep a record of what TV shows and movies you are watching. Based on your favorites, trakt recommends additional shows and movies you'll enjoy!\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_trakt\",\n explanations: [\"Send Trakt.tv notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.trakt, \"enabled\", $$v)\n },\n expression: \"notifiers.trakt.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.trakt.enabled,\n expression: \"notifiers.trakt.enabled\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"trakt_username\",\n explanations: [\n \"username of your Trakt account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.trakt.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_pin\",\n label: \"Trakt PIN\"\n }\n },\n [\n _c(\"input\", {\n staticClass:\n \"form-control input-sm max-input250\",\n staticStyle: { display: \"inline\" },\n attrs: {\n type: \"text\",\n name: \"trakt_pin\",\n id: \"trakt_pin\",\n value: \"\",\n disabled: _vm.notifiers.trakt.accessToken\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: _vm.traktNewTokenMessage,\n id: \"TraktGetPin\"\n },\n on: { click: _vm.TraktGetPin }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa hide\",\n attrs: {\n type: \"button\",\n value: \"Authorize Medusa\",\n id: \"authTrakt\"\n },\n on: { click: _vm.authTrakt }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"PIN code to authorize Medusa to access Trakt on your behalf.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox-number\", {\n attrs: {\n label: \"API Timeout\",\n id: \"trakt_timeout\",\n explanations: [\n \"Seconds to wait for Trakt API to respond. (Use 0 to wait forever)\"\n ]\n },\n model: {\n value: _vm.notifiers.trakt.timeout,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"timeout\",\n $$v\n )\n },\n expression: \"notifiers.trakt.timeout\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_default_indexer\",\n label: \"Default indexer\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.trakt.defaultIndexer,\n expression:\n \"notifiers.trakt.defaultIndexer\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"trakt_default_indexer\",\n name: \"trakt_default_indexer\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.trakt,\n \"defaultIndexer\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.traktIndexersOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.key,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Sync libraries\",\n id: \"trakt_sync\",\n explanations: [\n \"Sync your Medusa show library with your Trakt collection.\",\n \"Note: Don't enable this setting if you use the Trakt addon for Kodi or any other script that syncs your library.\",\n \"Kodi detects that the episode was deleted and removes from collection which causes Medusa to re-add it. This causes a loop between Medusa and Kodi adding and deleting the episode.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.sync,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.trakt, \"sync\", $$v)\n },\n expression: \"notifiers.trakt.sync\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.trakt.sync,\n expression: \"notifiers.trakt.sync\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove Episodes From Collection\",\n id: \"trakt_remove_watchlist\",\n explanations: [\n \"Remove an Episode from your Trakt Collection if it is not in your Medusa Library.\",\n \"Note:Don't enable this setting if you use the Trakt addon for Kodi or any other script that syncs your library.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt.removeWatchlist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeWatchlist\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeWatchlist\"\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Sync watchlist\",\n id: \"trakt_sync_watchlist\",\n explanations: [\n \"Sync your Medusa library with your Trakt Watchlist (either Show and Episode).\",\n \"Episode will be added on watch list when wanted or snatched and will be removed when downloaded\",\n \"Note: By design, Trakt automatically removes episodes and/or shows from watchlist as soon you have watched them.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.syncWatchlist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"syncWatchlist\",\n $$v\n )\n },\n expression: \"notifiers.trakt.syncWatchlist\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.trakt.syncWatchlist,\n expression:\n \"notifiers.trakt.syncWatchlist\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_default_indexer\",\n label: \"Watchlist add method\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.trakt.methodAdd,\n expression:\n \"notifiers.trakt.methodAdd\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"trakt_method_add\",\n name: \"trakt_method_add\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.trakt,\n \"methodAdd\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.traktMethodOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.key,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"method in which to download episodes for new shows.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove episode\",\n id: \"trakt_remove_watchlist\",\n explanations: [\n \"remove an episode from your watchlist after it's downloaded.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt.removeWatchlist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeWatchlist\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeWatchlist\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove series\",\n id: \"trakt_remove_serieslist\",\n explanations: [\n \"remove the whole series from your watchlist after any download.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt.removeSerieslist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeSerieslist\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeSerieslist\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove watched show\",\n id: \"trakt_remove_show_from_application\",\n explanations: [\n \"remove the show from Medusa if it's ended and completely watched\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt\n .removeShowFromApplication,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeShowFromApplication\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeShowFromApplication\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Start paused\",\n id: \"trakt_start_paused\",\n explanations: [\n \"shows grabbed from your trakt watchlist start paused.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.startPaused,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"startPaused\",\n $$v\n )\n },\n expression: \"notifiers.trakt.startPaused\"\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Trakt blackList name\",\n id: \"trakt_blacklist_name\",\n explanations: [\n \"Name(slug) of List on Trakt for blacklisting show on 'Add Trending Show' & 'Add Recommended Shows' pages\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.blacklistName,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"blacklistName\",\n $$v\n )\n },\n expression: \"notifiers.trakt.blacklistName\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testTrakt-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Trakt\",\n id: \"testTrakt\"\n },\n on: { click: _vm.testTrakt }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Force Sync\",\n id: \"forceSync\"\n },\n on: { click: _vm.traktForceSync }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"trakt_pin_url\" },\n domProps: { value: _vm.notifiers.trakt.pinUrl }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-email\",\n attrs: { title: \"Email\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://en.wikipedia.org/wiki/Comparison_of_webmail_providers\"\n }\n },\n [_vm._v(\"Email\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Allows configuration of email notifications on a per show basis.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_email\",\n explanations: [\"Send email notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"enabled\", $$v)\n },\n expression: \"notifiers.email.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.email.enabled,\n expression: \"notifiers.email.enabled\"\n }\n ],\n attrs: { id: \"content-use-email\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"email_notify_onsnatch\",\n explanations: [\n \"Send a message when a download starts??\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.email.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"email_notify_ondownload\",\n explanations: [\n \"send a message when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.email.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"email_notify_onsubtitledownload\",\n explanations: [\n \"send a message when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.email\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.email.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"SMTP host\",\n id: \"email_host\",\n explanations: [\n \"hostname of your SMTP email server.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"host\", $$v)\n },\n expression: \"notifiers.email.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox-number\", {\n attrs: {\n min: 1,\n step: 1,\n label: \"SMTP port\",\n id: \"email_port\",\n explanations: [\n \"port number used to connect to your SMTP host.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.port,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"port\", $$v)\n },\n expression: \"notifiers.email.port\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"SMTP from\",\n id: \"email_from\",\n explanations: [\n \"sender email address, some hosts require a real address.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.from,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"from\", $$v)\n },\n expression: \"notifiers.email.from\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Use TLS\",\n id: \"email_tls\",\n explanations: [\"check to use TLS encryption.\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.tls,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"tls\", $$v)\n },\n expression: \"notifiers.email.tls\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"SMTP username\",\n id: \"email_username\",\n explanations: [\n \"(optional) your SMTP server username.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.email.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"SMTP password\",\n id: \"email_password\",\n explanations: [\n \"(optional) your SMTP server password.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.email.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"email_list\",\n label: \"Global email list\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"email_list\",\n id: \"email_list\",\n \"list-items\":\n _vm.notifiers.email.addressList\n },\n on: { change: _vm.emailUpdateAddressList }\n }),\n _vm._v(\n \"\\n Email addresses listed here, will receive notifications for \"\n ),\n _c(\"b\", [_vm._v(\"all\")]),\n _vm._v(\" shows.\"),\n _c(\"br\"),\n _vm._v(\n \"\\n (This field may be blank except when testing.)\\n \"\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Email Subject\",\n id: \"email_subject\",\n explanations: [\n \"Use a custom subject for some privacy protection?\",\n \"(Leave blank for the default Medusa subject)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.subject,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"subject\",\n $$v\n )\n },\n expression: \"notifiers.email.subject\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"email_show\",\n label: \"Show notification list\"\n }\n },\n [\n _c(\"show-selector\", {\n attrs: {\n \"select-class\":\n \"form-control input-sm max-input350\",\n placeholder: \"-- Select a Show --\"\n },\n on: {\n change: function($event) {\n return _vm.emailUpdateShowEmail($event)\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"offset-sm-2 col-sm-offset-2 col-sm-10 content\"\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"email_list\",\n id: \"email_list\",\n \"list-items\":\n _vm.emailSelectedShowAdresses\n },\n on: {\n change: function($event) {\n return _vm.savePerShowNotifyList(\n \"email\",\n $event\n )\n }\n }\n }),\n _vm._v(\n \"\\n Email addresses listed here, will receive notifications for \"\n ),\n _c(\"b\", [_vm._v(\"all\")]),\n _vm._v(\" shows.\"),\n _c(\"br\"),\n _vm._v(\n \"\\n (This field may be blank except when testing.)\\n \"\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testEmail-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Email\",\n id: \"testEmail\"\n },\n on: { click: _vm.testEmail }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-slack\",\n attrs: { title: \"Slack\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://slack.com\" } },\n [_vm._v(\"Slack\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Slack is a messaging app for teams.\")])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_slack_client\",\n explanations: [\"Send Slack notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.slack, \"enabled\", $$v)\n },\n expression: \"notifiers.slack.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.slack.enabled,\n expression: \"notifiers.slack.enabled\"\n }\n ],\n attrs: { id: \"content-use-slack-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"slack_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.slack.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"slack_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.slack.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"slack_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.slack\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.slack.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Slack Incoming Webhook\",\n id: \"slack_webhook\",\n explanations: [\n \"Create an incoming webhook, to communicate with your slack channel.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.webhook,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"webhook\",\n $$v\n )\n },\n expression: \"notifiers.slack.webhook\"\n }\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://my.slack.com/services/new/incoming-webhook\"\n }\n },\n [\n _vm._v(\n \"https://my.slack.com/services/new/incoming-webhook/\"\n )\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testSlack-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Slack\",\n id: \"testSlack\"\n },\n on: { click: _vm.testSlack }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n }),\n _vm._v(\" \"),\n _c(\"br\")\n ])\n ]\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"clearfix\" })\n ],\n 1\n )\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"label\",\n { staticClass: \"col-sm-2 control-label\", attrs: { for: \"kodi_host\" } },\n [_c(\"span\", [_vm._v(\"KODI IP:Port\")])]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"clear-left\" }, [\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\" some Plex Home Theaters \"),\n _c(\"b\", { staticClass: \"boldest\" }, [_vm._v(\"do not\")]),\n _vm._v(\" support notifications e.g. Plexapp for Samsung TVs\")\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/config-notifications.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { attrs: { id: \"config-notifications\" } },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"config\" } }, [\n _c(\"div\", { attrs: { id: \"config-content\" } }, [\n _c(\n \"form\",\n {\n attrs: { id: \"configForm\", method: \"post\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.save()\n }\n }\n },\n [\n _c(\"div\", { attrs: { id: \"config-components\" } }, [\n _c(\"ul\", [\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#home-theater-nas\" } }, [\n _vm._v(\"Home Theater / NAS\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#devices\" } }, [\n _vm._v(\"Devices\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#social\" } }, [\n _vm._v(\"Social\")\n ])\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"home-theater-nas\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-kodi\",\n attrs: { title: \"KODI\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://kodi.tv\" } },\n [_vm._v(\"KODI\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A free and open source cross-platform media center and home entertainment system software with a 10-foot user interface designed for the living-room TV.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_kodi\",\n explanations: [\"Send KODI commands?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.kodi, \"enabled\", $$v)\n },\n expression: \"notifiers.kodi.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.kodi.enabled,\n expression: \"notifiers.kodi.enabled\"\n }\n ],\n attrs: { id: \"content-use-kodi\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Always on\",\n id: \"kodi_always_on\",\n explanations: [\"log errors when unreachable?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.alwaysOn,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"alwaysOn\",\n $$v\n )\n },\n expression: \"notifiers.kodi.alwaysOn\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"kodi_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.kodi.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"kodi_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.kodi.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"kodi_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.kodi.notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.kodi.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Update library\",\n id: \"kodi_update_library\",\n explanations: [\n \"update KODI library when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.update.library,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi.update,\n \"library\",\n $$v\n )\n },\n expression: \"notifiers.kodi.update.library\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Full library update\",\n id: \"kodi_update_full\",\n explanations: [\n \"perform a full library update if update per-show fails?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.update.full,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi.update,\n \"full\",\n $$v\n )\n },\n expression: \"notifiers.kodi.update.full\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Clean library\",\n id: \"kodi_clean_library\",\n explanations: [\n \"clean KODI library when replaces a already downloaded episode?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.cleanLibrary,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"cleanLibrary\",\n $$v\n )\n },\n expression: \"notifiers.kodi.cleanLibrary\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Only update first host\",\n id: \"kodi_update_onlyfirst\",\n explanations: [\n \"only send library updates/clean to the first active host?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.update.onlyFirst,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi.update,\n \"onlyFirst\",\n $$v\n )\n },\n expression: \"notifiers.kodi.update.onlyFirst\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"col-sm-10 content\" },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"kodi_host\",\n id: \"kodi_host\",\n \"list-items\": _vm.notifiers.kodi.host\n },\n on: {\n change: function($event) {\n _vm.notifiers.kodi.host = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"host running KODI (eg. 192.168.1.100:8080)\"\n )\n ])\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"kodi_username\",\n explanations: [\n \"username for your KODI server (blank for none)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.kodi.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"kodi_password\",\n explanations: [\n \"password for your KODI server (blank for none)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.kodi.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testKODI-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test KODI\",\n id: \"testKODI\"\n },\n on: { click: _vm.testKODI }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-plex\",\n attrs: { title: \"Plex Media Server\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://plex.tv\" } },\n [_vm._v(\"Plex Media Server\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Experience your media on a visually stunning, easy to use interface on your Mac connected to your TV. Your media library has never looked this good!\"\n )\n ]),\n _vm._v(\" \"),\n _vm.notifiers.plex.server.enabled\n ? _c(\"p\", { staticClass: \"plexinfo\" }, [\n _vm._v(\n \"For sending notifications to Plex Home Theater (PHT) clients, use the KODI notifier with port \"\n ),\n _c(\"b\", [_vm._v(\"3005\")]),\n _vm._v(\".\")\n ])\n : _vm._e()\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_plex_server\",\n explanations: [\"Send Plex server notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.plex.server.enabled,\n expression: \"notifiers.plex.server.enabled\"\n }\n ],\n attrs: { id: \"content-use-plex-server\" }\n },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Plex Media Server Auth Token\",\n id: \"plex_server_token\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.token,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"token\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.token\"\n }\n },\n [\n _c(\"p\", [_vm._v(\"Auth Token used by plex\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\n \"span\",\n [\n _vm._v(\"See: \"),\n _c(\n \"app-link\",\n {\n staticClass: \"wiki\",\n attrs: {\n href:\n \"https://support.plex.tv/hc/en-us/articles/204059436-Finding-your-account-token-X-Plex-Token\"\n }\n },\n [\n _c(\"strong\", [\n _vm._v(\n \"Finding your account token\"\n )\n ])\n ]\n )\n ],\n 1\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"plex_server_username\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"plex_server_password\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Update Library\",\n id: \"plex_update_library\",\n explanations: [\"log errors when unreachable?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.server.updateLibrary,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"updateLibrary\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.server.updateLibrary\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"plex_server_host\",\n label: \"Plex Media Server IP:Port\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"plex_server_host\",\n id: \"plex_server_host\",\n \"list-items\":\n _vm.notifiers.plex.server.host\n },\n on: {\n change: function($event) {\n _vm.notifiers.plex.server.host = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"one or more hosts running Plex Media Server\"\n ),\n _c(\"br\"),\n _vm._v(\n \"(eg. 192.168.1.1:32400, 192.168.1.2:32400)\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"HTTPS\",\n id: \"plex_server_https\",\n explanations: [\n \"use https for plex media server requests?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.https,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"https\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.https\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"field-pair\" }, [\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPMS-result\" }\n },\n [\n _vm._v(\n \"Click below to test Plex Media Server(s)\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Plex Media Server\",\n id: \"testPMS\"\n },\n on: { click: _vm.testPMS }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: {\n type: \"submit\",\n value: \"Save Changes\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"clear-left\" }, [\n _vm._v(\" \")\n ])\n ])\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-plexth\",\n attrs: { title: \"Plex Media Client\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://plex.tv\" } },\n [_vm._v(\"Plex Home Theater\")]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_plex_client\",\n explanations: [\n \"Send Plex Home Theater notifications?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.client.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.plex.client.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.plex.client.enabled,\n expression: \"notifiers.plex.client.enabled\"\n }\n ],\n attrs: { id: \"content-use-plex-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"plex_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.client.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.client.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"plex_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.client.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.client.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"plex_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.client\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.client.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"plex_client_host\",\n label: \"Plex Home Theater IP:Port\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"plex_client_host\",\n id: \"plex_client_host\",\n \"list-items\":\n _vm.notifiers.plex.client.host\n },\n on: {\n change: function($event) {\n _vm.notifiers.plex.client.host = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"one or more hosts running Plex Home Theater\"\n ),\n _c(\"br\"),\n _vm._v(\n \"(eg. 192.168.1.100:3000, 192.168.1.101:3000)\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"plex_client_username\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.client.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.plex.client.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"plex_client_password\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.client.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.plex.client.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"field-pair\" }, [\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPHT-result\" }\n },\n [\n _vm._v(\n \"Click below to test Plex Home Theater(s)\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Plex Home Theater\",\n id: \"testPHT\"\n },\n on: { click: _vm.testPHT }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: {\n type: \"submit\",\n value: \"Save Changes\"\n }\n }),\n _vm._v(\" \"),\n _vm._m(1)\n ])\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-emby\",\n attrs: { title: \"Emby\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://emby.media\" } },\n [_vm._v(\"Emby\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A home media server built using other popular open source technologies.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_emby\",\n explanations: [\"Send update commands to Emby?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.emby.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.emby, \"enabled\", $$v)\n },\n expression: \"notifiers.emby.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.emby.enabled,\n expression: \"notifiers.emby.enabled\"\n }\n ],\n attrs: { id: \"content_use_emby\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Emby IP:Port\",\n id: \"emby_host\",\n explanations: [\n \"host running Emby (eg. 192.168.1.100:8096)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.emby.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.emby, \"host\", $$v)\n },\n expression: \"notifiers.emby.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: { label: \"Api Key\", id: \"emby_apikey\" },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.emby.apiKey,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.emby, \"apiKey\", $$v)\n },\n expression: \"notifiers.emby.apiKey\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testEMBY-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Emby\",\n id: \"testEMBY\"\n },\n on: { click: _vm.testEMBY }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-nmj\",\n attrs: { title: \"Networked Media Jukebox\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: { href: \"http://www.popcornhour.com/\" }\n },\n [_vm._v(\"NMJ\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"The Networked Media Jukebox, or NMJ, is the official media jukebox interface made available for the Popcorn Hour 200-series.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_nmj\",\n explanations: [\"Send update commands to NMJ?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"enabled\", $$v)\n },\n expression: \"notifiers.nmj.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.nmj.enabled,\n expression: \"notifiers.nmj.enabled\"\n }\n ],\n attrs: { id: \"content-use-nmj\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Popcorn IP address\",\n id: \"nmj_host\",\n explanations: [\n \"IP address of Popcorn 200-series (eg. 192.168.1.100)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"host\", $$v)\n },\n expression: \"notifiers.nmj.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"settingsNMJ\",\n label: \"Get settings\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Get Settings\",\n id: \"settingsNMJ\"\n },\n on: { click: _vm.settingsNMJ }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"the Popcorn Hour device must be powered on and NMJ running.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"NMJ database\",\n id: \"nmj_database\",\n explanations: [\n \"automatically filled via the 'Get Settings' button.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.database,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"database\", $$v)\n },\n expression: \"notifiers.nmj.database\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"NMJ mount\",\n id: \"nmj_mount\",\n explanations: [\n \"automatically filled via the 'Get Settings' button.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.mount,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"mount\", $$v)\n },\n expression: \"notifiers.nmj.mount\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testNMJ-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test NMJ\",\n id: \"testNMJ\"\n },\n on: { click: _vm.testNMJ }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-nmj\",\n attrs: { title: \"Networked Media Jukebox v2\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: { href: \"http://www.popcornhour.com/\" }\n },\n [_vm._v(\"NMJv2\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"The Networked Media Jukebox, or NMJv2, is the official media jukebox interface made available for the Popcorn Hour 300 & 400-series.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_nmjv2\",\n explanations: [\n \"Send popcorn hour (nmjv2) notifications?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmjv2.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmjv2, \"enabled\", $$v)\n },\n expression: \"notifiers.nmjv2.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.nmjv2.enabled,\n expression: \"notifiers.nmjv2.enabled\"\n }\n ],\n attrs: { id: \"content-use-nmjv2\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Popcorn IP address\",\n id: \"nmjv2_host\",\n explanations: [\n \"IP address of Popcorn 300/400-series (eg. 192.168.1.100)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmjv2.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmjv2, \"host\", $$v)\n },\n expression: \"notifiers.nmjv2.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"nmjv2_database_location\",\n label: \"Database location\"\n }\n },\n [\n _c(\n \"label\",\n {\n staticClass: \"space-right\",\n attrs: { for: \"NMJV2_DBLOC_A\" }\n },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.nmjv2.dbloc,\n expression: \"notifiers.nmjv2.dbloc\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"nmjv2_dbloc\",\n VALUE: \"local\",\n id: \"NMJV2_DBLOC_A\"\n },\n domProps: {\n checked: _vm._q(\n _vm.notifiers.nmjv2.dbloc,\n null\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.notifiers.nmjv2,\n \"dbloc\",\n null\n )\n }\n }\n }),\n _vm._v(\n \"\\n PCH Local Media\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"label\",\n { attrs: { for: \"NMJV2_DBLOC_B\" } },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.nmjv2.dbloc,\n expression: \"notifiers.nmjv2.dbloc\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"nmjv2_dbloc\",\n VALUE: \"network\",\n id: \"NMJV2_DBLOC_B\"\n },\n domProps: {\n checked: _vm._q(\n _vm.notifiers.nmjv2.dbloc,\n null\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.notifiers.nmjv2,\n \"dbloc\",\n null\n )\n }\n }\n }),\n _vm._v(\n \"\\n PCH Network Media\\n \"\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"nmjv2_database_instance\",\n label: \"Database instance\"\n }\n },\n [\n _c(\n \"select\",\n {\n staticClass: \"form-control input-sm\",\n attrs: { id: \"NMJv2db_instance\" }\n },\n [\n _c(\"option\", { attrs: { value: \"0\" } }, [\n _vm._v(\"#1 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"1\" } }, [\n _vm._v(\"#2 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"2\" } }, [\n _vm._v(\"#3 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"3\" } }, [\n _vm._v(\"#4 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"4\" } }, [\n _vm._v(\"#5 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"5\" } }, [\n _vm._v(\"#6 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"6\" } }, [\n _vm._v(\"#7 \")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"adjust this value if the wrong database is selected.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"get_nmjv2_find_database\",\n label: \"Find database\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Find Database\",\n id: \"settingsNMJv2\"\n },\n on: { click: _vm.settingsNMJv2 }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"the Popcorn Hour device must be powered on.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"NMJv2 database\",\n id: \"nmjv2_database\",\n explanations: [\n \"automatically filled via the 'Find Database' buttons.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmjv2.database,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.nmjv2,\n \"database\",\n $$v\n )\n },\n expression: \"notifiers.nmjv2.database\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testNMJv2-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test NMJv2\",\n id: \"testNMJv2\"\n },\n on: { click: _vm.testNMJv2 }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-syno1\",\n attrs: { title: \"Synology\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://synology.com/\" } },\n [_vm._v(\"Synology\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"The Synology DiskStation NAS.\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Synology Indexer is the daemon running on the Synology NAS to build its media database.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"HTTPS\",\n id: \"use_synoindex\",\n explanations: [\n \"Note: requires Medusa to be running on your Synology NAS.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.synologyIndex.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synologyIndex,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.synologyIndex.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.synologyIndex.enabled,\n expression: \"notifiers.synologyIndex.enabled\"\n }\n ],\n attrs: { id: \"content_use_synoindex\" }\n },\n [\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ]\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-syno2\",\n attrs: { title: \"Synology Indexer\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://synology.com/\" } },\n [_vm._v(\"Synology Notifier\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Synology Notifier is the notification system of Synology DSM\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_synologynotifier\",\n explanations: [\n \"Send notifications to the Synology Notifier?\",\n \"Note: requires Medusa to be running on your Synology DSM.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.synology.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.synology, \"enabled\", $$v)\n },\n expression: \"notifiers.synology.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.synology.enabled,\n expression: \"notifiers.synology.enabled\"\n }\n ],\n attrs: { id: \"content-use-synology-notifier\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.synology.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synology,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.synology.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"synology_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.synology.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synology,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.synology.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"synology_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.synology\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synology,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.synology.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pytivo\",\n attrs: { title: \"pyTivo\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://pytivo.sourceforge.net/wiki/index.php/PyTivo\"\n }\n },\n [_vm._v(\"pyTivo\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"pyTivo is both an HMO and GoBack server. This notifier will load the completed downloads to your Tivo.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pytivo\",\n explanations: [\"Send notifications to pyTivo?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pyTivo, \"enabled\", $$v)\n },\n expression: \"notifiers.pyTivo.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pyTivo.enabled,\n expression: \"notifiers.pyTivo.enabled\"\n }\n ],\n attrs: { id: \"content-use-pytivo\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"pyTivo IP:Port\",\n id: \"pytivo_host\",\n explanations: [\n \"host running pyTivo (eg. 192.168.1.1:9032)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pyTivo, \"host\", $$v)\n },\n expression: \"notifiers.pyTivo.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"pyTivo share name\",\n id: \"pytivo_name\",\n explanations: [\n \"(Messages & Settings > Account & System Information > System Information > DVR name)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.shareName,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pyTivo,\n \"shareName\",\n $$v\n )\n },\n expression: \"notifiers.pyTivo.shareName\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Tivo name\",\n id: \"pytivo_tivo_name\",\n explanations: [\n \"value used in pyTivo Web Configuration to name the share.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.name,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pyTivo, \"name\", $$v)\n },\n expression: \"notifiers.pyTivo.name\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"devices\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-growl\",\n attrs: { title: \"Growl\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://growl.info/\" } },\n [_vm._v(\"Growl\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A cross-platform unobtrusive global notification system.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_growl_client\",\n explanations: [\"Send Growl notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.growl, \"enabled\", $$v)\n },\n expression: \"notifiers.growl.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.growl.enabled,\n expression: \"notifiers.growl.enabled\"\n }\n ],\n attrs: { id: \"content-use-growl-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"growl_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.growl.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"growl_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.growl.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"growl_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.growl\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.growl.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Growl IP:Port\",\n id: \"growl_host\",\n explanations: [\n \"host running Growl (eg. 192.168.1.100:23053)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.growl, \"host\", $$v)\n },\n expression: \"notifiers.growl.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"growl_password\",\n explanations: [\n \"may leave blank if Medusa is on the same host.\",\n \"otherwise Growl requires a password to be used.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.growl.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testGrowl-result\" }\n },\n [\n _vm._v(\n \"Click below to register and test Growl, this is required for Growl notifications to work.\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Register Growl\",\n id: \"testGrowl\"\n },\n on: { click: _vm.testGrowl }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-prowl\",\n attrs: { title: \"Prowl\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://www.prowlapp.com/\" } },\n [_vm._v(\"Prowl\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"A Growl client for iOS.\")])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_prowl\",\n explanations: [\"Send Prowl notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.prowl, \"enabled\", $$v)\n },\n expression: \"notifiers.prowl.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.prowl.enabled,\n expression: \"notifiers.prowl.enabled\"\n }\n ],\n attrs: { id: \"content-use-prowl\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"prowl_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.prowl.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"prowl_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.prowl.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"prowl_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.prowl\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.prowl.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Prowl Message Title\",\n id: \"prowl_message_title\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.messageTitle,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"messageTitle\",\n $$v\n )\n },\n expression: \"notifiers.prowl.messageTitle\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"prowl_api\",\n label: \"Api\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"prowl_api\",\n id: \"prowl_api\",\n \"csv-enabled\": \"\",\n \"list-items\": _vm.notifiers.prowl.api\n },\n on: { change: _vm.onChangeProwlApi }\n }),\n _vm._v(\" \"),\n _c(\n \"span\",\n [\n _vm._v(\n \"Prowl API(s) listed here, will receive notifications for \"\n ),\n _c(\"b\", [_vm._v(\"all\")]),\n _vm._v(\n \" shows.\\n Your Prowl API key is available at:\\n \"\n ),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.prowlapp.com/api_settings.php\"\n }\n },\n [\n _vm._v(\n \"\\n https://www.prowlapp.com/api_settings.php\"\n )\n ]\n ),\n _c(\"br\"),\n _vm._v(\n \"\\n (This field may be blank except when testing.)\\n \"\n )\n ],\n 1\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"prowl_show_notification_list\",\n label: \"Show notification list\"\n }\n },\n [\n _c(\"show-selector\", {\n attrs: {\n \"select-class\":\n \"form-control input-sm max-input350\",\n placeholder: \"-- Select a Show --\"\n },\n on: {\n change: function($event) {\n return _vm.prowlUpdateApiKeys($event)\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"offset-sm-2 col-sm-offset-2 col-sm-10 content\"\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"prowl-show-list\",\n id: \"prowl-show-list\",\n \"list-items\":\n _vm.prowlSelectedShowApiKeys\n },\n on: {\n change: function($event) {\n return _vm.savePerShowNotifyList(\n \"prowl\",\n $event\n )\n }\n }\n }),\n _vm._v(\n \"\\n Configure per-show notifications here by entering Prowl API key(s), after selecting a show in the drop-down box.\\n Be sure to activate the 'Save for this show' button below after each entry.\\n \"\n ),\n _c(\"span\", [\n _vm._v(\n \"The values are automatically saved when adding the api key.\"\n )\n ])\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"prowl_priority\",\n label: \"Prowl priority\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.prowl.priority,\n expression: \"notifiers.prowl.priority\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"prowl_priority\",\n name: \"prowl_priority\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.prowl,\n \"priority\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.prowlPriorityOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"priority of Prowl messages from Medusa.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testProwl-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Prowl\",\n id: \"testProwl\"\n },\n on: { click: _vm.testProwl }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-libnotify\",\n attrs: { title: \"Libnotify\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://library.gnome.org/devel/libnotify/\"\n }\n },\n [_vm._v(\"Libnotify\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"p\",\n [\n _vm._v(\n \"The standard desktop notification API for Linux/*nix systems. This notifier will only function if the pynotify module is installed (Ubuntu/Debian package \"\n ),\n _c(\n \"app-link\",\n { attrs: { href: \"apt:python-notify\" } },\n [_vm._v(\"python-notify\")]\n ),\n _vm._v(\").\")\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_libnotify_client\",\n explanations: [\"Send Libnotify notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.libnotify.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.libnotify.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.libnotify.enabled,\n expression: \"notifiers.libnotify.enabled\"\n }\n ],\n attrs: { id: \"content-use-libnotify\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"libnotify_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.libnotify.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.libnotify.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"libnotify_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.libnotify.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.libnotify.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"libnotify_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.libnotify\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.libnotify.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testLibnotify-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Libnotify\",\n id: \"testLibnotify\"\n },\n on: { click: _vm.testLibnotify }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pushover\",\n attrs: { title: \"Pushover\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://pushover.net/\" } },\n [_vm._v(\"Pushover\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Pushover makes it easy to send real-time notifications to your Android and iOS devices.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pushover_client\",\n explanations: [\"Send Pushover notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pushover, \"enabled\", $$v)\n },\n expression: \"notifiers.pushover.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pushover.enabled,\n expression: \"notifiers.pushover.enabled\"\n }\n ],\n attrs: { id: \"content-use-pushover\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"pushover_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.pushover.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"pushover_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushover.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushover.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"pushover_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushover\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushover.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Pushover User Key\",\n id: \"pushover_userkey\",\n explanations: [\n \"User Key of your Pushover account\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.userKey,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"userKey\",\n $$v\n )\n },\n expression: \"notifiers.pushover.userKey\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Pushover API Key\",\n id: \"pushover_apikey\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.apiKey,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"apiKey\",\n $$v\n )\n },\n expression: \"notifiers.pushover.apiKey\"\n }\n },\n [\n _c(\n \"span\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://pushover.net/apps/build/\"\n }\n },\n [_c(\"b\", [_vm._v(\"Click here\")])]\n ),\n _vm._v(\" to create a Pushover API key\")\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushover_device\",\n label: \"Pushover Devices\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"pushover_device\",\n id: \"pushover_device\",\n \"list-items\":\n _vm.notifiers.pushover.device\n },\n on: {\n change: function($event) {\n _vm.notifiers.pushover.device = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"List of pushover devices you want to send notifications to\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushover_sound\",\n label: \"Pushover notification sound\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.pushover.sound,\n expression: \"notifiers.pushover.sound\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"pushover_sound\",\n name: \"pushover_sound\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.pushover,\n \"sound\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.pushoverSoundOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"Choose notification sound to use\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushover_priority\",\n label: \"Pushover notification priority\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.pushover.priority,\n expression:\n \"notifiers.pushover.priority\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"pushover_priority\",\n name: \"pushover_priority\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.pushover,\n \"priority\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(\n _vm.pushoverPriorityOptions,\n function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }\n ),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"priority of Pushover messages from Medusa\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPushover-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Pushover\",\n id: \"testPushover\"\n },\n on: { click: _vm.testPushover }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-boxcar2\",\n attrs: { title: \"Boxcar 2\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://new.boxcar.io/\" } },\n [_vm._v(\"Boxcar 2\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Read your messages where and when you want them!\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_boxcar2\",\n explanations: [\"Send boxcar2 notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.boxcar2, \"enabled\", $$v)\n },\n expression: \"notifiers.boxcar2.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.boxcar2.enabled,\n expression: \"notifiers.boxcar2.enabled\"\n }\n ],\n attrs: { id: \"content-use-boxcar2-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"boxcar2_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.boxcar2.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"boxcar2_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.boxcar2.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"boxcar2_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.boxcar2\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.boxcar2.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Boxcar2 Access token\",\n id: \"boxcar2_accesstoken\",\n explanations: [\n \"access token for your Boxcar account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.accessToken,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"accessToken\",\n $$v\n )\n },\n expression: \"notifiers.boxcar2.accessToken\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testBoxcar2-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Boxcar\",\n id: \"testBoxcar2\"\n },\n on: { click: _vm.testBoxcar2 }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pushalot\",\n attrs: { title: \"Pushalot\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://pushalot.com\" } },\n [_vm._v(\"Pushalot\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Pushalot is a platform for receiving custom push notifications to connected devices running Windows Phone or Windows 8.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pushalot\",\n explanations: [\"Send Pushalot notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushalot.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pushalot, \"enabled\", $$v)\n },\n expression: \"notifiers.pushalot.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pushalot.enabled,\n expression: \"notifiers.pushalot.enabled\"\n }\n ],\n attrs: { id: \"content-use-pushalot-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"pushalot_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushalot.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.pushalot.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"pushalot_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushalot.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushalot.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"pushalot_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushalot\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushalot.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Pushalot authorization token\",\n id: \"pushalot_authorizationtoken\",\n explanations: [\n \"authorization token of your Pushalot account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushalot.authToken,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"authToken\",\n $$v\n )\n },\n expression: \"notifiers.pushalot.authToken\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPushalot-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Pushalot\",\n id: \"testPushalot\"\n },\n on: { click: _vm.testPushalot }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pushbullet\",\n attrs: { title: \"Pushbullet\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://www.pushbullet.com\" } },\n [_vm._v(\"Pushbullet\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Pushbullet is a platform for receiving custom push notifications to connected devices running Android and desktop Chrome browsers.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pushbullet\",\n explanations: [\"Send pushbullet notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushbullet.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.pushbullet.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pushbullet.enabled,\n expression: \"notifiers.pushbullet.enabled\"\n }\n ],\n attrs: { id: \"content-use-pushbullet-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"pushbullet_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushbullet.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.pushbullet.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"pushbullet_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushbullet.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushbullet.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"pushbullet_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushbullet\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushbullet.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Pushbullet API key\",\n id: \"pushbullet_api\",\n explanations: [\n \"API key of your Pushbullet account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushbullet.api,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"api\",\n $$v\n )\n },\n expression: \"notifiers.pushbullet.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushbullet_device_list\",\n label: \"Pushbullet devices\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Update device list\",\n id: \"get-pushbullet-devices\"\n },\n on: {\n click: _vm.getPushbulletDeviceOptions\n }\n }),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.pushbullet.device,\n expression:\n \"notifiers.pushbullet.device\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"pushbullet_device_list\",\n name: \"pushbullet_device_list\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"device\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(\n _vm.pushbulletDeviceOptions,\n function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value },\n on: {\n change: function($event) {\n _vm.pushbulletTestInfo =\n \"Don't forget to save your new pushbullet settings.\"\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }\n ),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"select device you wish to push to.\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPushbullet-resultsfsf\" }\n },\n [_vm._v(_vm._s(_vm.pushbulletTestInfo))]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Pushbullet\",\n id: \"testPushbullet\"\n },\n on: { click: _vm.testPushbulletApi }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-join\",\n attrs: { title: \"Join\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://joaoapps.com/join/\" } },\n [_vm._v(\"Join\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Join is a platform for receiving custom push notifications to connected devices running Android and desktop Chrome browsers.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_join\",\n explanations: [\"Send join notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.join, \"enabled\", $$v)\n },\n expression: \"notifiers.join.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.join.enabled,\n expression: \"notifiers.join.enabled\"\n }\n ],\n attrs: { id: \"content-use-join-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"join_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.join,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.join.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"join_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.join,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.join.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"join_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.join.notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.join,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.join.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Join API key\",\n id: \"join_api\",\n explanations: [\n \"API key of your Join account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.api,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.join, \"api\", $$v)\n },\n expression: \"notifiers.join.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Join Device ID(s) key\",\n id: \"join_device\",\n explanations: [\n \"Enter DeviceID of the device(s) you wish to send notifications to, comma separated if using multiple.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.device,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.join, \"device\", $$v)\n },\n expression: \"notifiers.join.device\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testJoin-result\" }\n },\n [_vm._v(_vm._s(_vm.joinTestInfo))]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Join\",\n id: \"testJoin\"\n },\n on: { click: _vm.testJoinApi }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-freemobile\",\n attrs: { title: \"Free Mobile\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://mobile.free.fr/\" } },\n [_vm._v(\"Free Mobile\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Free Mobile is a famous French cellular network provider. It provides to their customer a free SMS API.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_freemobile\",\n explanations: [\"Send SMS notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.freemobile.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.freemobile.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.freemobile.enabled,\n expression: \"notifiers.freemobile.enabled\"\n }\n ],\n attrs: { id: \"content-use-freemobile-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"freemobile_notify_onsnatch\",\n explanations: [\n \"send an SMS when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.freemobile.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.freemobile.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"freemobile_notify_ondownload\",\n explanations: [\n \"send an SMS when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.freemobile.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.freemobile.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"freemobile_notify_onsubtitledownload\",\n explanations: [\n \"send an SMS when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.freemobile\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.freemobile.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Free Mobile customer ID\",\n id: \"freemobile_id\",\n explanations: [\n \"It's your Free Mobile customer ID (8 digits)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.freemobile.id,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"id\",\n $$v\n )\n },\n expression: \"notifiers.freemobile.id\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Free Mobile API Key\",\n id: \"freemobile_apikey\",\n explanations: [\n \"Find your API Key in your customer portal.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.freemobile.api,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"api\",\n $$v\n )\n },\n expression: \"notifiers.freemobile.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testFreeMobile-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test SMS\",\n id: \"testFreeMobile\"\n },\n on: { click: _vm.testFreeMobile }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-telegram\",\n attrs: { title: \"Telegram\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://telegram.org/\" } },\n [_vm._v(\"Telegram\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Telegram is a cloud-based instant messaging service.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_telegram\",\n explanations: [\"Send Telegram notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.telegram, \"enabled\", $$v)\n },\n expression: \"notifiers.telegram.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.telegram.enabled,\n expression: \"notifiers.telegram.enabled\"\n }\n ],\n attrs: { id: \"content-use-telegram-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"telegram_notify_onsnatch\",\n explanations: [\n \"Send a message when a download starts??\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.telegram,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.telegram.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"telegram_notify_ondownload\",\n explanations: [\n \"send a message when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.telegram.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.telegram,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.telegram.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"telegram_notify_onsubtitledownload\",\n explanations: [\n \"send a message when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.telegram\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.telegram,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.telegram.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"User/group ID\",\n id: \"telegram_id\",\n explanations: [\n \"Contact @myidbot on Telegram to get an ID\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.id,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.telegram, \"id\", $$v)\n },\n expression: \"notifiers.telegram.id\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Bot API token\",\n id: \"telegram_apikey\",\n explanations: [\n \"Contact @BotFather on Telegram to set up one\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.api,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.telegram, \"api\", $$v)\n },\n expression: \"notifiers.telegram.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testTelegram-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Telegram\",\n id: \"testTelegram\"\n },\n on: { click: _vm.testTelegram }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-discord\",\n attrs: { title: \"Discord\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://discordapp.com/\" } },\n [_vm._v(\"Discord\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Discord is a cloud-based All-in-one voice and text chat for gamers that's free, secure, and works on both your desktop and phone..\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_discord\",\n explanations: [\"Send Discord notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.discord, \"enabled\", $$v)\n },\n expression: \"notifiers.discord.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.discord.enabled,\n expression: \"notifiers.discord.enabled\"\n }\n ],\n attrs: { id: \"content-use-discord-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"discord_notify_onsnatch\",\n explanations: [\n \"Send a message when a download starts??\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.discord.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"discord_notify_ondownload\",\n explanations: [\n \"send a message when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.discord.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"discord_notify_onsubtitledownload\",\n explanations: [\n \"send a message when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.discord\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.discord.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Channel webhook\",\n id: \"discord_webhook\",\n explanations: [\n \"Add a webhook to a channel, use the returned url here\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.webhook,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"webhook\",\n $$v\n )\n },\n expression: \"notifiers.discord.webhook\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Text to speech\",\n id: \"discord_tts\",\n explanations: [\n \"Use discord text to speech feature\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.tts,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.discord, \"tts\", $$v)\n },\n expression: \"notifiers.discord.tts\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Bot username\",\n id: \"discord_name\",\n explanations: [\n \"Create a username for the Discord Bot to use\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.name,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.discord, \"name\", $$v)\n },\n expression: \"notifiers.discord.name\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testDiscord-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Discord\",\n id: \"testDiscord\"\n },\n on: { click: _vm.testDiscord }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"social\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-twitter\",\n attrs: { title: \"Twitter\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://www.twitter.com\" } },\n [_vm._v(\"Twitter\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A social networking and microblogging service, enabling its users to send and read other users' messages called tweets.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_twitter\",\n explanations: [\n \"Should Medusa post tweets on Twitter?\",\n \"Note: you may want to use a secondary account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.twitter, \"enabled\", $$v)\n },\n expression: \"notifiers.twitter.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.twitter.enabled,\n expression: \"notifiers.twitter.enabled\"\n }\n ],\n attrs: { id: \"content-use-twitter\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"twitter_notify_onsnatch\",\n explanations: [\n \"send an SMS when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.twitter.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"twitter_notify_ondownload\",\n explanations: [\n \"send an SMS when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.twitter.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"twitter_notify_onsubtitledownload\",\n explanations: [\n \"send an SMS when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.twitter\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.twitter.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Send direct message\",\n id: \"twitter_usedm\",\n explanations: [\n \"send a notification via Direct Message, not via status update\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.directMessage,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"directMessage\",\n $$v\n )\n },\n expression: \"notifiers.twitter.directMessage\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Send DM to\",\n id: \"twitter_dmto\",\n explanations: [\n \"Twitter account to send Direct Messages to (must follow you)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.dmto,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.twitter, \"dmto\", $$v)\n },\n expression: \"notifiers.twitter.dmto\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"twitterStep1\",\n label: \"Step 1\"\n }\n },\n [\n _c(\n \"span\",\n { staticStyle: { \"font-size\": \"11px\" } },\n [\n _vm._v(\n 'Click the \"Request Authorization\" button. '\n ),\n _c(\"br\"),\n _vm._v(\n \"This will open a new page containing an auth key. \"\n ),\n _c(\"br\"),\n _vm._v(\n \"Note: if nothing happens check your popup blocker.\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Request Authorization\",\n id: \"twitter-step-1\"\n },\n on: {\n click: function($event) {\n return _vm.twitterStep1($event)\n }\n }\n })\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"twitterStep2\",\n label: \"Step 2\"\n }\n },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.twitterKey,\n expression: \"twitterKey\"\n }\n ],\n staticClass:\n \"form-control input-sm max-input350\",\n staticStyle: { display: \"inline\" },\n attrs: {\n type: \"text\",\n id: \"twitter_key\",\n placeholder:\n \"Enter the key Twitter gave you, and click 'Verify Key'\"\n },\n domProps: { value: _vm.twitterKey },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.twitterKey = $event.target.value\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Verify Key\",\n id: \"twitter-step-2\"\n },\n on: {\n click: function($event) {\n return _vm.twitterStep2($event)\n }\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"testNotification\",\n attrs: { id: \"testTwitter-result\" },\n domProps: {\n innerHTML: _vm._s(_vm.twitterTestInfo)\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Twitter\",\n id: \"testTwitter\"\n },\n on: { click: _vm.twitterTest }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-trakt\",\n attrs: { title: \"Trakt\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://trakt.tv/\" } },\n [_vm._v(\"Trakt\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"trakt helps keep a record of what TV shows and movies you are watching. Based on your favorites, trakt recommends additional shows and movies you'll enjoy!\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_trakt\",\n explanations: [\"Send Trakt.tv notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.trakt, \"enabled\", $$v)\n },\n expression: \"notifiers.trakt.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.trakt.enabled,\n expression: \"notifiers.trakt.enabled\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"trakt_username\",\n explanations: [\n \"username of your Trakt account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.trakt.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_pin\",\n label: \"Trakt PIN\"\n }\n },\n [\n _c(\"input\", {\n staticClass:\n \"form-control input-sm max-input250\",\n staticStyle: { display: \"inline\" },\n attrs: {\n type: \"text\",\n name: \"trakt_pin\",\n id: \"trakt_pin\",\n value: \"\",\n disabled: _vm.notifiers.trakt.accessToken\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: _vm.traktNewTokenMessage,\n id: \"TraktGetPin\"\n },\n on: { click: _vm.TraktGetPin }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa hide\",\n attrs: {\n type: \"button\",\n value: \"Authorize Medusa\",\n id: \"authTrakt\"\n },\n on: { click: _vm.authTrakt }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"PIN code to authorize Medusa to access Trakt on your behalf.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox-number\", {\n attrs: {\n label: \"API Timeout\",\n id: \"trakt_timeout\",\n explanations: [\n \"Seconds to wait for Trakt API to respond. (Use 0 to wait forever)\"\n ]\n },\n model: {\n value: _vm.notifiers.trakt.timeout,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"timeout\",\n $$v\n )\n },\n expression: \"notifiers.trakt.timeout\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_default_indexer\",\n label: \"Default indexer\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.trakt.defaultIndexer,\n expression:\n \"notifiers.trakt.defaultIndexer\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"trakt_default_indexer\",\n name: \"trakt_default_indexer\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.trakt,\n \"defaultIndexer\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.traktIndexersOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.key,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Sync libraries\",\n id: \"trakt_sync\",\n explanations: [\n \"Sync your Medusa show library with your Trakt collection.\",\n \"Note: Don't enable this setting if you use the Trakt addon for Kodi or any other script that syncs your library.\",\n \"Kodi detects that the episode was deleted and removes from collection which causes Medusa to re-add it. This causes a loop between Medusa and Kodi adding and deleting the episode.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.sync,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.trakt, \"sync\", $$v)\n },\n expression: \"notifiers.trakt.sync\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.trakt.sync,\n expression: \"notifiers.trakt.sync\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove Episodes From Collection\",\n id: \"trakt_remove_watchlist\",\n explanations: [\n \"Remove an Episode from your Trakt Collection if it is not in your Medusa Library.\",\n \"Note:Don't enable this setting if you use the Trakt addon for Kodi or any other script that syncs your library.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt.removeWatchlist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeWatchlist\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeWatchlist\"\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Sync watchlist\",\n id: \"trakt_sync_watchlist\",\n explanations: [\n \"Sync your Medusa library with your Trakt Watchlist (either Show and Episode).\",\n \"Episode will be added on watch list when wanted or snatched and will be removed when downloaded\",\n \"Note: By design, Trakt automatically removes episodes and/or shows from watchlist as soon you have watched them.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.syncWatchlist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"syncWatchlist\",\n $$v\n )\n },\n expression: \"notifiers.trakt.syncWatchlist\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.trakt.syncWatchlist,\n expression:\n \"notifiers.trakt.syncWatchlist\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_default_indexer\",\n label: \"Watchlist add method\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.trakt.methodAdd,\n expression:\n \"notifiers.trakt.methodAdd\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"trakt_method_add\",\n name: \"trakt_method_add\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.trakt,\n \"methodAdd\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.traktMethodOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.key,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"method in which to download episodes for new shows.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove episode\",\n id: \"trakt_remove_watchlist\",\n explanations: [\n \"remove an episode from your watchlist after it's downloaded.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt.removeWatchlist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeWatchlist\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeWatchlist\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove series\",\n id: \"trakt_remove_serieslist\",\n explanations: [\n \"remove the whole series from your watchlist after any download.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt.removeSerieslist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeSerieslist\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeSerieslist\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove watched show\",\n id: \"trakt_remove_show_from_application\",\n explanations: [\n \"remove the show from Medusa if it's ended and completely watched\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt\n .removeShowFromApplication,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeShowFromApplication\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeShowFromApplication\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Start paused\",\n id: \"trakt_start_paused\",\n explanations: [\n \"shows grabbed from your trakt watchlist start paused.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.startPaused,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"startPaused\",\n $$v\n )\n },\n expression: \"notifiers.trakt.startPaused\"\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Trakt blackList name\",\n id: \"trakt_blacklist_name\",\n explanations: [\n \"Name(slug) of List on Trakt for blacklisting show on 'Add Trending Show' & 'Add Recommended Shows' pages\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.blacklistName,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"blacklistName\",\n $$v\n )\n },\n expression: \"notifiers.trakt.blacklistName\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testTrakt-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Trakt\",\n id: \"testTrakt\"\n },\n on: { click: _vm.testTrakt }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Force Sync\",\n id: \"forceSync\"\n },\n on: { click: _vm.traktForceSync }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"trakt_pin_url\" },\n domProps: { value: _vm.notifiers.trakt.pinUrl }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-email\",\n attrs: { title: \"Email\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://en.wikipedia.org/wiki/Comparison_of_webmail_providers\"\n }\n },\n [_vm._v(\"Email\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Allows configuration of email notifications on a per show basis.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_email\",\n explanations: [\"Send email notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"enabled\", $$v)\n },\n expression: \"notifiers.email.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.email.enabled,\n expression: \"notifiers.email.enabled\"\n }\n ],\n attrs: { id: \"content-use-email\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"email_notify_onsnatch\",\n explanations: [\n \"Send a message when a download starts??\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.email.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"email_notify_ondownload\",\n explanations: [\n \"send a message when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.email.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"email_notify_onsubtitledownload\",\n explanations: [\n \"send a message when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.email\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.email.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"SMTP host\",\n id: \"email_host\",\n explanations: [\n \"hostname of your SMTP email server.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"host\", $$v)\n },\n expression: \"notifiers.email.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox-number\", {\n attrs: {\n min: 1,\n step: 1,\n label: \"SMTP port\",\n id: \"email_port\",\n explanations: [\n \"port number used to connect to your SMTP host.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.port,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"port\", $$v)\n },\n expression: \"notifiers.email.port\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"SMTP from\",\n id: \"email_from\",\n explanations: [\n \"sender email address, some hosts require a real address.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.from,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"from\", $$v)\n },\n expression: \"notifiers.email.from\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Use TLS\",\n id: \"email_tls\",\n explanations: [\"check to use TLS encryption.\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.tls,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"tls\", $$v)\n },\n expression: \"notifiers.email.tls\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"SMTP username\",\n id: \"email_username\",\n explanations: [\n \"(optional) your SMTP server username.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.email.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"SMTP password\",\n id: \"email_password\",\n explanations: [\n \"(optional) your SMTP server password.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.email.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"email_list\",\n label: \"Global email list\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"email_list\",\n id: \"email_list\",\n \"list-items\":\n _vm.notifiers.email.addressList\n },\n on: { change: _vm.emailUpdateAddressList }\n }),\n _vm._v(\n \"\\n Email addresses listed here, will receive notifications for \"\n ),\n _c(\"b\", [_vm._v(\"all\")]),\n _vm._v(\" shows.\"),\n _c(\"br\"),\n _vm._v(\n \"\\n (This field may be blank except when testing.)\\n \"\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Email Subject\",\n id: \"email_subject\",\n explanations: [\n \"Use a custom subject for some privacy protection?\",\n \"(Leave blank for the default Medusa subject)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.subject,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"subject\",\n $$v\n )\n },\n expression: \"notifiers.email.subject\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"email_show\",\n label: \"Show notification list\"\n }\n },\n [\n _c(\"show-selector\", {\n attrs: {\n \"select-class\":\n \"form-control input-sm max-input350\",\n placeholder: \"-- Select a Show --\"\n },\n on: {\n change: function($event) {\n return _vm.emailUpdateShowEmail($event)\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"offset-sm-2 col-sm-offset-2 col-sm-10 content\"\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"email_list\",\n id: \"email_list\",\n \"list-items\":\n _vm.emailSelectedShowAdresses\n },\n on: {\n change: function($event) {\n return _vm.savePerShowNotifyList(\n \"email\",\n $event\n )\n }\n }\n }),\n _vm._v(\n \"\\n Email addresses listed here, will receive notifications for \"\n ),\n _c(\"b\", [_vm._v(\"all\")]),\n _vm._v(\" shows.\"),\n _c(\"br\"),\n _vm._v(\n \"\\n (This field may be blank except when testing.)\\n \"\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testEmail-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Email\",\n id: \"testEmail\"\n },\n on: { click: _vm.testEmail }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-slack\",\n attrs: { title: \"Slack\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://slack.com\" } },\n [_vm._v(\"Slack\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Slack is a messaging app for teams.\")])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_slack_client\",\n explanations: [\"Send Slack notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.slack, \"enabled\", $$v)\n },\n expression: \"notifiers.slack.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.slack.enabled,\n expression: \"notifiers.slack.enabled\"\n }\n ],\n attrs: { id: \"content-use-slack-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"slack_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.slack.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"slack_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.slack.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"slack_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.slack\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.slack.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Slack Incoming Webhook\",\n id: \"slack_webhook\",\n explanations: [\n \"Create an incoming webhook, to communicate with your slack channel.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.webhook,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"webhook\",\n $$v\n )\n },\n expression: \"notifiers.slack.webhook\"\n }\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://my.slack.com/services/new/incoming-webhook\"\n }\n },\n [\n _vm._v(\n \"https://my.slack.com/services/new/incoming-webhook/\"\n )\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testSlack-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Slack\",\n id: \"testSlack\"\n },\n on: { click: _vm.testSlack }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n }),\n _vm._v(\" \"),\n _c(\"br\")\n ])\n ]\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"clearfix\" })\n ],\n 1\n )\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"label\",\n { staticClass: \"col-sm-2 control-label\", attrs: { for: \"kodi_host\" } },\n [_c(\"span\", [_vm._v(\"KODI IP:Port\")])]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"clear-left\" }, [\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\" some Plex Home Theaters \"),\n _c(\"b\", { staticClass: \"boldest\" }, [_vm._v(\"do not\")]),\n _vm._v(\" support notifications e.g. Plexapp for Samsung TVs\")\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/config-notifications.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1141,7 +1141,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"display-show-template\", class: _vm.theme },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _vm.show.id.slug\n ? _c(\"backstretch\", { attrs: { slug: _vm.show.id.slug } })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-id\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"indexer-name\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-slug\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"show-header\", {\n ref: \"show-header\",\n attrs: { type: \"show\", \"show-id\": _vm.id, \"show-indexer\": _vm.indexer },\n on: {\n reflow: _vm.reflowLayout,\n update: _vm.statusQualityUpdate,\n \"update-overview-status\": function($event) {\n _vm.filterByOverviewStatus = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\" },\n [\n _vm.show.seasons\n ? _c(\"vue-good-table\", {\n ref: \"table-seasons\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.orderSeasons,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: _vm.layout.show.pagination.enable,\n perPage: _vm.paginationPerPage,\n perPageDropdown: _vm.perPageDropdown\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search episodes\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"episode\", type: \"desc\" }\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: true\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n },\n \"on-per-page-change\": function($event) {\n return _vm.updatePaginationPerPage(\n $event.currentPerPage\n )\n },\n \"on-page-change\": _vm.onPageChange\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n {\n staticClass: \"season-header toggle collapse\"\n },\n [\n _c(\"app-link\", {\n attrs: {\n name: \"season-\" + props.row.season\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass:\n \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip:\n props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[\n props.column.field\n ],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.formattedRow[\n props.column.field\n ] || 0,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n props.formattedRow[\n props.column.field\n ],\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value: props.formattedRow[\n props.column.field\n ]\n ? props.formattedRow[\n props.column.field\n ]\n : \"\"\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description:\n props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.file.location\n }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Download\"\n ? _c(\n \"span\",\n [\n _vm.config.downloadUrl &&\n props.row.file.location &&\n [\"Downloaded\", \"Archived\"].includes(\n props.row.status\n )\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n _vm.config.downloadUrl +\n props.row.file.location\n }\n },\n [_vm._v(\"Download\")]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass:\n \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\n \"span\",\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 4204561448\n )\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.layout.show.specials &&\n _vm.specials &&\n _vm.specials.length > 0\n ? _c(\"vue-good-table\", {\n ref: \"table-specials\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.specials,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: false\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search specials\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"episode\", type: \"desc\" }\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: false\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n }\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n {\n staticClass: \"season-header toggle collapse\"\n },\n [\n _c(\"app-link\", {\n attrs: {\n name: \"season-\" + props.row.season\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass:\n \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip:\n props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[\n props.column.field\n ],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.formattedRow[\n props.column.field\n ] || 0,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n props.formattedRow[\n props.column.field\n ],\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value: props.formattedRow[\n props.column.field\n ]\n ? props.formattedRow[\n props.column.field\n ]\n : \"\"\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description:\n props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.file.location\n }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Download\"\n ? _c(\n \"span\",\n [\n _vm.config.downloadUrl &&\n props.row.file.location &&\n [\"Downloaded\", \"Archived\"].includes(\n props.row.status\n )\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n _vm.config.downloadUrl +\n props.row.file.location\n }\n },\n [_vm._v(\"Download\")]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass:\n \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\n \"span\",\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 4204561448\n )\n })\n : _vm._e()\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-start-backlog-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeBacklogSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-hidden\": \"true\"\n }\n },\n [_vm._v(\"×\")]\n ),\n _vm._v(\" \"),\n _c(\"h4\", { staticClass: \"modal-title\" }, [\n _vm._v(\"Start search?\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [\n _vm._v(\n \"Some episodes have been changed to 'Wanted'. Do you want to trigger a backlog search for these \" +\n _vm._s(_vm.backlogSearchEpisodes.length) +\n \" episode(s)\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search(_vm.backlogSearchEpisodes, \"backlog\")\n _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-mark-failed-and-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeFailedSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _vm._v(\n \"\\n Mark episode as failed and search?\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [_vm._v(\"Starting to search for the episode\")]),\n _vm._v(\" \"),\n _vm.failedSearchEpisode\n ? _c(\"p\", [\n _vm._v(\n \"Would you also like to mark episode \" +\n _vm._s(_vm.failedSearchEpisode.slug) +\n ' as \"failed\"? This will make sure the episode cannot be downloaded again'\n )\n ])\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search([_vm.failedSearchEpisode], \"backlog\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search([_vm.failedSearchEpisode], \"failed\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\n \"query-mark-failed-and-search\"\n )\n }\n }\n },\n [_vm._v(\"Cancel\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"display-show-template\", class: _vm.theme },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _vm.show.id.slug\n ? _c(\"backstretch\", { attrs: { slug: _vm.show.id.slug } })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-id\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"indexer-name\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-slug\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"show-header\", {\n ref: \"show-header\",\n attrs: { type: \"show\", \"show-id\": _vm.id, \"show-indexer\": _vm.indexer },\n on: {\n reflow: _vm.reflowLayout,\n update: _vm.statusQualityUpdate,\n \"update-overview-status\": function($event) {\n _vm.filterByOverviewStatus = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\" },\n [\n _vm.show.seasons\n ? _c(\"vue-good-table\", {\n ref: \"table-seasons\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.orderSeasons,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: _vm.layout.show.pagination.enable,\n perPage: _vm.paginationPerPage,\n perPageDropdown: _vm.perPageDropdown\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search episodes\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"episode\", type: \"desc\" }\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: true\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n },\n \"on-per-page-change\": function($event) {\n return _vm.updatePaginationPerPage(\n $event.currentPerPage\n )\n },\n \"on-page-change\": _vm.onPageChange\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n {\n staticClass: \"season-header toggle collapse\"\n },\n [\n _c(\"app-link\", {\n attrs: {\n name: \"season-\" + props.row.season\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass:\n \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip:\n props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[\n props.column.field\n ],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.formattedRow[\n props.column.field\n ] || 0,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n props.formattedRow[\n props.column.field\n ],\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value: props.formattedRow[\n props.column.field\n ]\n ? props.formattedRow[\n props.column.field\n ]\n : \"\"\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description:\n props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.file.location\n }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Download\"\n ? _c(\n \"span\",\n [\n _vm.config.downloadUrl &&\n props.row.file.location &&\n [\"Downloaded\", \"Archived\"].includes(\n props.row.status\n )\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n _vm.config.downloadUrl +\n props.row.file.location\n }\n },\n [_vm._v(\"Download\")]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass:\n \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\n \"span\",\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 4204561448\n )\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.layout.show.specials &&\n _vm.specials &&\n _vm.specials.length > 0\n ? _c(\"vue-good-table\", {\n ref: \"table-specials\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.specials,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: false\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search specials\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"episode\", type: \"desc\" }\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: false\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n }\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n {\n staticClass: \"season-header toggle collapse\"\n },\n [\n _c(\"app-link\", {\n attrs: {\n name: \"season-\" + props.row.season\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass:\n \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip:\n props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[\n props.column.field\n ],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.formattedRow[\n props.column.field\n ] || 0,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n props.formattedRow[\n props.column.field\n ],\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value: props.formattedRow[\n props.column.field\n ]\n ? props.formattedRow[\n props.column.field\n ]\n : \"\"\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description:\n props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.file.location\n }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Download\"\n ? _c(\n \"span\",\n [\n _vm.config.downloadUrl &&\n props.row.file.location &&\n [\"Downloaded\", \"Archived\"].includes(\n props.row.status\n )\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n _vm.config.downloadUrl +\n props.row.file.location\n }\n },\n [_vm._v(\"Download\")]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass:\n \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\n \"span\",\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 1270435715\n )\n })\n : _vm._e()\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-start-backlog-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeBacklogSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-hidden\": \"true\"\n }\n },\n [_vm._v(\"×\")]\n ),\n _vm._v(\" \"),\n _c(\"h4\", { staticClass: \"modal-title\" }, [\n _vm._v(\"Start search?\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [\n _vm._v(\n \"Some episodes have been changed to 'Wanted'. Do you want to trigger a backlog search for these \" +\n _vm._s(_vm.backlogSearchEpisodes.length) +\n \" episode(s)\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search(_vm.backlogSearchEpisodes, \"backlog\")\n _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-mark-failed-and-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeFailedSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _vm._v(\n \"\\n Mark episode as failed and search?\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [_vm._v(\"Starting to search for the episode\")]),\n _vm._v(\" \"),\n _vm.failedSearchEpisode\n ? _c(\"p\", [\n _vm._v(\n \"Would you also like to mark episode \" +\n _vm._s(_vm.failedSearchEpisode.slug) +\n ' as \"failed\"? This will make sure the episode cannot be downloaded again'\n )\n ])\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search([_vm.failedSearchEpisode], \"backlog\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search([_vm.failedSearchEpisode], \"failed\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\n \"query-mark-failed-and-search\"\n )\n }\n }\n },\n [_vm._v(\"Cancel\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1489,7 +1489,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-md-12 top-15 displayShow horizontal-scroll table-layout\",\n class: { fanartBackground: _vm.config.fanartBackground }\n },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.hideHistory ? \"Show History\" : \"Hide History\") +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression: \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\"\n }\n })\n ],\n 1\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.provider.name) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1561,7 +1561,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-results-wrapper\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\",\n class: { fanartBackground: _vm.config.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"button-row\" },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Refresh Results\" },\n on: { click: _vm.refreshResults }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Force Search\" },\n on: { click: _vm.forceSearch }\n }),\n _vm._v(\" \"),\n _vm.loading\n ? [\n _c(\"state-switch\", { attrs: { state: \"loading\" } }),\n _vm._v(\" \"),\n _c(\"span\", [_vm._v(_vm._s(_vm.loadingMessage))])\n ]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show.id.slug,\n expression: \"show.id.slug\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.combinedResults,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"pubdate\", type: \"desc\" }\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n styleClass: \"vgt-table condensed\"\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.imageName,\n alt: props.row.provider.name,\n width: \"16\"\n }\n })\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Added\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.dateAdded\n ? _vm.fuzzyParseDateTime(props.row.dateAdded)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Published\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.pubdate\n ? _vm.fuzzyParseDateTime(props.row.pubdate)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Updated\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.time\n ? _vm.fuzzyParseDateTime(props.row.time)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-results-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\n \"div\",\n { staticClass: \"button-row\" },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Refresh Results\" },\n on: { click: _vm.getProviderResults }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Force Search\" },\n on: { click: _vm.forceSearch }\n }),\n _vm._v(\" \"),\n _vm.loading\n ? [\n _c(\"state-switch\", { attrs: { state: \"loading\" } }),\n _vm._v(\" \"),\n _c(\"span\", [_vm._v(_vm._s(_vm.loadingMessage))])\n ]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show.id.slug,\n expression: \"show.id.slug\"\n }\n ],\n ref: \"vgt-show-results\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.combinedResults,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"pubdate\", type: \"desc\" }\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n styleClass: \"vgt-table condensed\"\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.imageName,\n alt: props.row.provider.name,\n width: \"16\"\n }\n })\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Added\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.dateAdded\n ? _vm.fuzzyParseDateTime(\n props.row.dateAdded\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Published\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.pubdate\n ? _vm.fuzzyParseDateTime(props.row.pubdate)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Updated\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.time\n ? _vm.fuzzyParseDateTime(props.row.time)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Snatch\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src: \"images/download.png\",\n width: \"16\",\n height: \"16\",\n alt: \"snatch\",\n title: \"Download selected episode\",\n \"data-identifier\": props.row.identifier\n },\n on: {\n click: function($event) {\n return _vm.snatchResult($event, props.row)\n }\n }\n })\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -4374,7 +4374,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-native-websocket */ \"./node_modules/vue-native-websocket/dist/build.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _modules__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules */ \"./src/store/modules/index.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vuex__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\nconst store = new vuex__WEBPACK_IMPORTED_MODULE_1__[\"Store\"]({\n modules: {\n auth: _modules__WEBPACK_IMPORTED_MODULE_3__[\"auth\"],\n config: _modules__WEBPACK_IMPORTED_MODULE_3__[\"config\"],\n defaults: _modules__WEBPACK_IMPORTED_MODULE_3__[\"defaults\"],\n history: _modules__WEBPACK_IMPORTED_MODULE_3__[\"history\"],\n notifications: _modules__WEBPACK_IMPORTED_MODULE_3__[\"notifications\"],\n provider: _modules__WEBPACK_IMPORTED_MODULE_3__[\"provider\"],\n search: _modules__WEBPACK_IMPORTED_MODULE_3__[\"search\"],\n shows: _modules__WEBPACK_IMPORTED_MODULE_3__[\"shows\"],\n socket: _modules__WEBPACK_IMPORTED_MODULE_3__[\"socket\"],\n stats: _modules__WEBPACK_IMPORTED_MODULE_3__[\"stats\"]\n },\n state: {},\n mutations: {},\n getters: {},\n actions: {}\n}); // Keep as a non-arrow function for `this` context.\n\nconst passToStoreHandler = function (eventName, event, next) {\n const target = eventName.toUpperCase();\n const eventData = event.data;\n\n if (target === 'SOCKET_ONMESSAGE') {\n const message = JSON.parse(eventData);\n const {\n data,\n event\n } = message; // Show the notification to the user\n\n if (event === 'notification') {\n const {\n body,\n hash,\n type,\n title\n } = data;\n window.displayNotification(type, title, body, hash);\n } else if (event === 'configUpdated') {\n const {\n section,\n config\n } = data;\n this.store.dispatch('updateConfig', {\n section,\n config\n });\n } else if (event === 'showUpdated') {\n this.store.dispatch('updateShow', data);\n } else if (event === 'addManualSearchResult') {\n this.store.dispatch('addManualSearchResult', data);\n } else if (event === 'QueueItemUpdate') {\n this.store.dispatch('updateQueueItem', data);\n } else {\n window.displayNotification('info', event, data);\n }\n } // Resume normal 'passToStore' handling\n\n\n next(eventName, event);\n};\n\nconst websocketUrl = (() => {\n const {\n protocol,\n host\n } = window.location;\n const proto = protocol === 'https:' ? 'wss:' : 'ws:';\n const WSMessageUrl = '/ui';\n const webRoot = document.body.getAttribute('web-root');\n return `${proto}//${host}${webRoot}/ws${WSMessageUrl}`;\n})();\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default.a, websocketUrl, {\n store,\n format: 'json',\n reconnection: true,\n // (Boolean) whether to reconnect automatically (false)\n reconnectionAttempts: 2,\n // (Number) number of reconnection attempts before giving up (Infinity),\n reconnectionDelay: 1000,\n // (Number) how long to initially wait before attempting a new (1000)\n passToStoreHandler,\n // (Function|) Handler for events triggered by the WebSocket (false)\n mutations: {\n SOCKET_ONOPEN: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONOPEN\"],\n SOCKET_ONCLOSE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONCLOSE\"],\n SOCKET_ONERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONERROR\"],\n SOCKET_ONMESSAGE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONMESSAGE\"],\n SOCKET_RECONNECT: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT\"],\n SOCKET_RECONNECT_ERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT_ERROR\"]\n }\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (store);\n\n//# sourceURL=webpack:///./src/store/index.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 vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-native-websocket */ \"./node_modules/vue-native-websocket/dist/build.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _modules__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules */ \"./src/store/modules/index.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vuex__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\nconst store = new vuex__WEBPACK_IMPORTED_MODULE_1__[\"Store\"]({\n modules: {\n auth: _modules__WEBPACK_IMPORTED_MODULE_3__[\"auth\"],\n config: _modules__WEBPACK_IMPORTED_MODULE_3__[\"config\"],\n defaults: _modules__WEBPACK_IMPORTED_MODULE_3__[\"defaults\"],\n history: _modules__WEBPACK_IMPORTED_MODULE_3__[\"history\"],\n notifications: _modules__WEBPACK_IMPORTED_MODULE_3__[\"notifications\"],\n provider: _modules__WEBPACK_IMPORTED_MODULE_3__[\"provider\"],\n search: _modules__WEBPACK_IMPORTED_MODULE_3__[\"search\"],\n shows: _modules__WEBPACK_IMPORTED_MODULE_3__[\"shows\"],\n socket: _modules__WEBPACK_IMPORTED_MODULE_3__[\"socket\"],\n stats: _modules__WEBPACK_IMPORTED_MODULE_3__[\"stats\"]\n },\n state: {},\n mutations: {},\n getters: {},\n actions: {}\n}); // Keep as a non-arrow function for `this` context.\n\nconst passToStoreHandler = function (eventName, event, next) {\n const target = eventName.toUpperCase();\n const eventData = event.data;\n\n if (target === 'SOCKET_ONMESSAGE') {\n const message = JSON.parse(eventData);\n const {\n data,\n event\n } = message; // Show the notification to the user\n\n if (event === 'notification') {\n const {\n body,\n hash,\n type,\n title\n } = data;\n window.displayNotification(type, title, body, hash);\n } else if (event === 'configUpdated') {\n const {\n section,\n config\n } = data;\n this.store.dispatch('updateConfig', {\n section,\n config\n });\n } else if (event === 'showUpdated' || event === 'showAdded') {\n this.store.dispatch('updateShow', data);\n } else if (event === 'addManualSearchResult') {\n this.store.dispatch('addManualSearchResult', data);\n } else if (event === 'QueueItemUpdate') {\n this.store.dispatch('updateQueueItem', data);\n } else {\n window.displayNotification('info', event, data);\n }\n } // Resume normal 'passToStore' handling\n\n\n next(eventName, event);\n};\n\nconst websocketUrl = (() => {\n const {\n protocol,\n host\n } = window.location;\n const proto = protocol === 'https:' ? 'wss:' : 'ws:';\n const WSMessageUrl = '/ui';\n const webRoot = document.body.getAttribute('web-root');\n return `${proto}//${host}${webRoot}/ws${WSMessageUrl}`;\n})();\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default.a, websocketUrl, {\n store,\n format: 'json',\n reconnection: true,\n // (Boolean) whether to reconnect automatically (false)\n reconnectionAttempts: 2,\n // (Number) number of reconnection attempts before giving up (Infinity),\n reconnectionDelay: 1000,\n // (Number) how long to initially wait before attempting a new (1000)\n passToStoreHandler,\n // (Function|) Handler for events triggered by the WebSocket (false)\n mutations: {\n SOCKET_ONOPEN: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONOPEN\"],\n SOCKET_ONCLOSE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONCLOSE\"],\n SOCKET_ONERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONERROR\"],\n SOCKET_ONMESSAGE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONMESSAGE\"],\n SOCKET_RECONNECT: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT\"],\n SOCKET_RECONNECT_ERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT_ERROR\"]\n }\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (store);\n\n//# sourceURL=webpack:///./src/store/index.js?"); /***/ }), @@ -4446,7 +4446,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /***/ (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/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../api */ \"./src/api.js\");\n/* harmony import */ var date_fns_format__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! date-fns/format */ \"./node_modules/date-fns/esm/format/index.js\");\n/* harmony import */ var date_fns_parseISO__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! date-fns/parseISO */ \"./node_modules/date-fns/esm/parseISO/index.js\");\n/* harmony import */ var javascript_time_ago__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! javascript-time-ago */ \"./node_modules/javascript-time-ago/index.js\");\n/* harmony import */ var javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! javascript-time-ago/locale/en */ \"./node_modules/javascript-time-ago/locale/en/index.js\");\n/* harmony import */ var javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5__);\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 // Add locale-specific relative date/time formatting rules.\n\njavascript_time_ago__WEBPACK_IMPORTED_MODULE_4__[\"default\"].addLocale(javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5___default.a);\nconst state = {\n show: {\n specials: null,\n showListOrder: [],\n pagination: {\n enable: null\n }\n },\n home: null,\n selectedRootIndex: null,\n history: null,\n historyLimit: null,\n schedule: null,\n wide: null,\n timezoneDisplay: null,\n timeStyle: null,\n dateStyle: null,\n themeName: null,\n animeSplitHomeInTabs: null,\n animeSplitHome: null,\n fanartBackground: null,\n fanartBackgroundOpacity: null,\n trimZero: null,\n sortArticle: null,\n fuzzyDating: null,\n comingEps: {\n missedRange: null,\n sort: null,\n displayPaused: null,\n layout: null\n },\n backlogOverview: {\n status: null,\n period: null\n },\n showFilterByName: '',\n posterSortdir: null,\n posterSortby: null,\n posterSize: 188,\n currentShowTab: null\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"]](state, {\n section,\n config\n }) {\n if (section === 'layout') {\n state = Object.assign(state, config);\n }\n }\n\n};\nconst getters = {\n fuzzyParseDateTime: state => airDate => {\n const timeAgo = new javascript_time_ago__WEBPACK_IMPORTED_MODULE_4__[\"default\"]('en-US');\n const {\n dateStyle,\n fuzzyDating,\n timeStyle\n } = state;\n\n if (!airDate) {\n return '';\n }\n\n if (fuzzyDating) {\n return timeAgo.format(new Date(airDate));\n }\n\n if (dateStyle === '%x') {\n return new Date(airDate).toLocaleString();\n }\n\n const fdate = Object(date_fns_parseISO__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(airDate);\n return Object(date_fns_format__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(fdate, Object(_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"convertDateFormat\"])(`${dateStyle} ${timeStyle}`));\n },\n getShowFilterByName: state => {\n return state.showFilterByName;\n }\n};\nconst actions = {\n setLayout(context, {\n page,\n layout\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n [page]: layout\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n [page]: layout\n }\n });\n });\n },\n\n setTheme(context, {\n themeName\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n themeName\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n themeName\n }\n });\n });\n },\n\n setSpecials(context, specials) {\n const {\n commit,\n state\n } = context;\n const show = Object.assign({}, state.show);\n show.specials = specials;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n show\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n show\n }\n });\n });\n },\n\n setShowFilterByName(context, {\n filter\n }) {\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n showFilterByName: filter\n }\n });\n },\n\n setPosterSortBy(context, {\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n posterSortby: value\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n posterSortby: value\n }\n });\n });\n },\n\n setPosterSortDir(context, {\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n posterSortdir: value\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n posterSortdir: value\n }\n });\n });\n },\n\n setPosterSize(context, {\n posterSize\n }) {\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n posterSize\n }\n });\n },\n\n setShowListOrder(context, {\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n show: {\n showListOrder: value\n }\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n show: {\n showListOrder: value\n }\n }\n });\n });\n },\n\n setStoreLayout(context, {\n key,\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n [key]: value\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n [key]: value\n }\n });\n });\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/config/layout.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/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../api */ \"./src/api.js\");\n/* harmony import */ var date_fns_format__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! date-fns/format */ \"./node_modules/date-fns/esm/format/index.js\");\n/* harmony import */ var date_fns_parseISO__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! date-fns/parseISO */ \"./node_modules/date-fns/esm/parseISO/index.js\");\n/* harmony import */ var javascript_time_ago__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! javascript-time-ago */ \"./node_modules/javascript-time-ago/index.js\");\n/* harmony import */ var javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! javascript-time-ago/locale/en */ \"./node_modules/javascript-time-ago/locale/en/index.js\");\n/* harmony import */ var javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5__);\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 // Add locale-specific relative date/time formatting rules.\n\njavascript_time_ago__WEBPACK_IMPORTED_MODULE_4__[\"default\"].addLocale(javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5___default.a);\nconst state = {\n show: {\n specials: null,\n showListOrder: [],\n pagination: {\n enable: null\n }\n },\n home: null,\n selectedRootIndex: null,\n history: null,\n historyLimit: null,\n schedule: null,\n wide: null,\n timezoneDisplay: null,\n timeStyle: null,\n dateStyle: null,\n themeName: null,\n animeSplitHomeInTabs: null,\n animeSplitHome: null,\n fanartBackground: null,\n fanartBackgroundOpacity: null,\n trimZero: null,\n sortArticle: null,\n fuzzyDating: null,\n comingEps: {\n missedRange: null,\n sort: null,\n displayPaused: null,\n layout: null\n },\n backlogOverview: {\n status: null,\n period: null\n },\n showFilterByName: '',\n posterSortdir: null,\n posterSortby: null,\n posterSize: 188,\n currentShowTab: null\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"]](state, {\n section,\n config\n }) {\n if (section === 'layout') {\n state = Object.assign(state, config);\n }\n }\n\n};\nconst getters = {\n fuzzyParseDateTime: state => airDate => {\n const timeAgo = new javascript_time_ago__WEBPACK_IMPORTED_MODULE_4__[\"default\"]('en-US');\n const {\n dateStyle,\n fuzzyDating,\n timeStyle\n } = state;\n\n if (!airDate) {\n return '';\n }\n\n if (fuzzyDating) {\n return timeAgo.format(new Date(airDate));\n }\n\n if (dateStyle === '%x') {\n return new Date(airDate).toLocaleString();\n }\n\n const fdate = Object(date_fns_parseISO__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(airDate);\n return Object(date_fns_format__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(fdate, Object(_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"convertDateFormat\"])(`${dateStyle} ${timeStyle}`));\n },\n getShowFilterByName: state => {\n return state.showFilterByName;\n }\n};\nconst actions = {\n setLayout(context, {\n page,\n layout\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n [page]: layout\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n [page]: layout\n }\n });\n });\n },\n\n setTheme(context, {\n themeName\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n themeName\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n themeName\n }\n });\n });\n },\n\n setSpecials(context, specials) {\n const {\n commit,\n state\n } = context;\n const show = Object.assign({}, state.show);\n show.specials = specials;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n show\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n show\n }\n });\n });\n },\n\n setShowFilterByName(context, {\n filter\n }) {\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n showFilterByName: filter\n }\n });\n },\n\n setPosterSortBy(context, {\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n posterSortby: value\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n posterSortby: value\n }\n });\n });\n },\n\n setPosterSortDir(context, {\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n posterSortdir: value\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n posterSortdir: value\n }\n });\n });\n },\n\n setPosterSize(context, {\n posterSize\n }) {\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n posterSize\n }\n });\n },\n\n setShowListOrder(context, {\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n show: {\n showListOrder: value\n }\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n show: {\n showListOrder: value\n }\n }\n });\n });\n },\n\n setStoreLayout(context, {\n key,\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n [key]: value\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n [key]: value\n }\n });\n });\n },\n\n setCurrentTab(context, value) {\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n currentShowTab: value\n }\n });\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/config/layout.js?"); /***/ }), @@ -4806,7 +4806,7 @@ eval("__webpack_require__.r(__webpack_exports__);\nconst state = {\n show: {\n /***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n history: [],\n page: 0,\n showHistory: {},\n episodeHistory: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"]](state, history) {\n // Update state\n state.history.push(...history);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_HISTORY\"]](state, {\n showSlug,\n history\n }) {\n // Keep an array of shows, with their history\n // Maybe we can just check the last id. And if the id's are newer, add them. Less fancy, much more fast.\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.showHistory, showSlug, history);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE_HISTORY\"]](state, {\n showSlug,\n episodeSlug,\n history\n }) {\n // Keep an object of shows, with their history per episode\n // Example: {tvdb1234: {s01e01: [history]}}\n if (!Object.keys(state.episodeHistory).includes(showSlug)) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.episodeHistory, showSlug, {});\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.episodeHistory[showSlug], episodeSlug, history);\n }\n\n};\nconst getters = {\n getShowHistoryBySlug: state => showSlug => state.showHistory[showSlug],\n getLastReleaseName: state => ({\n showSlug,\n episodeSlug\n }) => {\n if (state.episodeHistory[showSlug] !== undefined) {\n if (state.episodeHistory[showSlug][episodeSlug] !== undefined) {\n if (state.episodeHistory[showSlug][episodeSlug].length === 1) {\n return state.episodeHistory[showSlug][episodeSlug][0].resource;\n }\n\n const filteredHistory = state.episodeHistory[showSlug][episodeSlug].sort((a, b) => (a.actionDate - b.actionDate) * -1).filter(ep => ['Snatched', 'Downloaded'].includes(ep.statusName) && ep.resource !== '');\n\n if (filteredHistory.length > 0) {\n return filteredHistory[0].resource;\n }\n }\n }\n },\n getEpisodeHistory: state => ({\n showSlug,\n episodeSlug\n }) => {\n if (state.episodeHistory[showSlug] === undefined) {\n return [];\n }\n\n return state.episodeHistory[showSlug][episodeSlug] || [];\n },\n getSeasonHistory: state => ({\n showSlug\n }) => {\n if (state.episodeHistory[showSlug] === undefined) {\n return [];\n }\n\n return Object.keys(state.episodeHistory[showSlug]).reduce((r, k) => {\n return r.concat(state.episodeHistory[showSlug][k]);\n }, []);\n }\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show history from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n async getShowHistory(context, {\n slug\n }) {\n const {\n commit\n } = context;\n const response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/history/${slug}`);\n\n if (response.data.length > 0) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_HISTORY\"], {\n showSlug: slug,\n history: response.data\n });\n }\n },\n\n /**\n * Get history from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n async getHistory(context) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit\n };\n let lastPage = false;\n let response = null;\n\n while (!lastPage) {\n state.page += 1;\n params.page = state.page;\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/history', {\n params\n }); // eslint-disable-line no-await-in-loop\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"], response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n }\n },\n\n /**\n * Get episode history from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n async getShowEpisodeHistory(context, {\n showSlug,\n episodeSlug\n }) {\n const {\n commit\n } = context;\n\n try {\n const response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/history/${showSlug}/episode/${episodeSlug}`);\n\n if (response.data.length > 0) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE_HISTORY\"], {\n showSlug,\n episodeSlug,\n history: response.data\n });\n }\n } catch {\n console.warn(`No episode history found for show ${showSlug} and episode ${episodeSlug}`);\n }\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/history.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n history: [],\n page: 0,\n showHistory: {},\n episodeHistory: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"]](state, history) {\n // Update state\n state.history.push(...history);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_HISTORY\"]](state, {\n showSlug,\n history\n }) {\n // Keep an array of shows, with their history\n // Maybe we can just check the last id. And if the id's are newer, add them. Less fancy, much more fast.\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.showHistory, showSlug, history);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE_HISTORY\"]](state, {\n showSlug,\n episodeSlug,\n history\n }) {\n // Keep an object of shows, with their history per episode\n // Example: {tvdb1234: {s01e01: [history]}}\n if (!Object.keys(state.episodeHistory).includes(showSlug)) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.episodeHistory, showSlug, {});\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.episodeHistory[showSlug], episodeSlug, history);\n }\n\n};\nconst getters = {\n getShowHistoryBySlug: state => showSlug => state.showHistory[showSlug],\n getLastReleaseName: state => ({\n showSlug,\n episodeSlug\n }) => {\n if (state.episodeHistory[showSlug] !== undefined) {\n if (state.episodeHistory[showSlug][episodeSlug] !== undefined) {\n if (state.episodeHistory[showSlug][episodeSlug].length === 1) {\n return state.episodeHistory[showSlug][episodeSlug][0].resource;\n }\n\n const filteredHistory = state.episodeHistory[showSlug][episodeSlug].sort((a, b) => (a.actionDate - b.actionDate) * -1).filter(ep => ['Snatched', 'Downloaded'].includes(ep.statusName) && ep.resource !== '');\n\n if (filteredHistory.length > 0) {\n return filteredHistory[0].resource;\n }\n }\n }\n },\n getEpisodeHistory: state => ({\n showSlug,\n episodeSlug\n }) => {\n if (state.episodeHistory[showSlug] === undefined) {\n return [];\n }\n\n return state.episodeHistory[showSlug][episodeSlug] || [];\n },\n getSeasonHistory: state => ({\n showSlug\n }) => {\n if (state.episodeHistory[showSlug] === undefined) {\n return [];\n }\n\n return Object.keys(state.episodeHistory[showSlug]).reduce((r, k) => {\n return r.concat(state.episodeHistory[showSlug][k]);\n }, []);\n }\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show history from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n async getShowHistory(context, {\n slug\n }) {\n const {\n commit\n } = context;\n const response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/history/${slug}`);\n\n if (response.data.length > 0) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_HISTORY\"], {\n showSlug: slug,\n history: response.data\n });\n }\n },\n\n /**\n * Get history from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n async getHistory(context) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit\n };\n let lastPage = false;\n let response = null;\n\n while (!lastPage) {\n state.page += 1;\n params.page = state.page;\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/history', {\n params\n }); // eslint-disable-line no-await-in-loop\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"], response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n }\n },\n\n /**\n * Get episode history from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n getShowEpisodeHistory(context, {\n showSlug,\n episodeSlug\n }) {\n return new Promise(resolve => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/history/${showSlug}/episode/${episodeSlug}`).then(response => {\n if (response.data.length > 0) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE_HISTORY\"], {\n showSlug,\n episodeSlug,\n history: response.data\n });\n }\n\n resolve();\n }).catch(() => {\n console.warn(`No episode history found for show ${showSlug} and episode ${episodeSlug}`);\n });\n });\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/history.js?"); /***/ }), @@ -4842,7 +4842,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n let page = 0;\n let lastPage = false;\n let response = null;\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n } // Empty the providers cache\n\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n }); // eslint-disable-line no-await-in-loop\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n }\n }\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n let page = 0;\n let lastPage = false;\n let response = null;\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n } // Empty the providers cache\n\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n }); // eslint-disable-line no-await-in-loop\n\n return new Promise(resolve => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n\n resolve();\n });\n }\n }\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.js?"); /***/ }), diff --git a/themes/light/assets/js/medusa-runtime.js b/themes/light/assets/js/medusa-runtime.js index 36cb3ea034..28eaa4c438 100644 --- a/themes/light/assets/js/medusa-runtime.js +++ b/themes/light/assets/js/medusa-runtime.js @@ -104,7 +104,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api.js */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config-notifications',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTemplate\"],\n ConfigTextbox: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextbox\"],\n ConfigTextboxNumber: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextboxNumber\"],\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigToggleSlider\"],\n SelectList: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"SelectList\"],\n ShowSelector: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ShowSelector\"]\n },\n\n data() {\n return {\n prowlSelectedShow: null,\n prowlSelectedShowApiKeys: [],\n prowlPriorityOptions: [{\n text: 'Very Low',\n value: -2\n }, {\n text: 'Moderate',\n value: -1\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 1\n }, {\n text: 'Emergency',\n value: 2\n }],\n pushoverPriorityOptions: [{\n text: 'Lowest',\n value: -2\n }, {\n text: 'Low',\n value: -1\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 1\n }, {\n text: 'Emergency',\n value: 2\n }],\n pushoverSoundOptions: [{\n text: 'Default',\n value: 'default'\n }, {\n text: 'Pushover',\n value: 'pushover'\n }, {\n text: 'Bike',\n value: 'bike'\n }, {\n text: 'Bugle',\n value: 'bugle'\n }, {\n text: 'Cash Register',\n value: 'cashregister'\n }, {\n text: 'classical',\n value: 'classical'\n }, {\n text: 'Cosmic',\n value: 'cosmic'\n }, {\n text: 'Falling',\n value: 'falling'\n }, {\n text: 'Gamelan',\n value: 'gamelan'\n }, {\n text: 'Incoming',\n value: 'incoming'\n }, {\n text: 'Intermission',\n value: 'intermission'\n }, {\n text: 'Magic',\n value: 'magic'\n }, {\n text: 'Mechanical',\n value: 'mechanical'\n }, {\n text: 'Piano Bar',\n value: 'pianobar'\n }, {\n text: 'Siren',\n value: 'siren'\n }, {\n text: 'Space Alarm',\n value: 'spacealarm'\n }, {\n text: 'Tug Boat',\n value: 'tugboat'\n }, {\n text: 'Alien Alarm (long)',\n value: 'alien'\n }, {\n text: 'Climb (long)',\n value: 'climb'\n }, {\n text: 'Persistent (long)',\n value: 'persistant'\n }, {\n text: 'Pushover Echo (long)',\n value: 'echo'\n }, {\n text: 'Up Down (long)',\n value: 'updown'\n }, {\n text: 'None (silent)',\n value: 'none'\n }],\n pushbulletDeviceOptions: [{\n text: 'All devices',\n value: ''\n }],\n traktMethodOptions: [{\n text: 'Skip all',\n value: 0\n }, {\n text: 'Download pilot only',\n value: 1\n }, {\n text: 'Get whole show',\n value: 2\n }],\n pushbulletTestInfo: 'Click below to test.',\n joinTestInfo: 'Click below to test.',\n twitterTestInfo: 'Click below to test.',\n twitterKey: '',\n emailSelectedShow: null,\n emailSelectedShowAdresses: []\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n indexers: state => state.config.indexers,\n notifiers: state => state.config.notifiers\n }),\n\n traktNewTokenMessage() {\n const {\n accessToken\n } = this.notifiers.trakt;\n return true ? 'New ' : undefined;\n },\n\n traktIndexersOptions() {\n const {\n indexers\n } = this;\n const {\n traktIndexers\n } = indexers.main;\n const validTraktIndexer = Object.keys(indexers.indexers).filter(k => traktIndexers[k]);\n return validTraktIndexer.map(indexer => {\n return {\n text: indexer,\n value: indexers.indexers[indexer].id\n };\n });\n }\n\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n mounted() {\n // TODO: vueify this.\n $('#trakt_pin').on('keyup change', () => {\n if ($('#trakt_pin').val().length === 0) {\n $('#TraktGetPin').removeClass('hide');\n $('#authTrakt').addClass('hide');\n } else {\n $('#TraktGetPin').addClass('hide');\n $('#authTrakt').removeClass('hide');\n }\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])(['getShows', 'setConfig']),\n\n onChangeProwlApi(items) {\n this.notifiers.prowl.api = items.map(item => item.value);\n },\n\n savePerShowNotifyList(listType, values) {\n const {\n emailSelectedShow,\n prowlSelectedShow\n } = this;\n const form = new FormData();\n\n if (listType === 'prowl') {\n form.set('show', prowlSelectedShow);\n form.set('prowlAPIs', values.map(apiKey => apiKey.value));\n } else {\n form.set('show', emailSelectedShow);\n form.set('emails', values.map(apiKey => apiKey.value));\n } // Save the list\n\n\n _api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"].post('home/saveShowNotifyList', form);\n },\n\n async prowlUpdateApiKeys(selectedShow) {\n this.prowlSelectedShow = selectedShow;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/loadShowNotifyLists');\n\n if (response.data._size > 0) {\n const list = response.data[selectedShow].prowl_notify_list ? response.data[selectedShow].prowl_notify_list.split(',') : [];\n this.prowlSelectedShowApiKeys = selectedShow ? list : [];\n }\n },\n\n async emailUpdateShowEmail(selectedShow) {\n this.emailSelectedShow = selectedShow;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/loadShowNotifyLists');\n\n if (response.data._size > 0) {\n const list = response.data[selectedShow].list ? response.data[selectedShow].list.split(',') : [];\n this.emailSelectedShowAdresses = selectedShow ? list : [];\n }\n },\n\n emailUpdateAddressList(items) {\n this.notifiers.email.addressList = items.map(x => x.value);\n },\n\n async getPushbulletDeviceOptions() {\n const {\n api: pushbulletApiKey\n } = this.notifiers.pushbullet;\n\n if (!pushbulletApiKey) {\n this.pushbulletTestInfo = 'You didn\\'t supply a Pushbullet api key';\n $('#pushbullet_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/getPushbulletDevices', {\n params: {\n api: pushbulletApiKey\n }\n });\n const options = [];\n const {\n data\n } = response;\n\n if (!data) {\n return false;\n }\n\n options.push({\n text: 'All devices',\n value: ''\n });\n\n for (const device of data.devices) {\n if (device.active === true) {\n options.push({\n text: device.nickname,\n value: device.iden\n });\n }\n }\n\n this.pushbulletDeviceOptions = options;\n this.pushbulletTestInfo = 'Device list updated. Please choose a device to push to.';\n },\n\n async testPushbulletApi() {\n const {\n api: pushbulletApiKey\n } = this.notifiers.pushbullet;\n\n if (!pushbulletApiKey) {\n this.pushbulletTestInfo = 'You didn\\'t supply a Pushbullet api key';\n $('#pushbullet_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testPushbullet', {\n params: {\n api: pushbulletApiKey\n }\n });\n const {\n data\n } = response;\n\n if (data) {\n this.pushbulletTestInfo = data;\n }\n },\n\n async testJoinApi() {\n const {\n api: joinApiKey\n } = this.notifiers.join;\n\n if (!joinApiKey) {\n this.joinTestInfo = 'You didn\\'t supply a Join api key';\n $('#join_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testJoin', {\n params: {\n api: joinApiKey\n }\n });\n const {\n data\n } = response;\n\n if (data) {\n this.joinTestInfo = data;\n }\n },\n\n async twitterStep1() {\n this.twitterTestInfo = MEDUSA.config.loading;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/twitterStep1');\n const {\n data\n } = response;\n window.open(data);\n this.twitterTestInfo = 'Step1: Confirm Authorization';\n },\n\n async twitterStep2() {\n const twitter = {};\n const {\n twitterKey\n } = this;\n twitter.key = twitterKey;\n\n if (twitter.key) {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/twitterStep2', {\n params: {\n key: twitter.key\n }\n });\n const {\n data\n } = response;\n this.twitterTestInfo = data;\n } else {\n this.twitterTestInfo = 'Please fill out the necessary fields above.';\n }\n },\n\n async twitterTest() {\n try {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testTwitter');\n const {\n data\n } = response;\n this.twitterTestInfo = data;\n } catch (error) {\n this.twitterTestInfo = 'Error while trying to request for a test on the twitter api.';\n }\n },\n\n async save() {\n const {\n notifiers,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true;\n const section = 'main';\n\n try {\n await setConfig({\n section,\n config: {\n notifiers\n }\n });\n this.$snotify.success('Saved Notifiers config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save notifiers config', 'Error');\n } finally {\n this.saving = false;\n }\n },\n\n testGrowl() {\n const growl = {};\n growl.host = $.trim($('#growl_host').val());\n growl.password = $.trim($('#growl_password').val());\n\n if (!growl.host) {\n $('#testGrowl-result').html('Please fill out the necessary fields above.');\n $('#growl_host').addClass('warning');\n return;\n }\n\n $('#growl_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testGrowl-result').html(MEDUSA.config.loading);\n $.get('home/testGrowl', {\n host: growl.host,\n password: growl.password\n }).done(data => {\n $('#testGrowl-result').html(data);\n $('#testGrowl').prop('disabled', false);\n });\n },\n\n testProwl() {\n const prowl = {};\n prowl.api = $.trim($('#prowl_api').find('input').val());\n prowl.priority = $('#prowl_priority').find('input').val();\n\n if (!prowl.api) {\n $('#testProwl-result').html('Please fill out the necessary fields above.');\n $('#prowl_api').find('input').addClass('warning');\n return;\n }\n\n $('#prowl_api').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testProwl-result').html(MEDUSA.config.loading);\n $.get('home/testProwl', {\n prowl_api: prowl.api,\n // eslint-disable-line camelcase\n prowl_priority: prowl.priority // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testProwl-result').html(data);\n $('#testProwl').prop('disabled', false);\n });\n },\n\n testKODI() {\n const kodi = {};\n const kodiHostInput = $('#kodi_host').find('input');\n const kodiHosts = kodiHostInput.toArray().map(value => value.value).filter(item => item !== '');\n kodi.host = kodiHosts.join(',');\n kodi.username = $.trim($('#kodi_username').val());\n kodi.password = $.trim($('#kodi_password').val());\n\n if (!kodi.host) {\n $('#testKODI-result').html('Please fill out the necessary fields above.');\n $('#kodi_host').find('input').addClass('warning');\n return;\n }\n\n $('#kodi_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testKODI-result').html(MEDUSA.config.loading);\n $.get('home/testKODI', {\n host: kodi.host,\n username: kodi.username,\n password: kodi.password\n }).done(data => {\n $('#testKODI-result').html(data);\n $('#testKODI').prop('disabled', false);\n });\n },\n\n testPHT() {\n const plex = {};\n plex.client = {};\n const plexHostsInput = $('#plex_client_host').find('input');\n const plexHosts = plexHostsInput.toArray().map(value => value.value).filter(item => item !== '');\n plex.client.host = plexHosts.join(',');\n plex.client.username = $.trim($('#plex_client_username').val());\n plex.client.password = $.trim($('#plex_client_password').val());\n\n if (!plex.client.host) {\n $('#testPHT-result').html('Please fill out the necessary fields above.');\n $('#plex_client_host').find('input').addClass('warning');\n return;\n }\n\n $('#plex_client_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPHT-result').html(MEDUSA.config.loading);\n $.get('home/testPHT', {\n host: plex.client.host,\n username: plex.client.username,\n password: plex.client.password\n }).done(data => {\n $('#testPHT-result').html(data);\n $('#testPHT').prop('disabled', false);\n });\n },\n\n testPMS() {\n const plex = {};\n plex.server = {};\n const plexHostsInput = $('#plex_server_host').find('input');\n const plexHosts = plexHostsInput.toArray().map(value => value.value).filter(item => item !== '');\n plex.server.host = plexHosts.join(',');\n plex.server.username = $.trim($('#plex_server_username').val());\n plex.server.password = $.trim($('#plex_server_password').val());\n plex.server.token = $.trim($('#plex_server_token').val());\n\n if (!plex.server.host) {\n $('#testPMS-result').html('Please fill out the necessary fields above.');\n $('#plex_server_host').find('input').addClass('warning');\n return;\n }\n\n $('#plex_server_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPMS-result').html(MEDUSA.config.loading);\n $.get('home/testPMS', {\n host: plex.server.host,\n username: plex.server.username,\n password: plex.server.password,\n plex_server_token: plex.server.token // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testPMS-result').html(data);\n $('#testPMS').prop('disabled', false);\n });\n },\n\n testEMBY() {\n const emby = {};\n emby.host = $('#emby_host').val();\n emby.apikey = $('#emby_apikey').val();\n\n if (!emby.host || !emby.apikey) {\n $('#testEMBY-result').html('Please fill out the necessary fields above.');\n $('#emby_host').addRemoveWarningClass(emby.host);\n $('#emby_apikey').addRemoveWarningClass(emby.apikey);\n return;\n }\n\n $('#emby_host,#emby_apikey').children('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testEMBY-result').html(MEDUSA.config.loading);\n $.get('home/testEMBY', {\n host: emby.host,\n emby_apikey: emby.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testEMBY-result').html(data);\n $('#testEMBY').prop('disabled', false);\n });\n },\n\n testBoxcar2() {\n const boxcar2 = {};\n boxcar2.accesstoken = $.trim($('#boxcar2_accesstoken').val());\n\n if (!boxcar2.accesstoken) {\n $('#testBoxcar2-result').html('Please fill out the necessary fields above.');\n $('#boxcar2_accesstoken').addClass('warning');\n return;\n }\n\n $('#boxcar2_accesstoken').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testBoxcar2-result').html(MEDUSA.config.loading);\n $.get('home/testBoxcar2', {\n accesstoken: boxcar2.accesstoken\n }).done(data => {\n $('#testBoxcar2-result').html(data);\n $('#testBoxcar2').prop('disabled', false);\n });\n },\n\n testPushover() {\n const pushover = {};\n pushover.userkey = $('#pushover_userkey').val();\n pushover.apikey = $('#pushover_apikey').val();\n\n if (!pushover.userkey || !pushover.apikey) {\n $('#testPushover-result').html('Please fill out the necessary fields above.');\n $('#pushover_userkey').addRemoveWarningClass(pushover.userkey);\n $('#pushover_apikey').addRemoveWarningClass(pushover.apikey);\n return;\n }\n\n $('#pushover_userkey,#pushover_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPushover-result').html(MEDUSA.config.loading);\n $.get('home/testPushover', {\n userKey: pushover.userkey,\n apiKey: pushover.apikey\n }).done(data => {\n $('#testPushover-result').html(data);\n $('#testPushover').prop('disabled', false);\n });\n },\n\n testLibnotify() {\n $('#testLibnotify-result').html(MEDUSA.config.loading);\n $.get('home/testLibnotify', data => {\n $('#testLibnotify-result').html(data);\n });\n },\n\n settingsNMJ() {\n const nmj = {};\n nmj.host = $('#nmj_host').val();\n\n if (nmj.host) {\n $('#testNMJ-result').html(MEDUSA.config.loading);\n $.get('home/settingsNMJ', {\n host: nmj.host\n }, data => {\n if (data === null) {\n $('#nmj_database').removeAttr('readonly');\n $('#nmj_mount').removeAttr('readonly');\n }\n\n const JSONData = $.parseJSON(data);\n $('#testNMJ-result').html(JSONData.message);\n $('#nmj_database').val(JSONData.database);\n $('#nmj_mount').val(JSONData.mount);\n\n if (JSONData.database) {\n $('#nmj_database').prop('readonly', true);\n } else {\n $('#nmj_database').removeAttr('readonly');\n }\n\n if (JSONData.mount) {\n $('#nmj_mount').prop('readonly', true);\n } else {\n $('#nmj_mount').removeAttr('readonly');\n }\n });\n } else {\n alert('Please fill in the Popcorn IP address'); // eslint-disable-line no-alert\n\n $('#nmj_host').focus();\n }\n },\n\n testNMJ() {\n const nmj = {};\n nmj.host = $.trim($('#nmj_host').val());\n nmj.database = $('#nmj_database').val();\n nmj.mount = $('#nmj_mount').val();\n\n if (nmj.host) {\n $('#nmj_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testNMJ-result').html(MEDUSA.config.loading);\n $.get('home/testNMJ', {\n host: nmj.host,\n database: nmj.database,\n mount: nmj.mount\n }).done(data => {\n $('#testNMJ-result').html(data);\n $('#testNMJ').prop('disabled', false);\n });\n } else {\n $('#testNMJ-result').html('Please fill out the necessary fields above.');\n $('#nmj_host').addClass('warning');\n }\n },\n\n settingsNMJv2() {\n const nmjv2 = {};\n nmjv2.host = $('#nmjv2_host').val();\n\n if (nmjv2.host) {\n $('#testNMJv2-result').html(MEDUSA.config.loading);\n nmjv2.dbloc = '';\n const radios = document.getElementsByName('nmjv2_dbloc');\n\n for (let i = 0, len = radios.length; i < len; i++) {\n if (radios[i].checked) {\n nmjv2.dbloc = radios[i].value;\n break;\n }\n }\n\n nmjv2.dbinstance = $('#NMJv2db_instance').val();\n $.get('home/settingsNMJv2', {\n host: nmjv2.host,\n dbloc: nmjv2.dbloc,\n instance: nmjv2.dbinstance\n }, data => {\n if (data === null) {\n $('#nmjv2_database').removeAttr('readonly');\n }\n\n const JSONData = $.parseJSON(data);\n $('#testNMJv2-result').html(JSONData.message);\n $('#nmjv2_database').val(JSONData.database);\n\n if (JSONData.database) {\n $('#nmjv2_database').prop('readonly', true);\n } else {\n $('#nmjv2_database').removeAttr('readonly');\n }\n });\n } else {\n alert('Please fill in the Popcorn IP address'); // eslint-disable-line no-alert\n\n $('#nmjv2_host').focus();\n }\n },\n\n testNMJv2() {\n const nmjv2 = {};\n nmjv2.host = $.trim($('#nmjv2_host').val());\n\n if (nmjv2.host) {\n $('#nmjv2_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testNMJv2-result').html(MEDUSA.config.loading);\n $.get('home/testNMJv2', {\n host: nmjv2.host\n }).done(data => {\n $('#testNMJv2-result').html(data);\n $('#testNMJv2').prop('disabled', false);\n });\n } else {\n $('#testNMJv2-result').html('Please fill out the necessary fields above.');\n $('#nmjv2_host').addClass('warning');\n }\n },\n\n testFreeMobile() {\n const freemobile = {};\n freemobile.id = $.trim($('#freemobile_id').val());\n freemobile.apikey = $.trim($('#freemobile_apikey').val());\n\n if (!freemobile.id || !freemobile.apikey) {\n $('#testFreeMobile-result').html('Please fill out the necessary fields above.');\n\n if (freemobile.id) {\n $('#freemobile_id').removeClass('warning');\n } else {\n $('#freemobile_id').addClass('warning');\n }\n\n if (freemobile.apikey) {\n $('#freemobile_apikey').removeClass('warning');\n } else {\n $('#freemobile_apikey').addClass('warning');\n }\n\n return;\n }\n\n $('#freemobile_id,#freemobile_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testFreeMobile-result').html(MEDUSA.config.loading);\n $.get('home/testFreeMobile', {\n freemobile_id: freemobile.id,\n // eslint-disable-line camelcase\n freemobile_apikey: freemobile.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testFreeMobile-result').html(data);\n $('#testFreeMobile').prop('disabled', false);\n });\n },\n\n testTelegram() {\n const telegram = {};\n telegram.id = $.trim($('#telegram_id').val());\n telegram.apikey = $.trim($('#telegram_apikey').val());\n\n if (!telegram.id || !telegram.apikey) {\n $('#testTelegram-result').html('Please fill out the necessary fields above.');\n $('#telegram_id').addRemoveWarningClass(telegram.id);\n $('#telegram_apikey').addRemoveWarningClass(telegram.apikey);\n return;\n }\n\n $('#telegram_id,#telegram_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testTelegram-result').html(MEDUSA.config.loading);\n $.get('home/testTelegram', {\n telegram_id: telegram.id,\n // eslint-disable-line camelcase\n telegram_apikey: telegram.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTelegram-result').html(data);\n $('#testTelegram').prop('disabled', false);\n });\n },\n\n testDiscord() {\n const {\n notifiers\n } = this;\n\n if (!notifiers.discord.webhook) {\n $('#testDiscord-result').html('Please fill out the necessary fields above.');\n $('#discord_webhook').addRemoveWarningClass(notifiers.discord.webhook);\n return;\n }\n\n $('#discord_id,#discord_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testDiscord-result').html(MEDUSA.config.loading);\n $.get('home/testDiscord', {\n discord_webhook: notifiers.discord.webhook,\n // eslint-disable-line camelcase\n discord_tts: notifiers.discord.tts // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testDiscord-result').html(data);\n $('#testDiscord').prop('disabled', false);\n });\n },\n\n testSlack() {\n const slack = {};\n slack.webhook = $.trim($('#slack_webhook').val());\n\n if (!slack.webhook) {\n $('#testSlack-result').html('Please fill out the necessary fields above.');\n $('#slack_webhook').addRemoveWarningClass(slack.webhook);\n return;\n }\n\n $('#slack_webhook').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testSlack-result').html(MEDUSA.config.loading);\n $.get('home/testslack', {\n slack_webhook: slack.webhook // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testSlack-result').html(data);\n $('#testSlack').prop('disabled', false);\n });\n },\n\n TraktGetPin() {\n window.open($('#trakt_pin_url').val(), 'popUp', 'toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550');\n $('#trakt_pin').prop('disabled', false);\n },\n\n authTrakt() {\n const trakt = {};\n trakt.pin = $('#trakt_pin').val();\n\n if (trakt.pin.length !== 0) {\n $.get('home/getTraktToken', {\n trakt_pin: trakt.pin // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTrakt-result').html(data);\n $('#authTrakt').addClass('hide');\n $('#trakt_pin').prop('disabled', true);\n $('#trakt_pin').val('');\n $('#TraktGetPin').removeClass('hide');\n });\n }\n },\n\n testTrakt() {\n const trakt = {};\n trakt.username = $.trim($('#trakt_username').val());\n trakt.trendingBlacklist = $.trim($('#trakt_blacklist_name').val());\n\n if (!trakt.username) {\n $('#testTrakt-result').html('Please fill out the necessary fields above.');\n $('#trakt_username').addRemoveWarningClass(trakt.username);\n return;\n }\n\n if (/\\s/g.test(trakt.trendingBlacklist)) {\n $('#testTrakt-result').html('Check blacklist name; the value needs to be a trakt slug');\n $('#trakt_blacklist_name').addClass('warning');\n return;\n }\n\n $('#trakt_username').removeClass('warning');\n $('#trakt_blacklist_name').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testTrakt-result').html(MEDUSA.config.loading);\n $.get('home/testTrakt', {\n username: trakt.username,\n blacklist_name: trakt.trendingBlacklist // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTrakt-result').html(data);\n $('#testTrakt').prop('disabled', false);\n });\n },\n\n traktForceSync() {\n $('#testTrakt-result').html(MEDUSA.config.loading);\n $.getJSON('home/forceTraktSync', data => {\n $('#testTrakt-result').html(data.result);\n });\n },\n\n testEmail() {\n let to = '';\n const status = $('#testEmail-result');\n status.html(MEDUSA.config.loading);\n let host = $('#email_host').val();\n host = host.length > 0 ? host : null;\n let port = $('#email_port').val();\n port = port.length > 0 ? port : null;\n const tls = $('#email_tls').find('input').is(':checked') ? 1 : 0;\n let from = $('#email_from').val();\n from = from.length > 0 ? from : 'root@localhost';\n const user = $('#email_username').val().trim();\n const pwd = $('#email_password').val();\n let err = '';\n\n if (host === null) {\n err += '
  • You must specify an SMTP hostname!
  • ';\n }\n\n if (port === null) {\n err += '
  • You must specify an SMTP port!
  • ';\n } else if (port.match(/^\\d+$/) === null || Number.parseInt(port, 10) > 65535) {\n err += '
  • SMTP port must be between 0 and 65535!
  • ';\n }\n\n if (err.length > 0) {\n err = '
      ' + err + '
    ';\n status.html(err);\n } else {\n to = prompt('Enter an email address to send the test to:', null); // eslint-disable-line no-alert\n\n if (to === null || to.length === 0 || to.match(/.*@.*/) === null) {\n status.html('

    You must provide a recipient email address!

    ');\n } else {\n $.get('home/testEmail', {\n host,\n port,\n smtp_from: from,\n // eslint-disable-line camelcase\n use_tls: tls,\n // eslint-disable-line camelcase\n user,\n pwd,\n to\n }, msg => {\n $('#testEmail-result').html(msg);\n });\n }\n }\n },\n\n testPushalot() {\n const pushalot = {};\n pushalot.authToken = $.trim($('#pushalot_authorizationtoken').val());\n\n if (!pushalot.authToken) {\n $('#testPushalot-result').html('Please fill out the necessary fields above.');\n $('#pushalot_authorizationtoken').addClass('warning');\n return;\n }\n\n $('#pushalot_authorizationtoken').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPushalot-result').html(MEDUSA.config.loading);\n $.get('home/testPushalot', {\n authorizationToken: pushalot.authToken\n }).done(data => {\n $('#testPushalot-result').html(data);\n $('#testPushalot').prop('disabled', false);\n });\n }\n\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/config-notifications.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api.js */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'config-notifications',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"AppLink\"],\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTemplate\"],\n ConfigTextbox: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextbox\"],\n ConfigTextboxNumber: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigTextboxNumber\"],\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ConfigToggleSlider\"],\n SelectList: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"SelectList\"],\n ShowSelector: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"ShowSelector\"]\n },\n\n data() {\n return {\n prowlSelectedShow: null,\n prowlSelectedShowApiKeys: [],\n prowlPriorityOptions: [{\n text: 'Very Low',\n value: -2\n }, {\n text: 'Moderate',\n value: -1\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 1\n }, {\n text: 'Emergency',\n value: 2\n }],\n pushoverPriorityOptions: [{\n text: 'Lowest',\n value: -2\n }, {\n text: 'Low',\n value: -1\n }, {\n text: 'Normal',\n value: 0\n }, {\n text: 'High',\n value: 1\n }, {\n text: 'Emergency',\n value: 2\n }],\n pushoverSoundOptions: [{\n text: 'Default',\n value: 'default'\n }, {\n text: 'Pushover',\n value: 'pushover'\n }, {\n text: 'Bike',\n value: 'bike'\n }, {\n text: 'Bugle',\n value: 'bugle'\n }, {\n text: 'Cash Register',\n value: 'cashregister'\n }, {\n text: 'classical',\n value: 'classical'\n }, {\n text: 'Cosmic',\n value: 'cosmic'\n }, {\n text: 'Falling',\n value: 'falling'\n }, {\n text: 'Gamelan',\n value: 'gamelan'\n }, {\n text: 'Incoming',\n value: 'incoming'\n }, {\n text: 'Intermission',\n value: 'intermission'\n }, {\n text: 'Magic',\n value: 'magic'\n }, {\n text: 'Mechanical',\n value: 'mechanical'\n }, {\n text: 'Piano Bar',\n value: 'pianobar'\n }, {\n text: 'Siren',\n value: 'siren'\n }, {\n text: 'Space Alarm',\n value: 'spacealarm'\n }, {\n text: 'Tug Boat',\n value: 'tugboat'\n }, {\n text: 'Alien Alarm (long)',\n value: 'alien'\n }, {\n text: 'Climb (long)',\n value: 'climb'\n }, {\n text: 'Persistent (long)',\n value: 'persistant'\n }, {\n text: 'Pushover Echo (long)',\n value: 'echo'\n }, {\n text: 'Up Down (long)',\n value: 'updown'\n }, {\n text: 'None (silent)',\n value: 'none'\n }],\n pushbulletDeviceOptions: [{\n text: 'All devices',\n value: ''\n }],\n traktMethodOptions: [{\n text: 'Skip all',\n value: 0\n }, {\n text: 'Download pilot only',\n value: 1\n }, {\n text: 'Get whole show',\n value: 2\n }],\n pushbulletTestInfo: 'Click below to test.',\n joinTestInfo: 'Click below to test.',\n twitterTestInfo: 'Click below to test.',\n twitterKey: '',\n emailSelectedShow: null,\n emailSelectedShowAdresses: []\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n indexers: state => state.config.indexers,\n notifiers: state => state.config.notifiers\n }),\n\n traktNewTokenMessage() {\n const {\n accessToken\n } = this.notifiers.trakt;\n return true ? 'New ' : undefined;\n },\n\n traktIndexersOptions() {\n const {\n indexers\n } = this;\n const {\n traktIndexers\n } = indexers.main;\n const validTraktIndexer = Object.keys(indexers.indexers).filter(k => traktIndexers[k]);\n return validTraktIndexer.map(indexer => {\n return {\n text: indexer,\n value: indexers.indexers[indexer].id\n };\n });\n }\n\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n mounted() {\n // TODO: vueify this.\n $('#trakt_pin').on('keyup change', () => {\n if ($('#trakt_pin').val().length === 0) {\n $('#TraktGetPin').removeClass('hide');\n $('#authTrakt').addClass('hide');\n } else {\n $('#TraktGetPin').addClass('hide');\n $('#authTrakt').removeClass('hide');\n }\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])(['getShows', 'setConfig']),\n\n onChangeProwlApi(items) {\n this.notifiers.prowl.api = items.map(item => item.value);\n },\n\n savePerShowNotifyList(listType, values) {\n const {\n emailSelectedShow,\n prowlSelectedShow\n } = this;\n const form = new FormData();\n\n if (listType === 'prowl') {\n form.set('show', prowlSelectedShow);\n form.set('prowlAPIs', values.map(apiKey => apiKey.value));\n } else {\n form.set('show', emailSelectedShow);\n form.set('emails', values.map(apiKey => apiKey.value));\n } // Save the list\n\n\n _api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"].post('home/saveShowNotifyList', form);\n },\n\n async prowlUpdateApiKeys(selectedShow) {\n this.prowlSelectedShow = selectedShow;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/loadShowNotifyLists');\n\n if (response.data._size > 0) {\n const list = response.data[selectedShow].prowl_notify_list ? response.data[selectedShow].prowl_notify_list.split(',') : [];\n this.prowlSelectedShowApiKeys = selectedShow ? list : [];\n }\n },\n\n async emailUpdateShowEmail(selectedShow) {\n this.emailSelectedShow = selectedShow;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/loadShowNotifyLists');\n\n if (response.data._size > 0) {\n const list = response.data[selectedShow].list ? response.data[selectedShow].list.split(',') : [];\n this.emailSelectedShowAdresses = selectedShow ? list : [];\n }\n },\n\n emailUpdateAddressList(items) {\n this.notifiers.email.addressList = items.map(x => x.value);\n },\n\n async getPushbulletDeviceOptions() {\n const {\n api: pushbulletApiKey\n } = this.notifiers.pushbullet;\n\n if (!pushbulletApiKey) {\n this.pushbulletTestInfo = 'You didn\\'t supply a Pushbullet api key';\n $('#pushbullet_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/getPushbulletDevices', {\n params: {\n api: pushbulletApiKey\n }\n });\n const options = [];\n const {\n data\n } = response;\n\n if (!data) {\n return false;\n }\n\n options.push({\n text: 'All devices',\n value: ''\n });\n\n for (const device of data.devices) {\n if (device.active === true) {\n options.push({\n text: device.nickname,\n value: device.iden\n });\n }\n }\n\n this.pushbulletDeviceOptions = options;\n this.pushbulletTestInfo = 'Device list updated. Please choose a device to push to.';\n },\n\n async testPushbulletApi() {\n const {\n api: pushbulletApiKey\n } = this.notifiers.pushbullet;\n\n if (!pushbulletApiKey) {\n this.pushbulletTestInfo = 'You didn\\'t supply a Pushbullet api key';\n $('#pushbullet_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testPushbullet', {\n params: {\n api: pushbulletApiKey\n }\n });\n const {\n data\n } = response;\n\n if (data) {\n this.pushbulletTestInfo = data;\n }\n },\n\n async testJoinApi() {\n const {\n api: joinApiKey\n } = this.notifiers.join;\n\n if (!joinApiKey) {\n this.joinTestInfo = 'You didn\\'t supply a Join api key';\n $('#join_api').find('input').focus();\n return false;\n }\n\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testJoin', {\n params: {\n api: joinApiKey\n }\n });\n const {\n data\n } = response;\n\n if (data) {\n this.joinTestInfo = data;\n }\n },\n\n async twitterStep1() {\n this.twitterTestInfo = MEDUSA.config.loading;\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/twitterStep1');\n const {\n data\n } = response;\n window.open(data);\n this.twitterTestInfo = 'Step1: Confirm Authorization';\n },\n\n async twitterStep2() {\n const twitter = {};\n const {\n twitterKey\n } = this;\n twitter.key = twitterKey;\n\n if (twitter.key) {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/twitterStep2', {\n params: {\n key: twitter.key\n }\n });\n const {\n data\n } = response;\n this.twitterTestInfo = data;\n } else {\n this.twitterTestInfo = 'Please fill out the necessary fields above.';\n }\n },\n\n async twitterTest() {\n try {\n const response = await Object(_api_js__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/testTwitter');\n const {\n data\n } = response;\n this.twitterTestInfo = data;\n } catch (error) {\n this.twitterTestInfo = 'Error while trying to request for a test on the twitter api.';\n }\n },\n\n async save() {\n const {\n notifiers,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true;\n const section = 'main';\n\n try {\n await setConfig({\n section,\n config: {\n notifiers\n }\n });\n this.$snotify.success('Saved Notifiers config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save notifiers config', 'Error');\n } finally {\n this.saving = false;\n }\n },\n\n testGrowl() {\n const growl = {};\n growl.host = $.trim($('#growl_host').val());\n growl.password = $.trim($('#growl_password').val());\n\n if (!growl.host) {\n $('#testGrowl-result').html('Please fill out the necessary fields above.');\n $('#growl_host').addClass('warning');\n return;\n }\n\n $('#growl_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testGrowl-result').html(MEDUSA.config.loading);\n $.get('home/testGrowl', {\n host: growl.host,\n password: growl.password\n }).done(data => {\n $('#testGrowl-result').html(data);\n $('#testGrowl').prop('disabled', false);\n });\n },\n\n testProwl() {\n const prowl = {};\n prowl.api = $.trim($('#prowl_api').find('input').val());\n prowl.priority = $('#prowl_priority').find('input').val();\n\n if (!prowl.api) {\n $('#testProwl-result').html('Please fill out the necessary fields above.');\n $('#prowl_api').find('input').addClass('warning');\n return;\n }\n\n $('#prowl_api').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testProwl-result').html(MEDUSA.config.loading);\n $.get('home/testProwl', {\n prowl_api: prowl.api,\n // eslint-disable-line camelcase\n prowl_priority: prowl.priority // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testProwl-result').html(data);\n $('#testProwl').prop('disabled', false);\n });\n },\n\n testKODI() {\n const kodi = {};\n const kodiHostInput = $('#kodi_host').find('input');\n const kodiHosts = kodiHostInput.toArray().map(value => value.value).filter(item => item !== '');\n kodi.host = kodiHosts.join(',');\n kodi.username = $.trim($('#kodi_username').val());\n kodi.password = $.trim($('#kodi_password').val());\n\n if (!kodi.host) {\n $('#testKODI-result').html('Please fill out the necessary fields above.');\n $('#kodi_host').find('input').addClass('warning');\n return;\n }\n\n $('#kodi_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testKODI-result').html(MEDUSA.config.loading);\n $.get('home/testKODI', {\n host: kodi.host,\n username: kodi.username,\n password: kodi.password\n }).done(data => {\n $('#testKODI-result').html(data);\n $('#testKODI').prop('disabled', false);\n });\n },\n\n testPHT() {\n const plex = {};\n plex.client = {};\n const plexHostsInput = $('#plex_client_host').find('input');\n const plexHosts = plexHostsInput.toArray().map(value => value.value).filter(item => item !== '');\n plex.client.host = plexHosts.join(',');\n plex.client.username = $.trim($('#plex_client_username').val());\n plex.client.password = $.trim($('#plex_client_password').val());\n\n if (!plex.client.host) {\n $('#testPHT-result').html('Please fill out the necessary fields above.');\n $('#plex_client_host').find('input').addClass('warning');\n return;\n }\n\n $('#plex_client_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPHT-result').html(MEDUSA.config.loading);\n $.get('home/testPHT', {\n host: plex.client.host,\n username: plex.client.username,\n password: plex.client.password\n }).done(data => {\n $('#testPHT-result').html(data);\n $('#testPHT').prop('disabled', false);\n });\n },\n\n testPMS() {\n const plex = {};\n plex.server = {};\n const plexHostsInput = $('#plex_server_host').find('input');\n const plexHosts = plexHostsInput.toArray().map(value => value.value).filter(item => item !== '');\n plex.server.host = plexHosts.join(',');\n plex.server.username = $.trim($('#plex_server_username').val());\n plex.server.password = $.trim($('#plex_server_password').val());\n plex.server.token = $.trim($('#plex_server_token').val());\n\n if (!plex.server.host) {\n $('#testPMS-result').html('Please fill out the necessary fields above.');\n $('#plex_server_host').find('input').addClass('warning');\n return;\n }\n\n $('#plex_server_host').find('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPMS-result').html(MEDUSA.config.loading);\n $.get('home/testPMS', {\n host: plex.server.host,\n username: plex.server.username,\n password: plex.server.password,\n plex_server_token: plex.server.token // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testPMS-result').html(data);\n $('#testPMS').prop('disabled', false);\n });\n },\n\n testEMBY() {\n const emby = {};\n emby.host = $('#emby_host').val();\n emby.apikey = $('#emby_apikey').val();\n\n if (!emby.host || !emby.apikey) {\n $('#testEMBY-result').html('Please fill out the necessary fields above.');\n $('#emby_host').addRemoveWarningClass(emby.host);\n $('#emby_apikey').addRemoveWarningClass(emby.apikey);\n return;\n }\n\n $('#emby_host,#emby_apikey').children('input').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testEMBY-result').html(MEDUSA.config.loading);\n $.get('home/testEMBY', {\n host: emby.host,\n emby_apikey: emby.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testEMBY-result').html(data);\n $('#testEMBY').prop('disabled', false);\n });\n },\n\n testBoxcar2() {\n const boxcar2 = {};\n boxcar2.accesstoken = $.trim($('#boxcar2_accesstoken').val());\n\n if (!boxcar2.accesstoken) {\n $('#testBoxcar2-result').html('Please fill out the necessary fields above.');\n $('#boxcar2_accesstoken').addClass('warning');\n return;\n }\n\n $('#boxcar2_accesstoken').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testBoxcar2-result').html(MEDUSA.config.loading);\n $.get('home/testBoxcar2', {\n accesstoken: boxcar2.accesstoken\n }).done(data => {\n $('#testBoxcar2-result').html(data);\n $('#testBoxcar2').prop('disabled', false);\n });\n },\n\n testPushover() {\n const pushover = {};\n pushover.userkey = $('#pushover_userkey').val();\n pushover.apikey = $('#pushover_apikey').val();\n\n if (!pushover.userkey || !pushover.apikey) {\n $('#testPushover-result').html('Please fill out the necessary fields above.');\n $('#pushover_userkey').addRemoveWarningClass(pushover.userkey);\n $('#pushover_apikey').addRemoveWarningClass(pushover.apikey);\n return;\n }\n\n $('#pushover_userkey,#pushover_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPushover-result').html(MEDUSA.config.loading);\n $.get('home/testPushover', {\n userKey: pushover.userkey,\n apiKey: pushover.apikey\n }).done(data => {\n $('#testPushover-result').html(data);\n $('#testPushover').prop('disabled', false);\n });\n },\n\n testLibnotify() {\n $('#testLibnotify-result').html(MEDUSA.config.loading);\n $.get('home/testLibnotify', data => {\n $('#testLibnotify-result').html(data);\n });\n },\n\n settingsNMJ() {\n const nmj = {};\n nmj.host = $('#nmj_host').val();\n\n if (nmj.host) {\n $('#testNMJ-result').html(MEDUSA.config.loading);\n $.get('home/settingsNMJ', {\n host: nmj.host\n }, data => {\n if (data === null) {\n $('#nmj_database').removeAttr('readonly');\n $('#nmj_mount').removeAttr('readonly');\n }\n\n const JSONData = $.parseJSON(data);\n $('#testNMJ-result').html(JSONData.message);\n $('#nmj_database').val(JSONData.database);\n $('#nmj_mount').val(JSONData.mount);\n\n if (JSONData.database) {\n $('#nmj_database').prop('readonly', true);\n } else {\n $('#nmj_database').removeAttr('readonly');\n }\n\n if (JSONData.mount) {\n $('#nmj_mount').prop('readonly', true);\n } else {\n $('#nmj_mount').removeAttr('readonly');\n }\n });\n } else {\n alert('Please fill in the Popcorn IP address'); // eslint-disable-line no-alert\n\n $('#nmj_host').focus();\n }\n },\n\n testNMJ() {\n const nmj = {};\n nmj.host = $.trim($('#nmj_host').val());\n nmj.database = $('#nmj_database').val();\n nmj.mount = $('#nmj_mount').val();\n\n if (nmj.host) {\n $('#nmj_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testNMJ-result').html(MEDUSA.config.loading);\n $.get('home/testNMJ', {\n host: nmj.host,\n database: nmj.database,\n mount: nmj.mount\n }).done(data => {\n $('#testNMJ-result').html(data);\n $('#testNMJ').prop('disabled', false);\n });\n } else {\n $('#testNMJ-result').html('Please fill out the necessary fields above.');\n $('#nmj_host').addClass('warning');\n }\n },\n\n settingsNMJv2() {\n const nmjv2 = {};\n nmjv2.host = $('#nmjv2_host').val();\n\n if (nmjv2.host) {\n $('#testNMJv2-result').html(MEDUSA.config.loading);\n nmjv2.dbloc = '';\n const radios = document.getElementsByName('nmjv2_dbloc');\n\n for (let i = 0, len = radios.length; i < len; i++) {\n if (radios[i].checked) {\n nmjv2.dbloc = radios[i].value;\n break;\n }\n }\n\n nmjv2.dbinstance = $('#NMJv2db_instance').val();\n $.get('home/settingsNMJv2', {\n host: nmjv2.host,\n dbloc: nmjv2.dbloc,\n instance: nmjv2.dbinstance\n }, data => {\n if (data === null) {\n $('#nmjv2_database').removeAttr('readonly');\n }\n\n const JSONData = $.parseJSON(data);\n $('#testNMJv2-result').html(JSONData.message);\n $('#nmjv2_database').val(JSONData.database);\n\n if (JSONData.database) {\n $('#nmjv2_database').prop('readonly', true);\n } else {\n $('#nmjv2_database').removeAttr('readonly');\n }\n });\n } else {\n alert('Please fill in the Popcorn IP address'); // eslint-disable-line no-alert\n\n $('#nmjv2_host').focus();\n }\n },\n\n testNMJv2() {\n const nmjv2 = {};\n nmjv2.host = $.trim($('#nmjv2_host').val());\n\n if (nmjv2.host) {\n $('#nmjv2_host').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testNMJv2-result').html(MEDUSA.config.loading);\n $.get('home/testNMJv2', {\n host: nmjv2.host\n }).done(data => {\n $('#testNMJv2-result').html(data);\n $('#testNMJv2').prop('disabled', false);\n });\n } else {\n $('#testNMJv2-result').html('Please fill out the necessary fields above.');\n $('#nmjv2_host').addClass('warning');\n }\n },\n\n testFreeMobile() {\n const freemobile = {};\n freemobile.id = $.trim($('#freemobile_id').val());\n freemobile.apikey = $.trim($('#freemobile_apikey').val());\n\n if (!freemobile.id || !freemobile.apikey) {\n $('#testFreeMobile-result').html('Please fill out the necessary fields above.');\n\n if (freemobile.id) {\n $('#freemobile_id').removeClass('warning');\n } else {\n $('#freemobile_id').addClass('warning');\n }\n\n if (freemobile.apikey) {\n $('#freemobile_apikey').removeClass('warning');\n } else {\n $('#freemobile_apikey').addClass('warning');\n }\n\n return;\n }\n\n $('#freemobile_id,#freemobile_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testFreeMobile-result').html(MEDUSA.config.loading);\n $.get('home/testFreeMobile', {\n freemobile_id: freemobile.id,\n // eslint-disable-line camelcase\n freemobile_apikey: freemobile.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testFreeMobile-result').html(data);\n $('#testFreeMobile').prop('disabled', false);\n });\n },\n\n testTelegram() {\n const telegram = {};\n telegram.id = $.trim($('#telegram_id').val());\n telegram.apikey = $.trim($('#telegram_apikey').val());\n\n if (!telegram.id || !telegram.apikey) {\n $('#testTelegram-result').html('Please fill out the necessary fields above.');\n $('#telegram_id').addRemoveWarningClass(telegram.id);\n $('#telegram_apikey').addRemoveWarningClass(telegram.apikey);\n return;\n }\n\n $('#telegram_id,#telegram_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testTelegram-result').html(MEDUSA.config.loading);\n $.get('home/testTelegram', {\n telegram_id: telegram.id,\n // eslint-disable-line camelcase\n telegram_apikey: telegram.apikey // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTelegram-result').html(data);\n $('#testTelegram').prop('disabled', false);\n });\n },\n\n testDiscord() {\n const {\n notifiers\n } = this;\n\n if (!notifiers.discord.webhook) {\n $('#testDiscord-result').html('Please fill out the necessary fields above.');\n $('#discord_webhook').addRemoveWarningClass(notifiers.discord.webhook);\n return;\n }\n\n $('#discord_id,#discord_apikey').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testDiscord-result').html(MEDUSA.config.loading);\n $.get('home/testDiscord', {\n discord_webhook: notifiers.discord.webhook,\n // eslint-disable-line camelcase\n discord_tts: notifiers.discord.tts // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testDiscord-result').html(data);\n $('#testDiscord').prop('disabled', false);\n });\n },\n\n testSlack() {\n const slack = {};\n slack.webhook = $.trim($('#slack_webhook').val());\n\n if (!slack.webhook) {\n $('#testSlack-result').html('Please fill out the necessary fields above.');\n $('#slack_webhook').addRemoveWarningClass(slack.webhook);\n return;\n }\n\n $('#slack_webhook').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testSlack-result').html(MEDUSA.config.loading);\n $.get('home/testslack', {\n slack_webhook: slack.webhook // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testSlack-result').html(data);\n $('#testSlack').prop('disabled', false);\n });\n },\n\n TraktGetPin() {\n window.open($('#trakt_pin_url').val(), 'popUp', 'toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550');\n $('#trakt_pin').prop('disabled', false);\n },\n\n authTrakt() {\n const trakt = {};\n trakt.pin = $('#trakt_pin').val();\n\n if (trakt.pin.length !== 0) {\n $.get('home/getTraktToken', {\n trakt_pin: trakt.pin // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTrakt-result').html(data);\n $('#authTrakt').addClass('hide');\n $('#trakt_pin').prop('disabled', true);\n $('#trakt_pin').val('');\n $('#TraktGetPin').removeClass('hide');\n });\n }\n },\n\n testTrakt() {\n const trakt = {};\n trakt.username = $.trim($('#trakt_username').val());\n trakt.trendingBlacklist = $.trim($('#trakt_blacklist_name').val());\n\n if (!trakt.username) {\n $('#testTrakt-result').html('Please fill out the necessary fields above.');\n $('#trakt_username').addRemoveWarningClass(trakt.username);\n return;\n }\n\n if (/\\s/g.test(trakt.trendingBlacklist)) {\n $('#testTrakt-result').html('Check blacklist name; the value needs to be a trakt slug');\n $('#trakt_blacklist_name').addClass('warning');\n return;\n }\n\n $('#trakt_username').removeClass('warning');\n $('#trakt_blacklist_name').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testTrakt-result').html(MEDUSA.config.loading);\n $.get('home/testTrakt', {\n username: trakt.username,\n blacklist_name: trakt.trendingBlacklist // eslint-disable-line camelcase\n\n }).done(data => {\n $('#testTrakt-result').html(data);\n $('#testTrakt').prop('disabled', false);\n });\n },\n\n traktForceSync() {\n $('#testTrakt-result').html(MEDUSA.config.loading);\n $.getJSON('home/forceTraktSync', data => {\n $('#testTrakt-result').html(data.result);\n });\n },\n\n testEmail() {\n let to = '';\n const status = $('#testEmail-result');\n status.html(MEDUSA.config.loading);\n let host = $('#email_host').val();\n host = host.length > 0 ? host : null;\n let port = $('#email_port').val();\n port = port.length > 0 ? port : null;\n const tls = $('#email_tls').find('input').is(':checked') ? 1 : 0;\n let from = $('#email_from').val();\n from = from.length > 0 ? from : 'root@localhost';\n const user = $('#email_username').val().trim();\n const pwd = $('#email_password').val();\n let err = '';\n\n if (host === null) {\n err += '
  • You must specify an SMTP hostname!
  • ';\n }\n\n if (port === null) {\n err += '
  • You must specify an SMTP port!
  • ';\n } else if (port.match(/^\\d+$/) === null || Number.parseInt(port, 10) > 65535) {\n err += '
  • SMTP port must be between 0 and 65535!
  • ';\n }\n\n if (err.length > 0) {\n err = '
      ' + err + '
    ';\n status.html(err);\n } else {\n to = prompt('Enter an email address to send the test to:', null); // eslint-disable-line no-alert\n\n if (to === null || to.length === 0 || to.match(/.*@.*/) === null) {\n status.html('

    You must provide a recipient email address!

    ');\n } else {\n $.get('home/testEmail', {\n host,\n port,\n smtp_from: from,\n // eslint-disable-line camelcase\n use_tls: tls,\n // eslint-disable-line camelcase\n user,\n pwd,\n to\n }, msg => {\n $('#testEmail-result').html(msg);\n });\n }\n }\n },\n\n testPushalot() {\n const pushalot = {};\n pushalot.authToken = $.trim($('#pushalot_authorizationtoken').val());\n\n if (!pushalot.authToken) {\n $('#testPushalot-result').html('Please fill out the necessary fields above.');\n $('#pushalot_authorizationtoken').addClass('warning');\n return;\n }\n\n $('#pushalot_authorizationtoken').removeClass('warning');\n $(this).prop('disabled', true);\n $('#testPushalot-result').html(MEDUSA.config.loading);\n $.get('home/testPushalot', {\n authorizationToken: pushalot.authToken\n }).done(data => {\n $('#testPushalot-result').html(data);\n $('#testPushalot').prop('disabled', false);\n });\n }\n\n }\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/config-notifications.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -428,7 +428,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _show_list__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./show-list */ \"./src/components/show-list/index.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vanilla-lazyload */ \"./node_modules/vanilla-lazyload/dist/lazyload.min.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-nav-tabs/dist/vue-tabs.js */ \"./node_modules/vue-nav-tabs/dist/vue-tabs.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuedraggable */ \"./node_modules/vuedraggable/dist/vuedraggable.common.js\");\n/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vuedraggable__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'home',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n ShowList: _show_list__WEBPACK_IMPORTED_MODULE_1__[\"ShowList\"],\n VueTabs: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__[\"VueTabs\"],\n VTab: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__[\"VTab\"],\n Draggable: (vuedraggable__WEBPACK_IMPORTED_MODULE_4___default())\n },\n\n data() {\n return {\n layoutOptions: [{\n value: 'poster',\n text: 'Poster'\n }, {\n value: 'small',\n text: 'Small Poster'\n }, {\n value: 'banner',\n text: 'Banner'\n }, {\n value: 'simple',\n text: 'Simple'\n }],\n selectedRootDir: 0\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n // Renamed because of the computed property 'layout'.\n stateLayout: state => state.config.layout,\n stats: state => state.stats\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n showsWithStats: 'showsWithStats'\n }),\n layout: {\n get() {\n const {\n stateLayout\n } = this;\n return stateLayout.home;\n },\n\n set(layout) {\n const {\n setLayout\n } = this;\n const page = 'home';\n setLayout({\n page,\n layout\n });\n }\n\n },\n filterByName: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n showFilterByName\n } = stateLayout;\n return showFilterByName;\n },\n\n set(value) {\n const {\n setShowFilterByName\n } = this;\n setShowFilterByName({\n filter: value\n });\n }\n\n },\n showList: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n show\n } = stateLayout;\n return show.showListOrder;\n },\n\n set(value) {\n const {\n setShowListOrder\n } = this;\n setShowListOrder({\n value\n });\n }\n\n },\n\n showLists() {\n const {\n config,\n filterByName,\n stateLayout,\n showsWithStats\n } = this;\n const {\n rootDirs\n } = config;\n const {\n animeSplitHome,\n selectedRootIndex,\n show\n } = stateLayout;\n\n if (!config.indexers.indexers) {\n return;\n }\n\n let shows = null; // Filter root dirs\n\n shows = showsWithStats.filter(show => selectedRootIndex === -1 || show.config.location.includes(rootDirs.slice(1)[selectedRootIndex])); // Filter by text\n\n shows = shows.filter(show => show.title.toLowerCase().includes(filterByName.toLowerCase()));\n\n if (animeSplitHome) {\n return show.showListOrder.map(listTitle => {\n return {\n listTitle,\n shows: shows.filter(show => show.config.anime === (listTitle === 'Anime'))\n };\n });\n }\n\n return [{\n listTitle: 'Series',\n shows\n }];\n },\n\n imgLazyLoad() {\n console.log('imgLazyLoad object constructud!');\n return new vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2___default.a({\n // Example of options object -> see options section\n threshold: 500\n });\n },\n\n selectedRootIndexOptions() {\n const {\n config\n } = this;\n const {\n rootDirs\n } = config;\n return [...[{\n value: -1,\n text: 'All Folders'\n }], ...rootDirs.slice(1).map((item, idx) => ({\n text: item,\n value: idx\n }))];\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setLayout: 'setLayout',\n setConfig: 'setConfig',\n setShowFilterByName: 'setShowFilterByName',\n setShowListOrder: 'setShowListOrder',\n setStoreLayout: 'setStoreLayout',\n getShows: 'getShows',\n getStats: 'getStats'\n }),\n\n async changePosterSortBy() {\n // Patch new posterSOrtBy value\n const {\n $snotify,\n posterSortby,\n setPosterSortBy\n } = this;\n\n try {\n await setPosterSortBy({\n section: 'layout',\n config: {\n posterSortby\n }\n });\n } catch (error) {\n $snotify.error('Error while trying to change poster sort option', 'Error');\n }\n },\n\n saveSelectedRootDir(value) {\n const {\n setStoreLayout\n } = this;\n setStoreLayout({\n key: 'selectedRootIndex',\n value\n });\n },\n\n updateTabContent(tabIndex, newTab) {\n const {\n setStoreLayout\n } = this;\n setStoreLayout({\n key: 'currentShowTab',\n value: newTab.title\n });\n }\n\n },\n\n mounted() {\n const {\n getStats\n } = this;\n getStats('show');\n }\n\n});\n\n//# sourceURL=webpack:///./src/components/home.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _show_list__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./show-list */ \"./src/components/show-list/index.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vanilla-lazyload */ \"./node_modules/vanilla-lazyload/dist/lazyload.min.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-nav-tabs/dist/vue-tabs.js */ \"./node_modules/vue-nav-tabs/dist/vue-tabs.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuedraggable */ \"./node_modules/vuedraggable/dist/vuedraggable.common.js\");\n/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vuedraggable__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'home',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n ShowList: _show_list__WEBPACK_IMPORTED_MODULE_1__[\"ShowList\"],\n VueTabs: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__[\"VueTabs\"],\n VTab: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_3__[\"VTab\"],\n Draggable: (vuedraggable__WEBPACK_IMPORTED_MODULE_4___default())\n },\n\n data() {\n return {\n layoutOptions: [{\n value: 'poster',\n text: 'Poster'\n }, {\n value: 'small',\n text: 'Small Poster'\n }, {\n value: 'banner',\n text: 'Banner'\n }, {\n value: 'simple',\n text: 'Simple'\n }],\n selectedRootDir: 0\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n // Renamed because of the computed property 'layout'.\n stateLayout: state => state.config.layout,\n stats: state => state.stats\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n showsWithStats: 'showsWithStats'\n }),\n layout: {\n get() {\n const {\n stateLayout\n } = this;\n return stateLayout.home;\n },\n\n set(layout) {\n const {\n setLayout\n } = this;\n const page = 'home';\n setLayout({\n page,\n layout\n });\n }\n\n },\n filterByName: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n showFilterByName\n } = stateLayout;\n return showFilterByName;\n },\n\n set(value) {\n const {\n setShowFilterByName\n } = this;\n setShowFilterByName({\n filter: value\n });\n }\n\n },\n showList: {\n get() {\n const {\n stateLayout\n } = this;\n const {\n show\n } = stateLayout;\n return show.showListOrder;\n },\n\n set(value) {\n const {\n setShowListOrder\n } = this;\n setShowListOrder({\n value\n });\n }\n\n },\n\n showLists() {\n const {\n config,\n filterByName,\n stateLayout,\n showsWithStats\n } = this;\n const {\n rootDirs\n } = config;\n const {\n animeSplitHome,\n selectedRootIndex,\n show\n } = stateLayout;\n\n if (!config.indexers.indexers) {\n return;\n }\n\n let shows = null; // Filter root dirs\n\n shows = showsWithStats.filter(show => selectedRootIndex === -1 || show.config.location.includes(rootDirs.slice(1)[selectedRootIndex])); // Filter by text\n\n shows = shows.filter(show => show.title.toLowerCase().includes(filterByName.toLowerCase()));\n\n if (animeSplitHome) {\n return show.showListOrder.map(listTitle => {\n return {\n listTitle,\n shows: shows.filter(show => show.config.anime === (listTitle === 'Anime'))\n };\n });\n }\n\n return [{\n listTitle: 'Series',\n shows\n }];\n },\n\n imgLazyLoad() {\n console.log('imgLazyLoad object constructud!');\n return new vanilla_lazyload__WEBPACK_IMPORTED_MODULE_2___default.a({\n // Example of options object -> see options section\n threshold: 500\n });\n },\n\n selectedRootIndexOptions() {\n const {\n config\n } = this;\n const {\n rootDirs\n } = config;\n return [...[{\n value: -1,\n text: 'All Folders'\n }], ...rootDirs.slice(1).map((item, idx) => ({\n text: item,\n value: idx\n }))];\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n setLayout: 'setLayout',\n setConfig: 'setConfig',\n setShowFilterByName: 'setShowFilterByName',\n setShowListOrder: 'setShowListOrder',\n setStoreLayout: 'setStoreLayout',\n setCurrentTab: 'setCurrentTab',\n getShows: 'getShows',\n getStats: 'getStats'\n }),\n\n async changePosterSortBy() {\n // Patch new posterSOrtBy value\n const {\n $snotify,\n posterSortby,\n setPosterSortBy\n } = this;\n\n try {\n await setPosterSortBy({\n section: 'layout',\n config: {\n posterSortby\n }\n });\n } catch (error) {\n $snotify.error('Error while trying to change poster sort option', 'Error');\n }\n },\n\n saveSelectedRootDir(value) {\n const {\n setStoreLayout\n } = this;\n setStoreLayout({\n key: 'selectedRootIndex',\n value\n });\n },\n\n updateTabContent(tabIndex, newTab) {\n const {\n setCurrentTab\n } = this;\n setCurrentTab(newTab.title);\n }\n\n },\n\n mounted() {\n const {\n getStats\n } = this;\n getStats('show');\n }\n\n});\n\n//# sourceURL=webpack:///./src/components/home.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -536,7 +536,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n\n /**\n * Vue-good-table sort overwrite function.\n * @param {Object} x - row1 value for column.\n * @param {object} y - row2 value for column.\n * @returns {Boolean} - if we want to display this row before the next\n */\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'status',\n sortable: false\n }, {\n label: 'Provider',\n sortable: false,\n field: 'provider.name'\n }, {\n label: 'Release',\n field: 'resource',\n sortable: false\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n sortable: false,\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return `s${season.toString().padStart(2, '0')}e${episode.toString().padStart(2, '0')}`;\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episodeSlug,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: episodeSlug()\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episodeSlug,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: episodeSlug()\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -608,7 +608,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_2__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_4__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n mounted() {\n const {\n getProviders,\n getProviderResults\n } = this;\n getProviders().then(() => {\n // We need to get the providers, before we know which providers to query.\n getProviderResults();\n });\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode))];\n }\n }\n\n return results;\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_4__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this; // const unwatch = this.$watch('show.id.slug', showSlug => {\n // Use apiv2 to get latest provider cache results\n\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // unwatch();\n // });\n },\n\n refreshResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_4__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n const classes = [];\n return classes;\n }\n\n },\n watch: {\n queueitems: {\n handler(queue) {\n const queueForThisEpisode = queue.filter(q => q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n mounted() {\n const {\n getProviders,\n getProviderResults\n } = this;\n getProviders().then(() => {\n // We need to get the providers, before we know which providers to query.\n getProviderResults();\n });\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -711,7 +711,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.vgt-global-search__input.vgt-pull-left[data-v-6dfe8938] {\\n float: left;\\n height: 40px;\\n}\\n.vgt-input[data-v-6dfe8938] {\\n border: 1px solid #ccc;\\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\\n height: 30px;\\n padding: 5px 10px;\\n font-size: 12px;\\n line-height: 1.5;\\n border-radius: 3px;\\n}\\ndiv.vgt-responsive > table tbody > tr > th.vgt-row-header > span[data-v-6dfe8938] {\\n font-size: 24px;\\n margin-top: 20px;\\n margin-bottom: 10px;\\n}\\n.fanartBackground.displayShow[data-v-6dfe8938] {\\n clear: both;\\n opacity: 0.9;\\n}\\n.defaultTable.displayShow[data-v-6dfe8938] {\\n clear: both;\\n}\\n.displayShowTable.displayShow[data-v-6dfe8938] {\\n clear: both;\\n}\\n.fanartBackground table[data-v-6dfe8938] {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.summaryFanArt[data-v-6dfe8938] {\\n opacity: 0.9;\\n}\\n.fanartBackground > table th.vgt-row-header[data-v-6dfe8938] {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.fanartBackground td.col-search[data-v-6dfe8938] {\\n text-align: center;\\n}\\n\\n/* Trying to migrate this from tablesorter */\\n\\n/* =======================================================================\\ntablesorter.css\\n========================================================================== */\\n.displayShow[data-v-6dfe8938] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n color: rgb(0, 0, 0);\\n text-align: left;\\n border-spacing: 0;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th,\\n.displayShow[data-v-6dfe8938] .vgt-table td {\\n padding: 4px;\\n border-top: rgb(34, 34, 34) 1px solid;\\n border-left: rgb(34, 34, 34) 1px solid;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.displayShow[data-v-6dfe8938] .vgt-table th:first-child,\\n.displayShow[data-v-6dfe8938] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th {\\n /* color: rgb(255, 255, 255); */\\n text-align: center;\\n text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);\\n background-color: rgb(51, 51, 51);\\n border-collapse: collapse;\\n font-weight: normal;\\n white-space: nowrap;\\n color: rgb(255, 255, 255);\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting.sorting-desc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting.sorting-asc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th {\\n background-image: none;\\n padding: 4px;\\n cursor: default;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tr.tablesorter-filter-row,\\n.displayShow[data-v-6dfe8938] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.displayShow[data-v-6dfe8938] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-6dfe8938] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tfoot tr {\\n color: rgb(255, 255, 255);\\n text-align: center;\\n text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);\\n background-color: rgb(51, 51, 51);\\n border-collapse: collapse;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tfoot a {\\n color: rgb(255, 255, 255);\\n text-decoration: none;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.displayShow[data-v-6dfe8938] .unaired {\\n background-color: rgb(245, 241, 228);\\n}\\n.displayShow[data-v-6dfe8938] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.displayShow[data-v-6dfe8938] .preferred {\\n background-color: rgb(195, 227, 200);\\n}\\n.displayShow[data-v-6dfe8938] .archived {\\n background-color: rgb(195, 227, 200);\\n}\\n.displayShow[data-v-6dfe8938] .allowed {\\n background-color: rgb(255, 218, 138);\\n}\\n.displayShow[data-v-6dfe8938] .wanted {\\n background-color: rgb(255, 176, 176);\\n}\\n.displayShow[data-v-6dfe8938] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.displayShow[data-v-6dfe8938] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.displayShow[data-v-6dfe8938] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.displayShow[data-v-6dfe8938] span.unaired {\\n color: rgb(88, 75, 32);\\n}\\n.displayShow[data-v-6dfe8938] span.skipped {\\n color: rgb(29, 80, 104);\\n}\\n.displayShow[data-v-6dfe8938] span.preffered {\\n color: rgb(41, 87, 48);\\n}\\n.displayShow[data-v-6dfe8938] span.allowed {\\n color: rgb(118, 81, 0);\\n}\\n.displayShow[data-v-6dfe8938] span.wanted {\\n color: rgb(137, 0, 0);\\n}\\n.displayShow[data-v-6dfe8938] span.snatched {\\n color: rgb(101, 33, 100);\\n}\\n.displayShow[data-v-6dfe8938] span.unaired b,\\n.displayShow[data-v-6dfe8938] span.skipped b,\\n.displayShow[data-v-6dfe8938] span.preferred b,\\n.displayShow[data-v-6dfe8938] span.allowed b,\\n.displayShow[data-v-6dfe8938] span.wanted b,\\n.displayShow[data-v-6dfe8938] span.snatched b {\\n color: rgb(0, 0, 0);\\n font-weight: 800;\\n}\\ntd.col-footer[data-v-6dfe8938] {\\n text-align: left !important;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer {\\n color: rgb(255, 255, 255);\\n padding: 1em;\\n background-color: rgb(51, 51, 51);\\n margin-bottom: 1em;\\n display: flex;\\n justify-content: space-between;\\n}\\n.displayShow[data-v-6dfe8938] .footer__row-count,\\n.displayShow[data-v-6dfe8938] .footer__navigation__page-info {\\n display: inline;\\n}\\n.displayShow[data-v-6dfe8938] .footer__row-count__label {\\n margin-right: 1em;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation {\\n font-size: 14px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-pull-right {\\n float: right !important;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__page-btn .chevron {\\n width: 24px;\\n height: 24px;\\n border-radius: 15%;\\n position: relative;\\n margin: 0 8px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__info,\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__page-info {\\n display: inline-flex;\\n color: #909399;\\n margin: 0 16px;\\n margin-top: 0;\\n margin-right: 16px;\\n margin-bottom: 0;\\n margin-left: 16px;\\n}\\n.select-info span[data-v-6dfe8938] {\\n margin-left: 5px;\\n line-height: 40px;\\n}\\n\\n/** Style the modal. This should be saved somewhere, where we create one modal template with slots, and style that. */\\n.modal-container[data-v-6dfe8938] {\\n border: 1px solid rgb(17, 17, 17);\\n box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.175);\\n border-radius: 0;\\n}\\n.modal-header[data-v-6dfe8938] {\\n padding: 9px 15px;\\n border-bottom: none;\\n border-radius: 0;\\n background-color: rgb(55, 55, 55);\\n}\\n.modal-content[data-v-6dfe8938] {\\n background: rgb(34, 34, 34);\\n border-radius: 0;\\n border: 1px solid rgba(0, 0, 0, 0.2);\\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\\n color: white;\\n}\\n.modal-body[data-v-6dfe8938] {\\n background: rgb(34, 34, 34);\\n overflow-y: auto;\\n}\\n.modal-footer[data-v-6dfe8938] {\\n border-top: none;\\n text-align: center;\\n}\\n.subtitles > div[data-v-6dfe8938] {\\n float: left;\\n}\\n.subtitles > div[data-v-6dfe8938]:not(:last-child) {\\n margin-right: 2px;\\n}\\n.align-center[data-v-6dfe8938] {\\n display: flex;\\n justify-content: center;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.vgt-global-search__input.vgt-pull-left[data-v-6dfe8938] {\\n float: left;\\n height: 40px;\\n}\\n.vgt-input[data-v-6dfe8938] {\\n border: 1px solid #ccc;\\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\\n height: 30px;\\n padding: 5px 10px;\\n font-size: 12px;\\n line-height: 1.5;\\n border-radius: 3px;\\n}\\ndiv.vgt-responsive > table tbody > tr > th.vgt-row-header > span[data-v-6dfe8938] {\\n font-size: 24px;\\n margin-top: 20px;\\n margin-bottom: 10px;\\n}\\n.defaultTable.displayShow[data-v-6dfe8938] {\\n clear: both;\\n}\\n.displayShowTable.displayShow[data-v-6dfe8938] {\\n clear: both;\\n}\\n.fanartBackground.displayShow[data-v-6dfe8938] {\\n clear: both;\\n opacity: 0.9;\\n}\\n.fanartBackground table[data-v-6dfe8938] {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.summaryFanArt[data-v-6dfe8938] {\\n opacity: 0.9;\\n}\\n.fanartBackground > table th.vgt-row-header[data-v-6dfe8938] {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.fanartBackground td.col-search[data-v-6dfe8938] {\\n text-align: center;\\n}\\n\\n/* Trying to migrate this from tablesorter */\\n\\n/* =======================================================================\\ntablesorter.css\\n========================================================================== */\\n.displayShow[data-v-6dfe8938] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n color: rgb(0, 0, 0);\\n text-align: left;\\n border-spacing: 0;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th,\\n.displayShow[data-v-6dfe8938] .vgt-table td {\\n padding: 4px;\\n border-top: rgb(34, 34, 34) 1px solid;\\n border-left: rgb(34, 34, 34) 1px solid;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.displayShow[data-v-6dfe8938] .vgt-table th:first-child,\\n.displayShow[data-v-6dfe8938] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th {\\n /* color: rgb(255, 255, 255); */\\n text-align: center;\\n text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);\\n background-color: rgb(51, 51, 51);\\n border-collapse: collapse;\\n font-weight: normal;\\n white-space: nowrap;\\n color: rgb(255, 255, 255);\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting.sorting-desc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting.sorting-asc {\\n background-color: rgb(85, 85, 85);\\n background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table thead th {\\n background-image: none;\\n padding: 4px;\\n cursor: default;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tr.tablesorter-filter-row,\\n.displayShow[data-v-6dfe8938] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.displayShow[data-v-6dfe8938] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-6dfe8938] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tfoot tr {\\n color: rgb(255, 255, 255);\\n text-align: center;\\n text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);\\n background-color: rgb(51, 51, 51);\\n border-collapse: collapse;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tfoot a {\\n color: rgb(255, 255, 255);\\n text-decoration: none;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.displayShow[data-v-6dfe8938] .unaired {\\n background-color: rgb(245, 241, 228);\\n}\\n.displayShow[data-v-6dfe8938] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.displayShow[data-v-6dfe8938] .preferred {\\n background-color: rgb(195, 227, 200);\\n}\\n.displayShow[data-v-6dfe8938] .archived {\\n background-color: rgb(195, 227, 200);\\n}\\n.displayShow[data-v-6dfe8938] .allowed {\\n background-color: rgb(255, 218, 138);\\n}\\n.displayShow[data-v-6dfe8938] .wanted {\\n background-color: rgb(255, 176, 176);\\n}\\n.displayShow[data-v-6dfe8938] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.displayShow[data-v-6dfe8938] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.displayShow[data-v-6dfe8938] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.displayShow[data-v-6dfe8938] span.unaired {\\n color: rgb(88, 75, 32);\\n}\\n.displayShow[data-v-6dfe8938] span.skipped {\\n color: rgb(29, 80, 104);\\n}\\n.displayShow[data-v-6dfe8938] span.preffered {\\n color: rgb(41, 87, 48);\\n}\\n.displayShow[data-v-6dfe8938] span.allowed {\\n color: rgb(118, 81, 0);\\n}\\n.displayShow[data-v-6dfe8938] span.wanted {\\n color: rgb(137, 0, 0);\\n}\\n.displayShow[data-v-6dfe8938] span.snatched {\\n color: rgb(101, 33, 100);\\n}\\n.displayShow[data-v-6dfe8938] span.unaired b,\\n.displayShow[data-v-6dfe8938] span.skipped b,\\n.displayShow[data-v-6dfe8938] span.preferred b,\\n.displayShow[data-v-6dfe8938] span.allowed b,\\n.displayShow[data-v-6dfe8938] span.wanted b,\\n.displayShow[data-v-6dfe8938] span.snatched b {\\n color: rgb(0, 0, 0);\\n font-weight: 800;\\n}\\ntd.col-footer[data-v-6dfe8938] {\\n text-align: left !important;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer {\\n color: rgb(255, 255, 255);\\n padding: 1em;\\n background-color: rgb(51, 51, 51);\\n margin-bottom: 1em;\\n display: flex;\\n justify-content: space-between;\\n}\\n.displayShow[data-v-6dfe8938] .footer__row-count,\\n.displayShow[data-v-6dfe8938] .footer__navigation__page-info {\\n display: inline;\\n}\\n.displayShow[data-v-6dfe8938] .footer__row-count__label {\\n margin-right: 1em;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation {\\n font-size: 14px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-pull-right {\\n float: right !important;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__page-btn .chevron {\\n width: 24px;\\n height: 24px;\\n border-radius: 15%;\\n position: relative;\\n margin: 0 8px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__info,\\n.displayShow[data-v-6dfe8938] .vgt-wrap__footer .footer__navigation__page-info {\\n display: inline-flex;\\n color: #909399;\\n margin: 0 16px;\\n margin-top: 0;\\n margin-right: 16px;\\n margin-bottom: 0;\\n margin-left: 16px;\\n}\\n.select-info span[data-v-6dfe8938] {\\n margin-left: 5px;\\n line-height: 40px;\\n}\\n\\n/** Style the modal. This should be saved somewhere, where we create one modal template with slots, and style that. */\\n.modal-container[data-v-6dfe8938] {\\n border: 1px solid rgb(17, 17, 17);\\n box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.175);\\n border-radius: 0;\\n}\\n.modal-header[data-v-6dfe8938] {\\n padding: 9px 15px;\\n border-bottom: none;\\n border-radius: 0;\\n background-color: rgb(55, 55, 55);\\n}\\n.modal-content[data-v-6dfe8938] {\\n background: rgb(34, 34, 34);\\n border-radius: 0;\\n border: 1px solid rgba(0, 0, 0, 0.2);\\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\\n color: white;\\n}\\n.modal-body[data-v-6dfe8938] {\\n background: rgb(34, 34, 34);\\n overflow-y: auto;\\n}\\n.modal-footer[data-v-6dfe8938] {\\n border-top: none;\\n text-align: center;\\n}\\n.subtitles > div[data-v-6dfe8938] {\\n float: left;\\n}\\n.subtitles > div[data-v-6dfe8938]:not(:last-child) {\\n margin-right: 2px;\\n}\\n.align-center[data-v-6dfe8938] {\\n display: flex;\\n justify-content: center;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.displayShow[data-v-6dfe8938] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -975,7 +975,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\nspan.global-ignored[data-v-0ad4c7fc] {\\n color: red;\\n}\\nspan.show-ignored[data-v-0ad4c7fc] {\\n color: red;\\n font-style: italic;\\n}\\nspan.global-required[data-v-0ad4c7fc] {\\n color: green;\\n}\\nspan.show-required[data-v-0ad4c7fc] {\\n color: green;\\n font-style: italic;\\n}\\nspan.global-undesired[data-v-0ad4c7fc] {\\n color: orange;\\n}\\n\\n/** Use this as table styling for all table layouts */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th:first-child,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-0ad4c7fc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\nshow-history[data-v-0ad4c7fc] {\\n margin-bottom: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\nspan.global-ignored[data-v-0ad4c7fc] {\\n color: red;\\n}\\nspan.show-ignored[data-v-0ad4c7fc] {\\n color: red;\\n font-style: italic;\\n}\\nspan.global-required[data-v-0ad4c7fc] {\\n color: green;\\n}\\nspan.show-required[data-v-0ad4c7fc] {\\n color: green;\\n font-style: italic;\\n}\\nspan.global-undesired[data-v-0ad4c7fc] {\\n color: orange;\\n}\\n\\n/** Use this as table styling for all table layouts */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th:first-child,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-0ad4c7fc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground {\\n clear: both;\\n opacity: 0.9;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground table {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground > table th.vgt-row-header {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground td.col-search {\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\nshow-history[data-v-0ad4c7fc] {\\n margin-bottom: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1093,7 +1093,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { attrs: { id: \"config-notifications\" } },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"config\" } }, [\n _c(\"div\", { attrs: { id: \"config-content\" } }, [\n _c(\n \"form\",\n {\n attrs: { id: \"configForm\", method: \"post\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.save()\n }\n }\n },\n [\n _c(\"div\", { attrs: { id: \"config-components\" } }, [\n _c(\"ul\", [\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#home-theater-nas\" } }, [\n _vm._v(\"Home Theater / NAS\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#devices\" } }, [\n _vm._v(\"Devices\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#social\" } }, [\n _vm._v(\"Social\")\n ])\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"home-theater-nas\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-kodi\",\n attrs: { title: \"KODI\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://kodi.tv\" } },\n [_vm._v(\"KODI\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A free and open source cross-platform media center and home entertainment system software with a 10-foot user interface designed for the living-room TV.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_kodi\",\n explanations: [\"Send KODI commands?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.kodi, \"enabled\", $$v)\n },\n expression: \"notifiers.kodi.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.kodi.enabled,\n expression: \"notifiers.kodi.enabled\"\n }\n ],\n attrs: { id: \"content-use-kodi\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Always on\",\n id: \"kodi_always_on\",\n explanations: [\"log errors when unreachable?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.alwaysOn,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"alwaysOn\",\n $$v\n )\n },\n expression: \"notifiers.kodi.alwaysOn\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"kodi_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.kodi.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"kodi_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.kodi.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"kodi_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.kodi.notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.kodi.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Update library\",\n id: \"kodi_update_library\",\n explanations: [\n \"update KODI library when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.update.library,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi.update,\n \"library\",\n $$v\n )\n },\n expression: \"notifiers.kodi.update.library\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Full library update\",\n id: \"kodi_update_full\",\n explanations: [\n \"perform a full library update if update per-show fails?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.update.full,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi.update,\n \"full\",\n $$v\n )\n },\n expression: \"notifiers.kodi.update.full\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Clean library\",\n id: \"kodi_clean_library\",\n explanations: [\n \"clean KODI library when replaces a already downloaded episode?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.cleanLibrary,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"cleanLibrary\",\n $$v\n )\n },\n expression: \"notifiers.kodi.cleanLibrary\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Only update first host\",\n id: \"kodi_update_onlyfirst\",\n explanations: [\n \"only send library updates/clean to the first active host?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.update.onlyFirst,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi.update,\n \"onlyFirst\",\n $$v\n )\n },\n expression: \"notifiers.kodi.update.onlyFirst\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"col-sm-10 content\" },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"kodi_host\",\n id: \"kodi_host\",\n \"list-items\": _vm.notifiers.kodi.host\n },\n on: {\n change: function($event) {\n _vm.notifiers.kodi.host = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"host running KODI (eg. 192.168.1.100:8080)\"\n )\n ])\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"kodi_username\",\n explanations: [\n \"username for your KODI server (blank for none)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.kodi.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"kodi_password\",\n explanations: [\n \"password for your KODI server (blank for none)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.kodi.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testKODI-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test KODI\",\n id: \"testKODI\"\n },\n on: { click: _vm.testKODI }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-plex\",\n attrs: { title: \"Plex Media Server\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://plex.tv\" } },\n [_vm._v(\"Plex Media Server\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Experience your media on a visually stunning, easy to use interface on your Mac connected to your TV. Your media library has never looked this good!\"\n )\n ]),\n _vm._v(\" \"),\n _vm.notifiers.plex.server.enabled\n ? _c(\"p\", { staticClass: \"plexinfo\" }, [\n _vm._v(\n \"For sending notifications to Plex Home Theater (PHT) clients, use the KODI notifier with port \"\n ),\n _c(\"b\", [_vm._v(\"3005\")]),\n _vm._v(\".\")\n ])\n : _vm._e()\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_plex_server\",\n explanations: [\"Send Plex server notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.plex.server.enabled,\n expression: \"notifiers.plex.server.enabled\"\n }\n ],\n attrs: { id: \"content-use-plex-server\" }\n },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Plex Media Server Auth Token\",\n id: \"plex_server_token\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.token,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"token\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.token\"\n }\n },\n [\n _c(\"p\", [_vm._v(\"Auth Token used by plex\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\n \"span\",\n [\n _vm._v(\"See: \"),\n _c(\n \"app-link\",\n {\n staticClass: \"wiki\",\n attrs: {\n href:\n \"https://support.plex.tv/hc/en-us/articles/204059436-Finding-your-account-token-X-Plex-Token\"\n }\n },\n [\n _c(\"strong\", [\n _vm._v(\n \"Finding your account token\"\n )\n ])\n ]\n )\n ],\n 1\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"plex_server_username\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"plex_server_password\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Update Library\",\n id: \"plex_update_library\",\n explanations: [\"log errors when unreachable?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.server.updateLibrary,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"updateLibrary\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.server.updateLibrary\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"plex_server_host\",\n label: \"Plex Media Server IP:Port\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"plex_server_host\",\n id: \"plex_server_host\",\n \"list-items\":\n _vm.notifiers.plex.server.host\n },\n on: {\n change: function($event) {\n _vm.notifiers.plex.server.host = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"one or more hosts running Plex Media Server\"\n ),\n _c(\"br\"),\n _vm._v(\n \"(eg. 192.168.1.1:32400, 192.168.1.2:32400)\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"HTTPS\",\n id: \"plex_server_https\",\n explanations: [\n \"use https for plex media server requests?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.https,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"https\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.https\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"field-pair\" }, [\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPMS-result\" }\n },\n [\n _vm._v(\n \"Click below to test Plex Media Server(s)\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Plex Media Server\",\n id: \"testPMS\"\n },\n on: { click: _vm.testPMS }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: {\n type: \"submit\",\n value: \"Save Changes\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"clear-left\" }, [\n _vm._v(\" \")\n ])\n ])\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-plexth\",\n attrs: { title: \"Plex Media Client\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://plex.tv\" } },\n [_vm._v(\"Plex Home Theater\")]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_plex_client\",\n explanations: [\n \"Send Plex Home Theater notifications?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.client.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.plex.client.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.plex.client.enabled,\n expression: \"notifiers.plex.client.enabled\"\n }\n ],\n attrs: { id: \"content-use-plex-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"plex_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.client.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.client.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"plex_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.client.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.client.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"plex_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.client\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.client.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"plex_client_host\",\n label: \"Plex Home Theater IP:Port\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"plex_client_host\",\n id: \"plex_client_host\",\n \"list-items\":\n _vm.notifiers.plex.client.host\n },\n on: {\n change: function($event) {\n _vm.notifiers.plex.client.host = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"one or more hosts running Plex Home Theater\"\n ),\n _c(\"br\"),\n _vm._v(\n \"(eg. 192.168.1.100:3000, 192.168.1.101:3000)\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"plex_client_username\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.client.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.plex.client.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"plex_client_password\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.client.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.plex.client.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"field-pair\" }, [\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPHT-result\" }\n },\n [\n _vm._v(\n \"Click below to test Plex Home Theater(s)\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Plex Home Theater\",\n id: \"testPHT\"\n },\n on: { click: _vm.testPHT }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: {\n type: \"submit\",\n value: \"Save Changes\"\n }\n }),\n _vm._v(\" \"),\n _vm._m(1)\n ])\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-emby\",\n attrs: { title: \"Emby\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://emby.media\" } },\n [_vm._v(\"Emby\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A home media server built using other popular open source technologies.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_emby\",\n explanations: [\"Send update commands to Emby?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.emby.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.emby, \"enabled\", $$v)\n },\n expression: \"notifiers.emby.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.emby.enabled,\n expression: \"notifiers.emby.enabled\"\n }\n ],\n attrs: { id: \"content_use_emby\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Emby IP:Port\",\n id: \"emby_host\",\n explanations: [\n \"host running Emby (eg. 192.168.1.100:8096)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.emby.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.emby, \"host\", $$v)\n },\n expression: \"notifiers.emby.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: { label: \"Api Key\", id: \"emby_apikey\" },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.emby.apiKey,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.emby, \"apiKey\", $$v)\n },\n expression: \"notifiers.emby.apiKey\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testEMBY-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Emby\",\n id: \"testEMBY\"\n },\n on: { click: _vm.testEMBY }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-nmj\",\n attrs: { title: \"Networked Media Jukebox\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: { href: \"http://www.popcornhour.com/\" }\n },\n [_vm._v(\"NMJ\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"The Networked Media Jukebox, or NMJ, is the official media jukebox interface made available for the Popcorn Hour 200-series.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_nmj\",\n explanations: [\"Send update commands to NMJ?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"enabled\", $$v)\n },\n expression: \"notifiers.nmj.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.nmj.enabled,\n expression: \"notifiers.nmj.enabled\"\n }\n ],\n attrs: { id: \"content-use-nmj\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Popcorn IP address\",\n id: \"nmj_host\",\n explanations: [\n \"IP address of Popcorn 200-series (eg. 192.168.1.100)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"host\", $$v)\n },\n expression: \"notifiers.nmj.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"settingsNMJ\",\n label: \"Get settings\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Get Settings\",\n id: \"settingsNMJ\"\n },\n on: { click: _vm.settingsNMJ }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"the Popcorn Hour device must be powered on and NMJ running.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"NMJ database\",\n id: \"nmj_database\",\n explanations: [\n \"automatically filled via the 'Get Settings' button.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.database,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"database\", $$v)\n },\n expression: \"notifiers.nmj.database\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"NMJ mount\",\n id: \"nmj_mount\",\n explanations: [\n \"automatically filled via the 'Get Settings' button.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.mount,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"mount\", $$v)\n },\n expression: \"notifiers.nmj.mount\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testNMJ-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test NMJ\",\n id: \"testNMJ\"\n },\n on: { click: _vm.testNMJ }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-nmj\",\n attrs: { title: \"Networked Media Jukebox v2\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: { href: \"http://www.popcornhour.com/\" }\n },\n [_vm._v(\"NMJv2\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"The Networked Media Jukebox, or NMJv2, is the official media jukebox interface made available for the Popcorn Hour 300 & 400-series.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_nmjv2\",\n explanations: [\n \"Send popcorn hour (nmjv2) notifications?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmjv2.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmjv2, \"enabled\", $$v)\n },\n expression: \"notifiers.nmjv2.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.nmjv2.enabled,\n expression: \"notifiers.nmjv2.enabled\"\n }\n ],\n attrs: { id: \"content-use-nmjv2\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Popcorn IP address\",\n id: \"nmjv2_host\",\n explanations: [\n \"IP address of Popcorn 300/400-series (eg. 192.168.1.100)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmjv2.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmjv2, \"host\", $$v)\n },\n expression: \"notifiers.nmjv2.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"nmjv2_database_location\",\n label: \"Database location\"\n }\n },\n [\n _c(\n \"label\",\n {\n staticClass: \"space-right\",\n attrs: { for: \"NMJV2_DBLOC_A\" }\n },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.nmjv2.dbloc,\n expression: \"notifiers.nmjv2.dbloc\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"nmjv2_dbloc\",\n VALUE: \"local\",\n id: \"NMJV2_DBLOC_A\"\n },\n domProps: {\n checked: _vm._q(\n _vm.notifiers.nmjv2.dbloc,\n null\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.notifiers.nmjv2,\n \"dbloc\",\n null\n )\n }\n }\n }),\n _vm._v(\n \"\\n PCH Local Media\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"label\",\n { attrs: { for: \"NMJV2_DBLOC_B\" } },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.nmjv2.dbloc,\n expression: \"notifiers.nmjv2.dbloc\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"nmjv2_dbloc\",\n VALUE: \"network\",\n id: \"NMJV2_DBLOC_B\"\n },\n domProps: {\n checked: _vm._q(\n _vm.notifiers.nmjv2.dbloc,\n null\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.notifiers.nmjv2,\n \"dbloc\",\n null\n )\n }\n }\n }),\n _vm._v(\n \"\\n PCH Network Media\\n \"\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"nmjv2_database_instance\",\n label: \"Database instance\"\n }\n },\n [\n _c(\n \"select\",\n {\n staticClass: \"form-control input-sm\",\n attrs: { id: \"NMJv2db_instance\" }\n },\n [\n _c(\"option\", { attrs: { value: \"0\" } }, [\n _vm._v(\"#1 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"1\" } }, [\n _vm._v(\"#2 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"2\" } }, [\n _vm._v(\"#3 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"3\" } }, [\n _vm._v(\"#4 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"4\" } }, [\n _vm._v(\"#5 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"5\" } }, [\n _vm._v(\"#6 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"6\" } }, [\n _vm._v(\"#7 \")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"adjust this value if the wrong database is selected.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"get_nmjv2_find_database\",\n label: \"Find database\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Find Database\",\n id: \"settingsNMJv2\"\n },\n on: { click: _vm.settingsNMJv2 }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"the Popcorn Hour device must be powered on.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"NMJv2 database\",\n id: \"nmjv2_database\",\n explanations: [\n \"automatically filled via the 'Find Database' buttons.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmjv2.database,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.nmjv2,\n \"database\",\n $$v\n )\n },\n expression: \"notifiers.nmjv2.database\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testNMJv2-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test NMJv2\",\n id: \"testNMJv2\"\n },\n on: { click: _vm.testNMJv2 }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-syno1\",\n attrs: { title: \"Synology\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://synology.com/\" } },\n [_vm._v(\"Synology\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"The Synology DiskStation NAS.\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Synology Indexer is the daemon running on the Synology NAS to build its media database.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"HTTPS\",\n id: \"use_synoindex\",\n explanations: [\n \"Note: requires Medusa to be running on your Synology NAS.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.synologyIndex.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synologyIndex,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.synologyIndex.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.synologyIndex.enabled,\n expression: \"notifiers.synologyIndex.enabled\"\n }\n ],\n attrs: { id: \"content_use_synoindex\" }\n },\n [\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ]\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-syno2\",\n attrs: { title: \"Synology Indexer\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://synology.com/\" } },\n [_vm._v(\"Synology Notifier\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Synology Notifier is the notification system of Synology DSM\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_synologynotifier\",\n explanations: [\n \"Send notifications to the Synology Notifier?\",\n \"Note: requires Medusa to be running on your Synology DSM.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.synology.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.synology, \"enabled\", $$v)\n },\n expression: \"notifiers.synology.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.synology.enabled,\n expression: \"notifiers.synology.enabled\"\n }\n ],\n attrs: { id: \"content-use-synology-notifier\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.synology.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synology,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.synology.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"synology_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.synology.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synology,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.synology.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"synology_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.synology\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synology,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.synology.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pytivo\",\n attrs: { title: \"pyTivo\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://pytivo.sourceforge.net/wiki/index.php/PyTivo\"\n }\n },\n [_vm._v(\"pyTivo\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"pyTivo is both an HMO and GoBack server. This notifier will load the completed downloads to your Tivo.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pytivo\",\n explanations: [\"Send notifications to pyTivo?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pyTivo, \"enabled\", $$v)\n },\n expression: \"notifiers.pyTivo.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pyTivo.enabled,\n expression: \"notifiers.pyTivo.enabled\"\n }\n ],\n attrs: { id: \"content-use-pytivo\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"pyTivo IP:Port\",\n id: \"pytivo_host\",\n explanations: [\n \"host running pyTivo (eg. 192.168.1.1:9032)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pyTivo, \"host\", $$v)\n },\n expression: \"notifiers.pyTivo.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"pyTivo share name\",\n id: \"pytivo_name\",\n explanations: [\n \"(Messages & Settings > Account & System Information > System Information > DVR name)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.shareName,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pyTivo,\n \"shareName\",\n $$v\n )\n },\n expression: \"notifiers.pyTivo.shareName\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Tivo name\",\n id: \"pytivo_tivo_name\",\n explanations: [\n \"value used in pyTivo Web Configuration to name the share.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.name,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pyTivo, \"name\", $$v)\n },\n expression: \"notifiers.pyTivo.name\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"devices\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-growl\",\n attrs: { title: \"Growl\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://growl.info/\" } },\n [_vm._v(\"Growl\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A cross-platform unobtrusive global notification system.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_growl_client\",\n explanations: [\"Send Growl notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.growl, \"enabled\", $$v)\n },\n expression: \"notifiers.growl.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.growl.enabled,\n expression: \"notifiers.growl.enabled\"\n }\n ],\n attrs: { id: \"content-use-growl-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"growl_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.growl.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"growl_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.growl.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"growl_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.growl\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.growl.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Growl IP:Port\",\n id: \"growl_host\",\n explanations: [\n \"host running Growl (eg. 192.168.1.100:23053)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.growl, \"host\", $$v)\n },\n expression: \"notifiers.growl.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"growl_password\",\n explanations: [\n \"may leave blank if Medusa is on the same host.\",\n \"otherwise Growl requires a password to be used.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.growl.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testGrowl-result\" }\n },\n [\n _vm._v(\n \"Click below to register and test Growl, this is required for Growl notifications to work.\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Register Growl\",\n id: \"testGrowl\"\n },\n on: { click: _vm.testGrowl }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-prowl\",\n attrs: { title: \"Prowl\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://www.prowlapp.com/\" } },\n [_vm._v(\"Prowl\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"A Growl client for iOS.\")])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_prowl\",\n explanations: [\"Send Prowl notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.prowl, \"enabled\", $$v)\n },\n expression: \"notifiers.prowl.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.prowl.enabled,\n expression: \"notifiers.prowl.enabled\"\n }\n ],\n attrs: { id: \"content-use-prowl\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"prowl_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.prowl.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"prowl_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.prowl.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"prowl_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.prowl\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.prowl.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Prowl Message Title\",\n id: \"prowl_message_title\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.messageTitle,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"messageTitle\",\n $$v\n )\n },\n expression: \"notifiers.prowl.messageTitle\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"prowl_api\",\n label: \"Api\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"prowl_api\",\n id: \"prowl_api\",\n \"csv-enabled\": \"\",\n \"list-items\": _vm.notifiers.prowl.api\n },\n on: { change: _vm.onChangeProwlApi }\n }),\n _vm._v(\" \"),\n _c(\n \"span\",\n [\n _vm._v(\n \"Prowl API(s) listed here, will receive notifications for \"\n ),\n _c(\"b\", [_vm._v(\"all\")]),\n _vm._v(\n \" shows.\\n Your Prowl API key is available at:\\n \"\n ),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.prowlapp.com/api_settings.php\"\n }\n },\n [\n _vm._v(\n \"\\n https://www.prowlapp.com/api_settings.php\"\n )\n ]\n ),\n _c(\"br\"),\n _vm._v(\n \"\\n (This field may be blank except when testing.)\\n \"\n )\n ],\n 1\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"prowl_show_notification_list\",\n label: \"Show notification list\"\n }\n },\n [\n _c(\"show-selector\", {\n attrs: {\n \"select-class\":\n \"form-control input-sm max-input350\",\n placeholder: \"-- Select a Show --\"\n },\n on: {\n change: function($event) {\n return _vm.prowlUpdateApiKeys($event)\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"offset-sm-2 col-sm-offset-2 col-sm-10 content\"\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"prowl-show-list\",\n id: \"prowl-show-list\",\n \"list-items\":\n _vm.prowlSelectedShowApiKeys\n },\n on: {\n change: function($event) {\n return _vm.savePerShowNotifyList(\n \"prowl\",\n $event\n )\n }\n }\n }),\n _vm._v(\n \"\\n Configure per-show notifications here by entering Prowl API key(s), after selecting a show in the drop-down box.\\n Be sure to activate the 'Save for this show' button below after each entry.\\n \"\n ),\n _c(\"span\", [\n _vm._v(\n \"The values are automatically saved when adding the api key.\"\n )\n ])\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"prowl_priority\",\n label: \"Prowl priority\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.prowl.priority,\n expression: \"notifiers.prowl.priority\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"prowl_priority\",\n name: \"prowl_priority\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.prowl,\n \"priority\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.prowlPriorityOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"priority of Prowl messages from Medusa.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testProwl-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Prowl\",\n id: \"testProwl\"\n },\n on: { click: _vm.testProwl }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-libnotify\",\n attrs: { title: \"Libnotify\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://library.gnome.org/devel/libnotify/\"\n }\n },\n [_vm._v(\"Libnotify\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"p\",\n [\n _vm._v(\n \"The standard desktop notification API for Linux/*nix systems. This notifier will only function if the pynotify module is installed (Ubuntu/Debian package \"\n ),\n _c(\n \"app-link\",\n { attrs: { href: \"apt:python-notify\" } },\n [_vm._v(\"python-notify\")]\n ),\n _vm._v(\").\")\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_libnotify_client\",\n explanations: [\"Send Libnotify notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.libnotify.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.libnotify.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.libnotify.enabled,\n expression: \"notifiers.libnotify.enabled\"\n }\n ],\n attrs: { id: \"content-use-libnotify\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"libnotify_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.libnotify.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.libnotify.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"libnotify_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.libnotify.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.libnotify.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"libnotify_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.libnotify\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.libnotify.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testLibnotify-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Libnotify\",\n id: \"testLibnotify\"\n },\n on: { click: _vm.testLibnotify }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pushover\",\n attrs: { title: \"Pushover\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://pushover.net/\" } },\n [_vm._v(\"Pushover\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Pushover makes it easy to send real-time notifications to your Android and iOS devices.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pushover_client\",\n explanations: [\"Send Pushover notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pushover, \"enabled\", $$v)\n },\n expression: \"notifiers.pushover.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pushover.enabled,\n expression: \"notifiers.pushover.enabled\"\n }\n ],\n attrs: { id: \"content-use-pushover\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"pushover_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.pushover.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"pushover_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushover.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushover.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"pushover_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushover\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushover.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Pushover User Key\",\n id: \"pushover_userkey\",\n explanations: [\n \"User Key of your Pushover account\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.userKey,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"userKey\",\n $$v\n )\n },\n expression: \"notifiers.pushover.userKey\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Pushover API Key\",\n id: \"pushover_apikey\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.apiKey,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"apiKey\",\n $$v\n )\n },\n expression: \"notifiers.pushover.apiKey\"\n }\n },\n [\n _c(\n \"span\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://pushover.net/apps/build/\"\n }\n },\n [_c(\"b\", [_vm._v(\"Click here\")])]\n ),\n _vm._v(\" to create a Pushover API key\")\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushover_device\",\n label: \"Pushover Devices\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"pushover_device\",\n id: \"pushover_device\",\n \"list-items\":\n _vm.notifiers.pushover.device\n },\n on: {\n change: function($event) {\n _vm.notifiers.pushover.device = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"List of pushover devices you want to send notifications to\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushover_sound\",\n label: \"Pushover notification sound\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.pushover.sound,\n expression: \"notifiers.pushover.sound\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"pushover_sound\",\n name: \"pushover_sound\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.pushover,\n \"sound\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.pushoverSoundOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"Choose notification sound to use\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushover_priority\",\n label: \"Pushover notification priority\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.pushover.priority,\n expression:\n \"notifiers.pushover.priority\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"pushover_priority\",\n name: \"pushover_priority\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.pushover,\n \"priority\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(\n _vm.pushoverPriorityOptions,\n function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }\n ),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"priority of Pushover messages from Medusa\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPushover-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Pushover\",\n id: \"testPushover\"\n },\n on: { click: _vm.testPushover }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-boxcar2\",\n attrs: { title: \"Boxcar 2\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://new.boxcar.io/\" } },\n [_vm._v(\"Boxcar 2\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Read your messages where and when you want them!\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_boxcar2\",\n explanations: [\"Send boxcar2 notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.boxcar2, \"enabled\", $$v)\n },\n expression: \"notifiers.boxcar2.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.boxcar2.enabled,\n expression: \"notifiers.boxcar2.enabled\"\n }\n ],\n attrs: { id: \"content-use-boxcar2-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"boxcar2_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.boxcar2.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"boxcar2_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.boxcar2.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"boxcar2_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.boxcar2\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.boxcar2.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Boxcar2 Access token\",\n id: \"boxcar2_accesstoken\",\n explanations: [\n \"access token for your Boxcar account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.accessToken,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"accessToken\",\n $$v\n )\n },\n expression: \"notifiers.boxcar2.accessToken\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testBoxcar2-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Boxcar\",\n id: \"testBoxcar2\"\n },\n on: { click: _vm.testBoxcar2 }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pushalot\",\n attrs: { title: \"Pushalot\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://pushalot.com\" } },\n [_vm._v(\"Pushalot\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Pushalot is a platform for receiving custom push notifications to connected devices running Windows Phone or Windows 8.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pushalot\",\n explanations: [\"Send Pushalot notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushalot.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pushalot, \"enabled\", $$v)\n },\n expression: \"notifiers.pushalot.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pushalot.enabled,\n expression: \"notifiers.pushalot.enabled\"\n }\n ],\n attrs: { id: \"content-use-pushalot-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"pushalot_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushalot.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.pushalot.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"pushalot_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushalot.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushalot.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"pushalot_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushalot\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushalot.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Pushalot authorization token\",\n id: \"pushalot_authorizationtoken\",\n explanations: [\n \"authorization token of your Pushalot account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushalot.authToken,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"authToken\",\n $$v\n )\n },\n expression: \"notifiers.pushalot.authToken\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPushalot-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Pushalot\",\n id: \"testPushalot\"\n },\n on: { click: _vm.testPushalot }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pushbullet\",\n attrs: { title: \"Pushbullet\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://www.pushbullet.com\" } },\n [_vm._v(\"Pushbullet\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Pushbullet is a platform for receiving custom push notifications to connected devices running Android and desktop Chrome browsers.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pushbullet\",\n explanations: [\"Send pushbullet notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushbullet.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.pushbullet.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pushbullet.enabled,\n expression: \"notifiers.pushbullet.enabled\"\n }\n ],\n attrs: { id: \"content-use-pushbullet-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"pushbullet_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushbullet.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.pushbullet.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"pushbullet_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushbullet.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushbullet.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"pushbullet_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushbullet\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushbullet.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Pushbullet API key\",\n id: \"pushbullet_api\",\n explanations: [\n \"API key of your Pushbullet account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushbullet.api,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"api\",\n $$v\n )\n },\n expression: \"notifiers.pushbullet.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushbullet_device_list\",\n label: \"Pushbullet devices\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Update device list\",\n id: \"get-pushbullet-devices\"\n },\n on: {\n click: _vm.getPushbulletDeviceOptions\n }\n }),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.pushbullet.device,\n expression:\n \"notifiers.pushbullet.device\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"pushbullet_device_list\",\n name: \"pushbullet_device_list\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"device\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(\n _vm.pushbulletDeviceOptions,\n function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value },\n on: {\n change: function($event) {\n _vm.pushbulletTestInfo =\n \"Don't forget to save your new pushbullet settings.\"\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }\n ),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"select device you wish to push to.\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPushbullet-resultsfsf\" }\n },\n [_vm._v(_vm._s(_vm.pushbulletTestInfo))]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Pushbullet\",\n id: \"testPushbullet\"\n },\n on: { click: _vm.testPushbulletApi }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-join\",\n attrs: { title: \"Join\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://joaoapps.com/join/\" } },\n [_vm._v(\"Join\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Join is a platform for receiving custom push notifications to connected devices running Android and desktop Chrome browsers.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_join\",\n explanations: [\"Send join notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.join, \"enabled\", $$v)\n },\n expression: \"notifiers.join.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.join.enabled,\n expression: \"notifiers.join.enabled\"\n }\n ],\n attrs: { id: \"content-use-join-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"join_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.join,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.join.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"join_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.join,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.join.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"join_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.join.notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.join,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.join.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Join API key\",\n id: \"join_api\",\n explanations: [\n \"API key of your Join account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.api,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.join, \"api\", $$v)\n },\n expression: \"notifiers.join.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Join Device ID(s) key\",\n id: \"join_device\",\n explanations: [\n \"Enter DeviceID of the device(s) you wish to send notifications to, comma separated if using multiple.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.device,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.join, \"device\", $$v)\n },\n expression: \"notifiers.join.device\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testJoin-result\" }\n },\n [_vm._v(_vm._s(_vm.joinTestInfo))]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Join\",\n id: \"testJoin\"\n },\n on: { click: _vm.testJoinApi }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-freemobile\",\n attrs: { title: \"Free Mobile\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://mobile.free.fr/\" } },\n [_vm._v(\"Free Mobile\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Free Mobile is a famous French cellular network provider. It provides to their customer a free SMS API.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_freemobile\",\n explanations: [\"Send SMS notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.freemobile.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.freemobile.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.freemobile.enabled,\n expression: \"notifiers.freemobile.enabled\"\n }\n ],\n attrs: { id: \"content-use-freemobile-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"freemobile_notify_onsnatch\",\n explanations: [\n \"send an SMS when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.freemobile.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.freemobile.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"freemobile_notify_ondownload\",\n explanations: [\n \"send an SMS when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.freemobile.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.freemobile.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"freemobile_notify_onsubtitledownload\",\n explanations: [\n \"send an SMS when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.freemobile\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.freemobile.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Free Mobile customer ID\",\n id: \"freemobile_id\",\n explanations: [\n \"It's your Free Mobile customer ID (8 digits)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.freemobile.id,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"id\",\n $$v\n )\n },\n expression: \"notifiers.freemobile.id\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Free Mobile API Key\",\n id: \"freemobile_apikey\",\n explanations: [\n \"Find your API Key in your customer portal.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.freemobile.api,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"api\",\n $$v\n )\n },\n expression: \"notifiers.freemobile.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testFreeMobile-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test SMS\",\n id: \"testFreeMobile\"\n },\n on: { click: _vm.testFreeMobile }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-telegram\",\n attrs: { title: \"Telegram\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://telegram.org/\" } },\n [_vm._v(\"Telegram\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Telegram is a cloud-based instant messaging service.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_telegram\",\n explanations: [\"Send Telegram notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.telegram, \"enabled\", $$v)\n },\n expression: \"notifiers.telegram.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.telegram.enabled,\n expression: \"notifiers.telegram.enabled\"\n }\n ],\n attrs: { id: \"content-use-telegram-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"telegram_notify_onsnatch\",\n explanations: [\n \"Send a message when a download starts??\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.telegram,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.telegram.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"telegram_notify_ondownload\",\n explanations: [\n \"send a message when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.telegram.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.telegram,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.telegram.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"telegram_notify_onsubtitledownload\",\n explanations: [\n \"send a message when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.telegram\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.telegram,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.telegram.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"User/group ID\",\n id: \"telegram_id\",\n explanations: [\n \"Contact @myidbot on Telegram to get an ID\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.id,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.telegram, \"id\", $$v)\n },\n expression: \"notifiers.telegram.id\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Bot API token\",\n id: \"telegram_apikey\",\n explanations: [\n \"Contact @BotFather on Telegram to set up one\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.api,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.telegram, \"api\", $$v)\n },\n expression: \"notifiers.telegram.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testTelegram-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Telegram\",\n id: \"testTelegram\"\n },\n on: { click: _vm.testTelegram }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-discord\",\n attrs: { title: \"Discord\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://discordapp.com/\" } },\n [_vm._v(\"Discord\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Discord is a cloud-based All-in-one voice and text chat for gamers that's free, secure, and works on both your desktop and phone..\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_discord\",\n explanations: [\"Send Discord notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.discord, \"enabled\", $$v)\n },\n expression: \"notifiers.discord.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.discord.enabled,\n expression: \"notifiers.discord.enabled\"\n }\n ],\n attrs: { id: \"content-use-discord-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"discord_notify_onsnatch\",\n explanations: [\n \"Send a message when a download starts??\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.discord.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"discord_notify_ondownload\",\n explanations: [\n \"send a message when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.discord.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"discord_notify_onsubtitledownload\",\n explanations: [\n \"send a message when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.discord\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.discord.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Channel webhook\",\n id: \"discord_webhook\",\n explanations: [\n \"Add a webhook to a channel, use the returned url here\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.webhook,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"webhook\",\n $$v\n )\n },\n expression: \"notifiers.discord.webhook\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Text to speech\",\n id: \"discord_tts\",\n explanations: [\n \"Use discord text to speech feature\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.tts,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.discord, \"tts\", $$v)\n },\n expression: \"notifiers.discord.tts\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testDiscord-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Discord\",\n id: \"testDiscord\"\n },\n on: { click: _vm.testDiscord }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"social\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-twitter\",\n attrs: { title: \"Twitter\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://www.twitter.com\" } },\n [_vm._v(\"Twitter\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A social networking and microblogging service, enabling its users to send and read other users' messages called tweets.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_twitter\",\n explanations: [\n \"Should Medusa post tweets on Twitter?\",\n \"Note: you may want to use a secondary account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.twitter, \"enabled\", $$v)\n },\n expression: \"notifiers.twitter.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.twitter.enabled,\n expression: \"notifiers.twitter.enabled\"\n }\n ],\n attrs: { id: \"content-use-twitter\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"twitter_notify_onsnatch\",\n explanations: [\n \"send an SMS when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.twitter.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"twitter_notify_ondownload\",\n explanations: [\n \"send an SMS when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.twitter.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"twitter_notify_onsubtitledownload\",\n explanations: [\n \"send an SMS when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.twitter\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.twitter.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Send direct message\",\n id: \"twitter_usedm\",\n explanations: [\n \"send a notification via Direct Message, not via status update\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.directMessage,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"directMessage\",\n $$v\n )\n },\n expression: \"notifiers.twitter.directMessage\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Send DM to\",\n id: \"twitter_dmto\",\n explanations: [\n \"Twitter account to send Direct Messages to (must follow you)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.dmto,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.twitter, \"dmto\", $$v)\n },\n expression: \"notifiers.twitter.dmto\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"twitterStep1\",\n label: \"Step 1\"\n }\n },\n [\n _c(\n \"span\",\n { staticStyle: { \"font-size\": \"11px\" } },\n [\n _vm._v(\n 'Click the \"Request Authorization\" button. '\n ),\n _c(\"br\"),\n _vm._v(\n \"This will open a new page containing an auth key. \"\n ),\n _c(\"br\"),\n _vm._v(\n \"Note: if nothing happens check your popup blocker.\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Request Authorization\",\n id: \"twitter-step-1\"\n },\n on: {\n click: function($event) {\n return _vm.twitterStep1($event)\n }\n }\n })\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"twitterStep2\",\n label: \"Step 2\"\n }\n },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.twitterKey,\n expression: \"twitterKey\"\n }\n ],\n staticClass:\n \"form-control input-sm max-input350\",\n staticStyle: { display: \"inline\" },\n attrs: {\n type: \"text\",\n id: \"twitter_key\",\n placeholder:\n \"Enter the key Twitter gave you, and click 'Verify Key'\"\n },\n domProps: { value: _vm.twitterKey },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.twitterKey = $event.target.value\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Verify Key\",\n id: \"twitter-step-2\"\n },\n on: {\n click: function($event) {\n return _vm.twitterStep2($event)\n }\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"testNotification\",\n attrs: { id: \"testTwitter-result\" },\n domProps: {\n innerHTML: _vm._s(_vm.twitterTestInfo)\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Twitter\",\n id: \"testTwitter\"\n },\n on: { click: _vm.twitterTest }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-trakt\",\n attrs: { title: \"Trakt\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://trakt.tv/\" } },\n [_vm._v(\"Trakt\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"trakt helps keep a record of what TV shows and movies you are watching. Based on your favorites, trakt recommends additional shows and movies you'll enjoy!\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_trakt\",\n explanations: [\"Send Trakt.tv notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.trakt, \"enabled\", $$v)\n },\n expression: \"notifiers.trakt.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.trakt.enabled,\n expression: \"notifiers.trakt.enabled\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"trakt_username\",\n explanations: [\n \"username of your Trakt account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.trakt.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_pin\",\n label: \"Trakt PIN\"\n }\n },\n [\n _c(\"input\", {\n staticClass:\n \"form-control input-sm max-input250\",\n staticStyle: { display: \"inline\" },\n attrs: {\n type: \"text\",\n name: \"trakt_pin\",\n id: \"trakt_pin\",\n value: \"\",\n disabled: _vm.notifiers.trakt.accessToken\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: _vm.traktNewTokenMessage,\n id: \"TraktGetPin\"\n },\n on: { click: _vm.TraktGetPin }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa hide\",\n attrs: {\n type: \"button\",\n value: \"Authorize Medusa\",\n id: \"authTrakt\"\n },\n on: { click: _vm.authTrakt }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"PIN code to authorize Medusa to access Trakt on your behalf.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox-number\", {\n attrs: {\n label: \"API Timeout\",\n id: \"trakt_timeout\",\n explanations: [\n \"Seconds to wait for Trakt API to respond. (Use 0 to wait forever)\"\n ]\n },\n model: {\n value: _vm.notifiers.trakt.timeout,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"timeout\",\n $$v\n )\n },\n expression: \"notifiers.trakt.timeout\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_default_indexer\",\n label: \"Default indexer\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.trakt.defaultIndexer,\n expression:\n \"notifiers.trakt.defaultIndexer\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"trakt_default_indexer\",\n name: \"trakt_default_indexer\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.trakt,\n \"defaultIndexer\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.traktIndexersOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.key,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Sync libraries\",\n id: \"trakt_sync\",\n explanations: [\n \"Sync your Medusa show library with your Trakt collection.\",\n \"Note: Don't enable this setting if you use the Trakt addon for Kodi or any other script that syncs your library.\",\n \"Kodi detects that the episode was deleted and removes from collection which causes Medusa to re-add it. This causes a loop between Medusa and Kodi adding and deleting the episode.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.sync,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.trakt, \"sync\", $$v)\n },\n expression: \"notifiers.trakt.sync\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.trakt.sync,\n expression: \"notifiers.trakt.sync\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove Episodes From Collection\",\n id: \"trakt_remove_watchlist\",\n explanations: [\n \"Remove an Episode from your Trakt Collection if it is not in your Medusa Library.\",\n \"Note:Don't enable this setting if you use the Trakt addon for Kodi or any other script that syncs your library.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt.removeWatchlist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeWatchlist\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeWatchlist\"\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Sync watchlist\",\n id: \"trakt_sync_watchlist\",\n explanations: [\n \"Sync your Medusa library with your Trakt Watchlist (either Show and Episode).\",\n \"Episode will be added on watch list when wanted or snatched and will be removed when downloaded\",\n \"Note: By design, Trakt automatically removes episodes and/or shows from watchlist as soon you have watched them.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.syncWatchlist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"syncWatchlist\",\n $$v\n )\n },\n expression: \"notifiers.trakt.syncWatchlist\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.trakt.syncWatchlist,\n expression:\n \"notifiers.trakt.syncWatchlist\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_default_indexer\",\n label: \"Watchlist add method\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.trakt.methodAdd,\n expression:\n \"notifiers.trakt.methodAdd\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"trakt_method_add\",\n name: \"trakt_method_add\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.trakt,\n \"methodAdd\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.traktMethodOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.key,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"method in which to download episodes for new shows.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove episode\",\n id: \"trakt_remove_watchlist\",\n explanations: [\n \"remove an episode from your watchlist after it's downloaded.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt.removeWatchlist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeWatchlist\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeWatchlist\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove series\",\n id: \"trakt_remove_serieslist\",\n explanations: [\n \"remove the whole series from your watchlist after any download.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt.removeSerieslist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeSerieslist\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeSerieslist\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove watched show\",\n id: \"trakt_remove_show_from_application\",\n explanations: [\n \"remove the show from Medusa if it's ended and completely watched\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt\n .removeShowFromApplication,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeShowFromApplication\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeShowFromApplication\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Start paused\",\n id: \"trakt_start_paused\",\n explanations: [\n \"shows grabbed from your trakt watchlist start paused.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.startPaused,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"startPaused\",\n $$v\n )\n },\n expression: \"notifiers.trakt.startPaused\"\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Trakt blackList name\",\n id: \"trakt_blacklist_name\",\n explanations: [\n \"Name(slug) of List on Trakt for blacklisting show on 'Add Trending Show' & 'Add Recommended Shows' pages\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.blacklistName,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"blacklistName\",\n $$v\n )\n },\n expression: \"notifiers.trakt.blacklistName\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testTrakt-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Trakt\",\n id: \"testTrakt\"\n },\n on: { click: _vm.testTrakt }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Force Sync\",\n id: \"forceSync\"\n },\n on: { click: _vm.traktForceSync }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"trakt_pin_url\" },\n domProps: { value: _vm.notifiers.trakt.pinUrl }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-email\",\n attrs: { title: \"Email\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://en.wikipedia.org/wiki/Comparison_of_webmail_providers\"\n }\n },\n [_vm._v(\"Email\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Allows configuration of email notifications on a per show basis.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_email\",\n explanations: [\"Send email notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"enabled\", $$v)\n },\n expression: \"notifiers.email.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.email.enabled,\n expression: \"notifiers.email.enabled\"\n }\n ],\n attrs: { id: \"content-use-email\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"email_notify_onsnatch\",\n explanations: [\n \"Send a message when a download starts??\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.email.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"email_notify_ondownload\",\n explanations: [\n \"send a message when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.email.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"email_notify_onsubtitledownload\",\n explanations: [\n \"send a message when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.email\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.email.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"SMTP host\",\n id: \"email_host\",\n explanations: [\n \"hostname of your SMTP email server.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"host\", $$v)\n },\n expression: \"notifiers.email.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox-number\", {\n attrs: {\n min: 1,\n step: 1,\n label: \"SMTP port\",\n id: \"email_port\",\n explanations: [\n \"port number used to connect to your SMTP host.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.port,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"port\", $$v)\n },\n expression: \"notifiers.email.port\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"SMTP from\",\n id: \"email_from\",\n explanations: [\n \"sender email address, some hosts require a real address.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.from,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"from\", $$v)\n },\n expression: \"notifiers.email.from\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Use TLS\",\n id: \"email_tls\",\n explanations: [\"check to use TLS encryption.\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.tls,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"tls\", $$v)\n },\n expression: \"notifiers.email.tls\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"SMTP username\",\n id: \"email_username\",\n explanations: [\n \"(optional) your SMTP server username.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.email.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"SMTP password\",\n id: \"email_password\",\n explanations: [\n \"(optional) your SMTP server password.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.email.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"email_list\",\n label: \"Global email list\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"email_list\",\n id: \"email_list\",\n \"list-items\":\n _vm.notifiers.email.addressList\n },\n on: { change: _vm.emailUpdateAddressList }\n }),\n _vm._v(\n \"\\n Email addresses listed here, will receive notifications for \"\n ),\n _c(\"b\", [_vm._v(\"all\")]),\n _vm._v(\" shows.\"),\n _c(\"br\"),\n _vm._v(\n \"\\n (This field may be blank except when testing.)\\n \"\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Email Subject\",\n id: \"email_subject\",\n explanations: [\n \"Use a custom subject for some privacy protection?\",\n \"(Leave blank for the default Medusa subject)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.subject,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"subject\",\n $$v\n )\n },\n expression: \"notifiers.email.subject\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"email_show\",\n label: \"Show notification list\"\n }\n },\n [\n _c(\"show-selector\", {\n attrs: {\n \"select-class\":\n \"form-control input-sm max-input350\",\n placeholder: \"-- Select a Show --\"\n },\n on: {\n change: function($event) {\n return _vm.emailUpdateShowEmail($event)\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"offset-sm-2 col-sm-offset-2 col-sm-10 content\"\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"email_list\",\n id: \"email_list\",\n \"list-items\":\n _vm.emailSelectedShowAdresses\n },\n on: {\n change: function($event) {\n return _vm.savePerShowNotifyList(\n \"email\",\n $event\n )\n }\n }\n }),\n _vm._v(\n \"\\n Email addresses listed here, will receive notifications for \"\n ),\n _c(\"b\", [_vm._v(\"all\")]),\n _vm._v(\" shows.\"),\n _c(\"br\"),\n _vm._v(\n \"\\n (This field may be blank except when testing.)\\n \"\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testEmail-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Email\",\n id: \"testEmail\"\n },\n on: { click: _vm.testEmail }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-slack\",\n attrs: { title: \"Slack\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://slack.com\" } },\n [_vm._v(\"Slack\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Slack is a messaging app for teams.\")])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_slack_client\",\n explanations: [\"Send Slack notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.slack, \"enabled\", $$v)\n },\n expression: \"notifiers.slack.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.slack.enabled,\n expression: \"notifiers.slack.enabled\"\n }\n ],\n attrs: { id: \"content-use-slack-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"slack_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.slack.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"slack_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.slack.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"slack_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.slack\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.slack.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Slack Incoming Webhook\",\n id: \"slack_webhook\",\n explanations: [\n \"Create an incoming webhook, to communicate with your slack channel.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.webhook,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"webhook\",\n $$v\n )\n },\n expression: \"notifiers.slack.webhook\"\n }\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://my.slack.com/services/new/incoming-webhook\"\n }\n },\n [\n _vm._v(\n \"https://my.slack.com/services/new/incoming-webhook/\"\n )\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testSlack-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Slack\",\n id: \"testSlack\"\n },\n on: { click: _vm.testSlack }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n }),\n _vm._v(\" \"),\n _c(\"br\")\n ])\n ]\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"clearfix\" })\n ],\n 1\n )\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"label\",\n { staticClass: \"col-sm-2 control-label\", attrs: { for: \"kodi_host\" } },\n [_c(\"span\", [_vm._v(\"KODI IP:Port\")])]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"clear-left\" }, [\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\" some Plex Home Theaters \"),\n _c(\"b\", { staticClass: \"boldest\" }, [_vm._v(\"do not\")]),\n _vm._v(\" support notifications e.g. Plexapp for Samsung TVs\")\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/config-notifications.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { attrs: { id: \"config-notifications\" } },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"config\" } }, [\n _c(\"div\", { attrs: { id: \"config-content\" } }, [\n _c(\n \"form\",\n {\n attrs: { id: \"configForm\", method: \"post\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.save()\n }\n }\n },\n [\n _c(\"div\", { attrs: { id: \"config-components\" } }, [\n _c(\"ul\", [\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#home-theater-nas\" } }, [\n _vm._v(\"Home Theater / NAS\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#devices\" } }, [\n _vm._v(\"Devices\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#social\" } }, [\n _vm._v(\"Social\")\n ])\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"home-theater-nas\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-kodi\",\n attrs: { title: \"KODI\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://kodi.tv\" } },\n [_vm._v(\"KODI\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A free and open source cross-platform media center and home entertainment system software with a 10-foot user interface designed for the living-room TV.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_kodi\",\n explanations: [\"Send KODI commands?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.kodi, \"enabled\", $$v)\n },\n expression: \"notifiers.kodi.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.kodi.enabled,\n expression: \"notifiers.kodi.enabled\"\n }\n ],\n attrs: { id: \"content-use-kodi\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Always on\",\n id: \"kodi_always_on\",\n explanations: [\"log errors when unreachable?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.alwaysOn,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"alwaysOn\",\n $$v\n )\n },\n expression: \"notifiers.kodi.alwaysOn\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"kodi_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.kodi.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"kodi_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.kodi.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"kodi_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.kodi.notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.kodi.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Update library\",\n id: \"kodi_update_library\",\n explanations: [\n \"update KODI library when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.update.library,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi.update,\n \"library\",\n $$v\n )\n },\n expression: \"notifiers.kodi.update.library\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Full library update\",\n id: \"kodi_update_full\",\n explanations: [\n \"perform a full library update if update per-show fails?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.update.full,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi.update,\n \"full\",\n $$v\n )\n },\n expression: \"notifiers.kodi.update.full\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Clean library\",\n id: \"kodi_clean_library\",\n explanations: [\n \"clean KODI library when replaces a already downloaded episode?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.cleanLibrary,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"cleanLibrary\",\n $$v\n )\n },\n expression: \"notifiers.kodi.cleanLibrary\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Only update first host\",\n id: \"kodi_update_onlyfirst\",\n explanations: [\n \"only send library updates/clean to the first active host?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.update.onlyFirst,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi.update,\n \"onlyFirst\",\n $$v\n )\n },\n expression: \"notifiers.kodi.update.onlyFirst\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"col-sm-10 content\" },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"kodi_host\",\n id: \"kodi_host\",\n \"list-items\": _vm.notifiers.kodi.host\n },\n on: {\n change: function($event) {\n _vm.notifiers.kodi.host = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"host running KODI (eg. 192.168.1.100:8080)\"\n )\n ])\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"kodi_username\",\n explanations: [\n \"username for your KODI server (blank for none)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.kodi.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"kodi_password\",\n explanations: [\n \"password for your KODI server (blank for none)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.kodi.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.kodi,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.kodi.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testKODI-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test KODI\",\n id: \"testKODI\"\n },\n on: { click: _vm.testKODI }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-plex\",\n attrs: { title: \"Plex Media Server\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://plex.tv\" } },\n [_vm._v(\"Plex Media Server\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Experience your media on a visually stunning, easy to use interface on your Mac connected to your TV. Your media library has never looked this good!\"\n )\n ]),\n _vm._v(\" \"),\n _vm.notifiers.plex.server.enabled\n ? _c(\"p\", { staticClass: \"plexinfo\" }, [\n _vm._v(\n \"For sending notifications to Plex Home Theater (PHT) clients, use the KODI notifier with port \"\n ),\n _c(\"b\", [_vm._v(\"3005\")]),\n _vm._v(\".\")\n ])\n : _vm._e()\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_plex_server\",\n explanations: [\"Send Plex server notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.plex.server.enabled,\n expression: \"notifiers.plex.server.enabled\"\n }\n ],\n attrs: { id: \"content-use-plex-server\" }\n },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Plex Media Server Auth Token\",\n id: \"plex_server_token\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.token,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"token\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.token\"\n }\n },\n [\n _c(\"p\", [_vm._v(\"Auth Token used by plex\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\n \"span\",\n [\n _vm._v(\"See: \"),\n _c(\n \"app-link\",\n {\n staticClass: \"wiki\",\n attrs: {\n href:\n \"https://support.plex.tv/hc/en-us/articles/204059436-Finding-your-account-token-X-Plex-Token\"\n }\n },\n [\n _c(\"strong\", [\n _vm._v(\n \"Finding your account token\"\n )\n ])\n ]\n )\n ],\n 1\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"plex_server_username\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"plex_server_password\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Update Library\",\n id: \"plex_update_library\",\n explanations: [\"log errors when unreachable?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.server.updateLibrary,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"updateLibrary\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.server.updateLibrary\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"plex_server_host\",\n label: \"Plex Media Server IP:Port\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"plex_server_host\",\n id: \"plex_server_host\",\n \"list-items\":\n _vm.notifiers.plex.server.host\n },\n on: {\n change: function($event) {\n _vm.notifiers.plex.server.host = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"one or more hosts running Plex Media Server\"\n ),\n _c(\"br\"),\n _vm._v(\n \"(eg. 192.168.1.1:32400, 192.168.1.2:32400)\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"HTTPS\",\n id: \"plex_server_https\",\n explanations: [\n \"use https for plex media server requests?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.server.https,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.server,\n \"https\",\n $$v\n )\n },\n expression: \"notifiers.plex.server.https\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"field-pair\" }, [\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPMS-result\" }\n },\n [\n _vm._v(\n \"Click below to test Plex Media Server(s)\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Plex Media Server\",\n id: \"testPMS\"\n },\n on: { click: _vm.testPMS }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: {\n type: \"submit\",\n value: \"Save Changes\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"clear-left\" }, [\n _vm._v(\" \")\n ])\n ])\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-plexth\",\n attrs: { title: \"Plex Media Client\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://plex.tv\" } },\n [_vm._v(\"Plex Home Theater\")]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_plex_client\",\n explanations: [\n \"Send Plex Home Theater notifications?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.client.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.plex.client.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.plex.client.enabled,\n expression: \"notifiers.plex.client.enabled\"\n }\n ],\n attrs: { id: \"content-use-plex-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"plex_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.client.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.client.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"plex_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.client.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.client.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"plex_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.plex.client\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.plex.client.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"plex_client_host\",\n label: \"Plex Home Theater IP:Port\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"plex_client_host\",\n id: \"plex_client_host\",\n \"list-items\":\n _vm.notifiers.plex.client.host\n },\n on: {\n change: function($event) {\n _vm.notifiers.plex.client.host = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"one or more hosts running Plex Home Theater\"\n ),\n _c(\"br\"),\n _vm._v(\n \"(eg. 192.168.1.100:3000, 192.168.1.101:3000)\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"plex_client_username\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.client.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.plex.client.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"plex_client_password\",\n explanations: [\"blank = no authentication\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.plex.client.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.plex.client,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.plex.client.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"field-pair\" }, [\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPHT-result\" }\n },\n [\n _vm._v(\n \"Click below to test Plex Home Theater(s)\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Plex Home Theater\",\n id: \"testPHT\"\n },\n on: { click: _vm.testPHT }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: {\n type: \"submit\",\n value: \"Save Changes\"\n }\n }),\n _vm._v(\" \"),\n _vm._m(1)\n ])\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-emby\",\n attrs: { title: \"Emby\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://emby.media\" } },\n [_vm._v(\"Emby\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A home media server built using other popular open source technologies.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_emby\",\n explanations: [\"Send update commands to Emby?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.emby.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.emby, \"enabled\", $$v)\n },\n expression: \"notifiers.emby.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.emby.enabled,\n expression: \"notifiers.emby.enabled\"\n }\n ],\n attrs: { id: \"content_use_emby\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Emby IP:Port\",\n id: \"emby_host\",\n explanations: [\n \"host running Emby (eg. 192.168.1.100:8096)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.emby.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.emby, \"host\", $$v)\n },\n expression: \"notifiers.emby.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: { label: \"Api Key\", id: \"emby_apikey\" },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.emby.apiKey,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.emby, \"apiKey\", $$v)\n },\n expression: \"notifiers.emby.apiKey\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testEMBY-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Emby\",\n id: \"testEMBY\"\n },\n on: { click: _vm.testEMBY }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-nmj\",\n attrs: { title: \"Networked Media Jukebox\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: { href: \"http://www.popcornhour.com/\" }\n },\n [_vm._v(\"NMJ\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"The Networked Media Jukebox, or NMJ, is the official media jukebox interface made available for the Popcorn Hour 200-series.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_nmj\",\n explanations: [\"Send update commands to NMJ?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"enabled\", $$v)\n },\n expression: \"notifiers.nmj.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.nmj.enabled,\n expression: \"notifiers.nmj.enabled\"\n }\n ],\n attrs: { id: \"content-use-nmj\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Popcorn IP address\",\n id: \"nmj_host\",\n explanations: [\n \"IP address of Popcorn 200-series (eg. 192.168.1.100)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"host\", $$v)\n },\n expression: \"notifiers.nmj.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"settingsNMJ\",\n label: \"Get settings\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Get Settings\",\n id: \"settingsNMJ\"\n },\n on: { click: _vm.settingsNMJ }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"the Popcorn Hour device must be powered on and NMJ running.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"NMJ database\",\n id: \"nmj_database\",\n explanations: [\n \"automatically filled via the 'Get Settings' button.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.database,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"database\", $$v)\n },\n expression: \"notifiers.nmj.database\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"NMJ mount\",\n id: \"nmj_mount\",\n explanations: [\n \"automatically filled via the 'Get Settings' button.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmj.mount,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmj, \"mount\", $$v)\n },\n expression: \"notifiers.nmj.mount\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testNMJ-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test NMJ\",\n id: \"testNMJ\"\n },\n on: { click: _vm.testNMJ }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-nmj\",\n attrs: { title: \"Networked Media Jukebox v2\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: { href: \"http://www.popcornhour.com/\" }\n },\n [_vm._v(\"NMJv2\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"The Networked Media Jukebox, or NMJv2, is the official media jukebox interface made available for the Popcorn Hour 300 & 400-series.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_nmjv2\",\n explanations: [\n \"Send popcorn hour (nmjv2) notifications?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmjv2.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmjv2, \"enabled\", $$v)\n },\n expression: \"notifiers.nmjv2.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.nmjv2.enabled,\n expression: \"notifiers.nmjv2.enabled\"\n }\n ],\n attrs: { id: \"content-use-nmjv2\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Popcorn IP address\",\n id: \"nmjv2_host\",\n explanations: [\n \"IP address of Popcorn 300/400-series (eg. 192.168.1.100)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmjv2.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.nmjv2, \"host\", $$v)\n },\n expression: \"notifiers.nmjv2.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"nmjv2_database_location\",\n label: \"Database location\"\n }\n },\n [\n _c(\n \"label\",\n {\n staticClass: \"space-right\",\n attrs: { for: \"NMJV2_DBLOC_A\" }\n },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.nmjv2.dbloc,\n expression: \"notifiers.nmjv2.dbloc\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"nmjv2_dbloc\",\n VALUE: \"local\",\n id: \"NMJV2_DBLOC_A\"\n },\n domProps: {\n checked: _vm._q(\n _vm.notifiers.nmjv2.dbloc,\n null\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.notifiers.nmjv2,\n \"dbloc\",\n null\n )\n }\n }\n }),\n _vm._v(\n \"\\n PCH Local Media\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"label\",\n { attrs: { for: \"NMJV2_DBLOC_B\" } },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.nmjv2.dbloc,\n expression: \"notifiers.nmjv2.dbloc\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"nmjv2_dbloc\",\n VALUE: \"network\",\n id: \"NMJV2_DBLOC_B\"\n },\n domProps: {\n checked: _vm._q(\n _vm.notifiers.nmjv2.dbloc,\n null\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.notifiers.nmjv2,\n \"dbloc\",\n null\n )\n }\n }\n }),\n _vm._v(\n \"\\n PCH Network Media\\n \"\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"nmjv2_database_instance\",\n label: \"Database instance\"\n }\n },\n [\n _c(\n \"select\",\n {\n staticClass: \"form-control input-sm\",\n attrs: { id: \"NMJv2db_instance\" }\n },\n [\n _c(\"option\", { attrs: { value: \"0\" } }, [\n _vm._v(\"#1 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"1\" } }, [\n _vm._v(\"#2 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"2\" } }, [\n _vm._v(\"#3 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"3\" } }, [\n _vm._v(\"#4 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"4\" } }, [\n _vm._v(\"#5 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"5\" } }, [\n _vm._v(\"#6 \")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"6\" } }, [\n _vm._v(\"#7 \")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"adjust this value if the wrong database is selected.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"get_nmjv2_find_database\",\n label: \"Find database\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Find Database\",\n id: \"settingsNMJv2\"\n },\n on: { click: _vm.settingsNMJv2 }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"the Popcorn Hour device must be powered on.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"NMJv2 database\",\n id: \"nmjv2_database\",\n explanations: [\n \"automatically filled via the 'Find Database' buttons.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.nmjv2.database,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.nmjv2,\n \"database\",\n $$v\n )\n },\n expression: \"notifiers.nmjv2.database\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testNMJv2-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test NMJv2\",\n id: \"testNMJv2\"\n },\n on: { click: _vm.testNMJv2 }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-syno1\",\n attrs: { title: \"Synology\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://synology.com/\" } },\n [_vm._v(\"Synology\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"The Synology DiskStation NAS.\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Synology Indexer is the daemon running on the Synology NAS to build its media database.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"HTTPS\",\n id: \"use_synoindex\",\n explanations: [\n \"Note: requires Medusa to be running on your Synology NAS.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.synologyIndex.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synologyIndex,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.synologyIndex.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.synologyIndex.enabled,\n expression: \"notifiers.synologyIndex.enabled\"\n }\n ],\n attrs: { id: \"content_use_synoindex\" }\n },\n [\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ]\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-syno2\",\n attrs: { title: \"Synology Indexer\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://synology.com/\" } },\n [_vm._v(\"Synology Notifier\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Synology Notifier is the notification system of Synology DSM\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_synologynotifier\",\n explanations: [\n \"Send notifications to the Synology Notifier?\",\n \"Note: requires Medusa to be running on your Synology DSM.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.synology.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.synology, \"enabled\", $$v)\n },\n expression: \"notifiers.synology.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.synology.enabled,\n expression: \"notifiers.synology.enabled\"\n }\n ],\n attrs: { id: \"content-use-synology-notifier\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.synology.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synology,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.synology.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"synology_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.synology.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synology,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.synology.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"synology_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.synology\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.synology,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.synology.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pytivo\",\n attrs: { title: \"pyTivo\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://pytivo.sourceforge.net/wiki/index.php/PyTivo\"\n }\n },\n [_vm._v(\"pyTivo\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"pyTivo is both an HMO and GoBack server. This notifier will load the completed downloads to your Tivo.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pytivo\",\n explanations: [\"Send notifications to pyTivo?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pyTivo, \"enabled\", $$v)\n },\n expression: \"notifiers.pyTivo.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pyTivo.enabled,\n expression: \"notifiers.pyTivo.enabled\"\n }\n ],\n attrs: { id: \"content-use-pytivo\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"pyTivo IP:Port\",\n id: \"pytivo_host\",\n explanations: [\n \"host running pyTivo (eg. 192.168.1.1:9032)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pyTivo, \"host\", $$v)\n },\n expression: \"notifiers.pyTivo.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"pyTivo share name\",\n id: \"pytivo_name\",\n explanations: [\n \"(Messages & Settings > Account & System Information > System Information > DVR name)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.shareName,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pyTivo,\n \"shareName\",\n $$v\n )\n },\n expression: \"notifiers.pyTivo.shareName\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Tivo name\",\n id: \"pytivo_tivo_name\",\n explanations: [\n \"value used in pyTivo Web Configuration to name the share.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pyTivo.name,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pyTivo, \"name\", $$v)\n },\n expression: \"notifiers.pyTivo.name\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"devices\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-growl\",\n attrs: { title: \"Growl\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://growl.info/\" } },\n [_vm._v(\"Growl\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A cross-platform unobtrusive global notification system.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_growl_client\",\n explanations: [\"Send Growl notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.growl, \"enabled\", $$v)\n },\n expression: \"notifiers.growl.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.growl.enabled,\n expression: \"notifiers.growl.enabled\"\n }\n ],\n attrs: { id: \"content-use-growl-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"growl_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.growl.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"growl_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.growl.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"growl_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.growl\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.growl.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Growl IP:Port\",\n id: \"growl_host\",\n explanations: [\n \"host running Growl (eg. 192.168.1.100:23053)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.growl, \"host\", $$v)\n },\n expression: \"notifiers.growl.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"Password\",\n id: \"growl_password\",\n explanations: [\n \"may leave blank if Medusa is on the same host.\",\n \"otherwise Growl requires a password to be used.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.growl.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.growl,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.growl.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testGrowl-result\" }\n },\n [\n _vm._v(\n \"Click below to register and test Growl, this is required for Growl notifications to work.\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Register Growl\",\n id: \"testGrowl\"\n },\n on: { click: _vm.testGrowl }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-prowl\",\n attrs: { title: \"Prowl\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://www.prowlapp.com/\" } },\n [_vm._v(\"Prowl\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"A Growl client for iOS.\")])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_prowl\",\n explanations: [\"Send Prowl notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.prowl, \"enabled\", $$v)\n },\n expression: \"notifiers.prowl.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.prowl.enabled,\n expression: \"notifiers.prowl.enabled\"\n }\n ],\n attrs: { id: \"content-use-prowl\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"prowl_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.prowl.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"prowl_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.prowl.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"prowl_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.prowl\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.prowl.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Prowl Message Title\",\n id: \"prowl_message_title\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.prowl.messageTitle,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.prowl,\n \"messageTitle\",\n $$v\n )\n },\n expression: \"notifiers.prowl.messageTitle\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"prowl_api\",\n label: \"Api\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"prowl_api\",\n id: \"prowl_api\",\n \"csv-enabled\": \"\",\n \"list-items\": _vm.notifiers.prowl.api\n },\n on: { change: _vm.onChangeProwlApi }\n }),\n _vm._v(\" \"),\n _c(\n \"span\",\n [\n _vm._v(\n \"Prowl API(s) listed here, will receive notifications for \"\n ),\n _c(\"b\", [_vm._v(\"all\")]),\n _vm._v(\n \" shows.\\n Your Prowl API key is available at:\\n \"\n ),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.prowlapp.com/api_settings.php\"\n }\n },\n [\n _vm._v(\n \"\\n https://www.prowlapp.com/api_settings.php\"\n )\n ]\n ),\n _c(\"br\"),\n _vm._v(\n \"\\n (This field may be blank except when testing.)\\n \"\n )\n ],\n 1\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"prowl_show_notification_list\",\n label: \"Show notification list\"\n }\n },\n [\n _c(\"show-selector\", {\n attrs: {\n \"select-class\":\n \"form-control input-sm max-input350\",\n placeholder: \"-- Select a Show --\"\n },\n on: {\n change: function($event) {\n return _vm.prowlUpdateApiKeys($event)\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"offset-sm-2 col-sm-offset-2 col-sm-10 content\"\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"prowl-show-list\",\n id: \"prowl-show-list\",\n \"list-items\":\n _vm.prowlSelectedShowApiKeys\n },\n on: {\n change: function($event) {\n return _vm.savePerShowNotifyList(\n \"prowl\",\n $event\n )\n }\n }\n }),\n _vm._v(\n \"\\n Configure per-show notifications here by entering Prowl API key(s), after selecting a show in the drop-down box.\\n Be sure to activate the 'Save for this show' button below after each entry.\\n \"\n ),\n _c(\"span\", [\n _vm._v(\n \"The values are automatically saved when adding the api key.\"\n )\n ])\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"prowl_priority\",\n label: \"Prowl priority\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.prowl.priority,\n expression: \"notifiers.prowl.priority\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"prowl_priority\",\n name: \"prowl_priority\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.prowl,\n \"priority\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.prowlPriorityOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"priority of Prowl messages from Medusa.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testProwl-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Prowl\",\n id: \"testProwl\"\n },\n on: { click: _vm.testProwl }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-libnotify\",\n attrs: { title: \"Libnotify\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://library.gnome.org/devel/libnotify/\"\n }\n },\n [_vm._v(\"Libnotify\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"p\",\n [\n _vm._v(\n \"The standard desktop notification API for Linux/*nix systems. This notifier will only function if the pynotify module is installed (Ubuntu/Debian package \"\n ),\n _c(\n \"app-link\",\n { attrs: { href: \"apt:python-notify\" } },\n [_vm._v(\"python-notify\")]\n ),\n _vm._v(\").\")\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_libnotify_client\",\n explanations: [\"Send Libnotify notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.libnotify.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.libnotify.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.libnotify.enabled,\n expression: \"notifiers.libnotify.enabled\"\n }\n ],\n attrs: { id: \"content-use-libnotify\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"libnotify_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.libnotify.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.libnotify.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"libnotify_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.libnotify.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.libnotify.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"libnotify_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.libnotify\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.libnotify,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.libnotify.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testLibnotify-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Libnotify\",\n id: \"testLibnotify\"\n },\n on: { click: _vm.testLibnotify }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pushover\",\n attrs: { title: \"Pushover\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://pushover.net/\" } },\n [_vm._v(\"Pushover\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Pushover makes it easy to send real-time notifications to your Android and iOS devices.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pushover_client\",\n explanations: [\"Send Pushover notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pushover, \"enabled\", $$v)\n },\n expression: \"notifiers.pushover.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pushover.enabled,\n expression: \"notifiers.pushover.enabled\"\n }\n ],\n attrs: { id: \"content-use-pushover\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"pushover_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.pushover.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"pushover_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushover.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushover.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"pushover_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushover\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushover.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Pushover User Key\",\n id: \"pushover_userkey\",\n explanations: [\n \"User Key of your Pushover account\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.userKey,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"userKey\",\n $$v\n )\n },\n expression: \"notifiers.pushover.userKey\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Pushover API Key\",\n id: \"pushover_apikey\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushover.apiKey,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushover,\n \"apiKey\",\n $$v\n )\n },\n expression: \"notifiers.pushover.apiKey\"\n }\n },\n [\n _c(\n \"span\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://pushover.net/apps/build/\"\n }\n },\n [_c(\"b\", [_vm._v(\"Click here\")])]\n ),\n _vm._v(\" to create a Pushover API key\")\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushover_device\",\n label: \"Pushover Devices\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"pushover_device\",\n id: \"pushover_device\",\n \"list-items\":\n _vm.notifiers.pushover.device\n },\n on: {\n change: function($event) {\n _vm.notifiers.pushover.device = $event.map(\n function(x) {\n return x.value\n }\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"List of pushover devices you want to send notifications to\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushover_sound\",\n label: \"Pushover notification sound\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.notifiers.pushover.sound,\n expression: \"notifiers.pushover.sound\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"pushover_sound\",\n name: \"pushover_sound\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.pushover,\n \"sound\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.pushoverSoundOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"Choose notification sound to use\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushover_priority\",\n label: \"Pushover notification priority\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.pushover.priority,\n expression:\n \"notifiers.pushover.priority\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"pushover_priority\",\n name: \"pushover_priority\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.pushover,\n \"priority\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(\n _vm.pushoverPriorityOptions,\n function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }\n ),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"priority of Pushover messages from Medusa\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPushover-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Pushover\",\n id: \"testPushover\"\n },\n on: { click: _vm.testPushover }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-boxcar2\",\n attrs: { title: \"Boxcar 2\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://new.boxcar.io/\" } },\n [_vm._v(\"Boxcar 2\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Read your messages where and when you want them!\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_boxcar2\",\n explanations: [\"Send boxcar2 notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.boxcar2, \"enabled\", $$v)\n },\n expression: \"notifiers.boxcar2.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.boxcar2.enabled,\n expression: \"notifiers.boxcar2.enabled\"\n }\n ],\n attrs: { id: \"content-use-boxcar2-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"boxcar2_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.boxcar2.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"boxcar2_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.boxcar2.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"boxcar2_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.boxcar2\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.boxcar2.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Boxcar2 Access token\",\n id: \"boxcar2_accesstoken\",\n explanations: [\n \"access token for your Boxcar account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.boxcar2.accessToken,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.boxcar2,\n \"accessToken\",\n $$v\n )\n },\n expression: \"notifiers.boxcar2.accessToken\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testBoxcar2-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Boxcar\",\n id: \"testBoxcar2\"\n },\n on: { click: _vm.testBoxcar2 }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pushalot\",\n attrs: { title: \"Pushalot\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://pushalot.com\" } },\n [_vm._v(\"Pushalot\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Pushalot is a platform for receiving custom push notifications to connected devices running Windows Phone or Windows 8.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pushalot\",\n explanations: [\"Send Pushalot notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushalot.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.pushalot, \"enabled\", $$v)\n },\n expression: \"notifiers.pushalot.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pushalot.enabled,\n expression: \"notifiers.pushalot.enabled\"\n }\n ],\n attrs: { id: \"content-use-pushalot-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"pushalot_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushalot.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.pushalot.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"pushalot_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushalot.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushalot.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"pushalot_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushalot\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushalot.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Pushalot authorization token\",\n id: \"pushalot_authorizationtoken\",\n explanations: [\n \"authorization token of your Pushalot account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushalot.authToken,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushalot,\n \"authToken\",\n $$v\n )\n },\n expression: \"notifiers.pushalot.authToken\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPushalot-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Pushalot\",\n id: \"testPushalot\"\n },\n on: { click: _vm.testPushalot }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-pushbullet\",\n attrs: { title: \"Pushbullet\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://www.pushbullet.com\" } },\n [_vm._v(\"Pushbullet\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Pushbullet is a platform for receiving custom push notifications to connected devices running Android and desktop Chrome browsers.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_pushbullet\",\n explanations: [\"Send pushbullet notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushbullet.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.pushbullet.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.pushbullet.enabled,\n expression: \"notifiers.pushbullet.enabled\"\n }\n ],\n attrs: { id: \"content-use-pushbullet-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"pushbullet_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushbullet.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.pushbullet.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"pushbullet_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushbullet.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushbullet.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"pushbullet_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.pushbullet\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.pushbullet.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Pushbullet API key\",\n id: \"pushbullet_api\",\n explanations: [\n \"API key of your Pushbullet account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.pushbullet.api,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"api\",\n $$v\n )\n },\n expression: \"notifiers.pushbullet.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"pushbullet_device_list\",\n label: \"Pushbullet devices\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Update device list\",\n id: \"get-pushbullet-devices\"\n },\n on: {\n click: _vm.getPushbulletDeviceOptions\n }\n }),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.pushbullet.device,\n expression:\n \"notifiers.pushbullet.device\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"pushbullet_device_list\",\n name: \"pushbullet_device_list\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.pushbullet,\n \"device\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(\n _vm.pushbulletDeviceOptions,\n function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value },\n on: {\n change: function($event) {\n _vm.pushbulletTestInfo =\n \"Don't forget to save your new pushbullet settings.\"\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }\n ),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"select device you wish to push to.\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testPushbullet-resultsfsf\" }\n },\n [_vm._v(_vm._s(_vm.pushbulletTestInfo))]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Pushbullet\",\n id: \"testPushbullet\"\n },\n on: { click: _vm.testPushbulletApi }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-join\",\n attrs: { title: \"Join\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://joaoapps.com/join/\" } },\n [_vm._v(\"Join\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Join is a platform for receiving custom push notifications to connected devices running Android and desktop Chrome browsers.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_join\",\n explanations: [\"Send join notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.join, \"enabled\", $$v)\n },\n expression: \"notifiers.join.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.join.enabled,\n expression: \"notifiers.join.enabled\"\n }\n ],\n attrs: { id: \"content-use-join-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"join_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.join,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.join.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"join_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.join,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.join.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"join_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.join.notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.join,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.join.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Join API key\",\n id: \"join_api\",\n explanations: [\n \"API key of your Join account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.api,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.join, \"api\", $$v)\n },\n expression: \"notifiers.join.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Join Device ID(s) key\",\n id: \"join_device\",\n explanations: [\n \"Enter DeviceID of the device(s) you wish to send notifications to, comma separated if using multiple.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.join.device,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.join, \"device\", $$v)\n },\n expression: \"notifiers.join.device\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testJoin-result\" }\n },\n [_vm._v(_vm._s(_vm.joinTestInfo))]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Join\",\n id: \"testJoin\"\n },\n on: { click: _vm.testJoinApi }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-freemobile\",\n attrs: { title: \"Free Mobile\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"http://mobile.free.fr/\" } },\n [_vm._v(\"Free Mobile\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Free Mobile is a famous French cellular network provider. It provides to their customer a free SMS API.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_freemobile\",\n explanations: [\"Send SMS notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.freemobile.enabled,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"enabled\",\n $$v\n )\n },\n expression: \"notifiers.freemobile.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.freemobile.enabled,\n expression: \"notifiers.freemobile.enabled\"\n }\n ],\n attrs: { id: \"content-use-freemobile-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"freemobile_notify_onsnatch\",\n explanations: [\n \"send an SMS when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.freemobile.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.freemobile.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"freemobile_notify_ondownload\",\n explanations: [\n \"send an SMS when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.freemobile.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.freemobile.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"freemobile_notify_onsubtitledownload\",\n explanations: [\n \"send an SMS when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.freemobile\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.freemobile.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Free Mobile customer ID\",\n id: \"freemobile_id\",\n explanations: [\n \"It's your Free Mobile customer ID (8 digits)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.freemobile.id,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"id\",\n $$v\n )\n },\n expression: \"notifiers.freemobile.id\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Free Mobile API Key\",\n id: \"freemobile_apikey\",\n explanations: [\n \"Find your API Key in your customer portal.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.freemobile.api,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.freemobile,\n \"api\",\n $$v\n )\n },\n expression: \"notifiers.freemobile.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testFreeMobile-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test SMS\",\n id: \"testFreeMobile\"\n },\n on: { click: _vm.testFreeMobile }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-telegram\",\n attrs: { title: \"Telegram\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://telegram.org/\" } },\n [_vm._v(\"Telegram\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Telegram is a cloud-based instant messaging service.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_telegram\",\n explanations: [\"Send Telegram notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.telegram, \"enabled\", $$v)\n },\n expression: \"notifiers.telegram.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.telegram.enabled,\n expression: \"notifiers.telegram.enabled\"\n }\n ],\n attrs: { id: \"content-use-telegram-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"telegram_notify_onsnatch\",\n explanations: [\n \"Send a message when a download starts??\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.telegram,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression:\n \"notifiers.telegram.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"telegram_notify_ondownload\",\n explanations: [\n \"send a message when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.telegram.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.telegram,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.telegram.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"telegram_notify_onsubtitledownload\",\n explanations: [\n \"send a message when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.telegram\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.telegram,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.telegram.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"User/group ID\",\n id: \"telegram_id\",\n explanations: [\n \"Contact @myidbot on Telegram to get an ID\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.id,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.telegram, \"id\", $$v)\n },\n expression: \"notifiers.telegram.id\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Bot API token\",\n id: \"telegram_apikey\",\n explanations: [\n \"Contact @BotFather on Telegram to set up one\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.telegram.api,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.telegram, \"api\", $$v)\n },\n expression: \"notifiers.telegram.api\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testTelegram-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Telegram\",\n id: \"testTelegram\"\n },\n on: { click: _vm.testTelegram }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-discord\",\n attrs: { title: \"Discord\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://discordapp.com/\" } },\n [_vm._v(\"Discord\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Discord is a cloud-based All-in-one voice and text chat for gamers that's free, secure, and works on both your desktop and phone..\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_discord\",\n explanations: [\"Send Discord notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.discord, \"enabled\", $$v)\n },\n expression: \"notifiers.discord.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.discord.enabled,\n expression: \"notifiers.discord.enabled\"\n }\n ],\n attrs: { id: \"content-use-discord-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"discord_notify_onsnatch\",\n explanations: [\n \"Send a message when a download starts??\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.discord.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"discord_notify_ondownload\",\n explanations: [\n \"send a message when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.discord.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"discord_notify_onsubtitledownload\",\n explanations: [\n \"send a message when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.discord\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.discord.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Channel webhook\",\n id: \"discord_webhook\",\n explanations: [\n \"Add a webhook to a channel, use the returned url here\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.webhook,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.discord,\n \"webhook\",\n $$v\n )\n },\n expression: \"notifiers.discord.webhook\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Text to speech\",\n id: \"discord_tts\",\n explanations: [\n \"Use discord text to speech feature\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.tts,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.discord, \"tts\", $$v)\n },\n expression: \"notifiers.discord.tts\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Bot username\",\n id: \"discord_name\",\n explanations: [\n \"Create a username for the Discord Bot to use\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.discord.name,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.discord, \"name\", $$v)\n },\n expression: \"notifiers.discord.name\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testDiscord-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Discord\",\n id: \"testDiscord\"\n },\n on: { click: _vm.testDiscord }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"social\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-twitter\",\n attrs: { title: \"Twitter\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://www.twitter.com\" } },\n [_vm._v(\"Twitter\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"A social networking and microblogging service, enabling its users to send and read other users' messages called tweets.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_twitter\",\n explanations: [\n \"Should Medusa post tweets on Twitter?\",\n \"Note: you may want to use a secondary account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.twitter, \"enabled\", $$v)\n },\n expression: \"notifiers.twitter.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.twitter.enabled,\n expression: \"notifiers.twitter.enabled\"\n }\n ],\n attrs: { id: \"content-use-twitter\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"twitter_notify_onsnatch\",\n explanations: [\n \"send an SMS when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.twitter.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"twitter_notify_ondownload\",\n explanations: [\n \"send an SMS when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.twitter.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"twitter_notify_onsubtitledownload\",\n explanations: [\n \"send an SMS when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.twitter\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.twitter.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Send direct message\",\n id: \"twitter_usedm\",\n explanations: [\n \"send a notification via Direct Message, not via status update\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.directMessage,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.twitter,\n \"directMessage\",\n $$v\n )\n },\n expression: \"notifiers.twitter.directMessage\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Send DM to\",\n id: \"twitter_dmto\",\n explanations: [\n \"Twitter account to send Direct Messages to (must follow you)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.twitter.dmto,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.twitter, \"dmto\", $$v)\n },\n expression: \"notifiers.twitter.dmto\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"twitterStep1\",\n label: \"Step 1\"\n }\n },\n [\n _c(\n \"span\",\n { staticStyle: { \"font-size\": \"11px\" } },\n [\n _vm._v(\n 'Click the \"Request Authorization\" button. '\n ),\n _c(\"br\"),\n _vm._v(\n \"This will open a new page containing an auth key. \"\n ),\n _c(\"br\"),\n _vm._v(\n \"Note: if nothing happens check your popup blocker.\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Request Authorization\",\n id: \"twitter-step-1\"\n },\n on: {\n click: function($event) {\n return _vm.twitterStep1($event)\n }\n }\n })\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"twitterStep2\",\n label: \"Step 2\"\n }\n },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.twitterKey,\n expression: \"twitterKey\"\n }\n ],\n staticClass:\n \"form-control input-sm max-input350\",\n staticStyle: { display: \"inline\" },\n attrs: {\n type: \"text\",\n id: \"twitter_key\",\n placeholder:\n \"Enter the key Twitter gave you, and click 'Verify Key'\"\n },\n domProps: { value: _vm.twitterKey },\n on: {\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.twitterKey = $event.target.value\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n value: \"Verify Key\",\n id: \"twitter-step-2\"\n },\n on: {\n click: function($event) {\n return _vm.twitterStep2($event)\n }\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"testNotification\",\n attrs: { id: \"testTwitter-result\" },\n domProps: {\n innerHTML: _vm._s(_vm.twitterTestInfo)\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Twitter\",\n id: \"testTwitter\"\n },\n on: { click: _vm.twitterTest }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-trakt\",\n attrs: { title: \"Trakt\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://trakt.tv/\" } },\n [_vm._v(\"Trakt\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"trakt helps keep a record of what TV shows and movies you are watching. Based on your favorites, trakt recommends additional shows and movies you'll enjoy!\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_trakt\",\n explanations: [\"Send Trakt.tv notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.trakt, \"enabled\", $$v)\n },\n expression: \"notifiers.trakt.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.trakt.enabled,\n expression: \"notifiers.trakt.enabled\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\"config-textbox\", {\n attrs: {\n label: \"Username\",\n id: \"trakt_username\",\n explanations: [\n \"username of your Trakt account.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.trakt.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_pin\",\n label: \"Trakt PIN\"\n }\n },\n [\n _c(\"input\", {\n staticClass:\n \"form-control input-sm max-input250\",\n staticStyle: { display: \"inline\" },\n attrs: {\n type: \"text\",\n name: \"trakt_pin\",\n id: \"trakt_pin\",\n value: \"\",\n disabled: _vm.notifiers.trakt.accessToken\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: _vm.traktNewTokenMessage,\n id: \"TraktGetPin\"\n },\n on: { click: _vm.TraktGetPin }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa hide\",\n attrs: {\n type: \"button\",\n value: \"Authorize Medusa\",\n id: \"authTrakt\"\n },\n on: { click: _vm.authTrakt }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"PIN code to authorize Medusa to access Trakt on your behalf.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox-number\", {\n attrs: {\n label: \"API Timeout\",\n id: \"trakt_timeout\",\n explanations: [\n \"Seconds to wait for Trakt API to respond. (Use 0 to wait forever)\"\n ]\n },\n model: {\n value: _vm.notifiers.trakt.timeout,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"timeout\",\n $$v\n )\n },\n expression: \"notifiers.trakt.timeout\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_default_indexer\",\n label: \"Default indexer\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.trakt.defaultIndexer,\n expression:\n \"notifiers.trakt.defaultIndexer\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"trakt_default_indexer\",\n name: \"trakt_default_indexer\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.trakt,\n \"defaultIndexer\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.traktIndexersOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.key,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Sync libraries\",\n id: \"trakt_sync\",\n explanations: [\n \"Sync your Medusa show library with your Trakt collection.\",\n \"Note: Don't enable this setting if you use the Trakt addon for Kodi or any other script that syncs your library.\",\n \"Kodi detects that the episode was deleted and removes from collection which causes Medusa to re-add it. This causes a loop between Medusa and Kodi adding and deleting the episode.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.sync,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.trakt, \"sync\", $$v)\n },\n expression: \"notifiers.trakt.sync\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.trakt.sync,\n expression: \"notifiers.trakt.sync\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove Episodes From Collection\",\n id: \"trakt_remove_watchlist\",\n explanations: [\n \"Remove an Episode from your Trakt Collection if it is not in your Medusa Library.\",\n \"Note:Don't enable this setting if you use the Trakt addon for Kodi or any other script that syncs your library.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt.removeWatchlist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeWatchlist\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeWatchlist\"\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Sync watchlist\",\n id: \"trakt_sync_watchlist\",\n explanations: [\n \"Sync your Medusa library with your Trakt Watchlist (either Show and Episode).\",\n \"Episode will be added on watch list when wanted or snatched and will be removed when downloaded\",\n \"Note: By design, Trakt automatically removes episodes and/or shows from watchlist as soon you have watched them.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.syncWatchlist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"syncWatchlist\",\n $$v\n )\n },\n expression: \"notifiers.trakt.syncWatchlist\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.trakt.syncWatchlist,\n expression:\n \"notifiers.trakt.syncWatchlist\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_default_indexer\",\n label: \"Watchlist add method\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value:\n _vm.notifiers.trakt.methodAdd,\n expression:\n \"notifiers.trakt.methodAdd\"\n }\n ],\n staticClass: \"form-control\",\n attrs: {\n id: \"trakt_method_add\",\n name: \"trakt_method_add\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.$set(\n _vm.notifiers.trakt,\n \"methodAdd\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.traktMethodOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.key,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"method in which to download episodes for new shows.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove episode\",\n id: \"trakt_remove_watchlist\",\n explanations: [\n \"remove an episode from your watchlist after it's downloaded.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt.removeWatchlist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeWatchlist\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeWatchlist\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove series\",\n id: \"trakt_remove_serieslist\",\n explanations: [\n \"remove the whole series from your watchlist after any download.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt.removeSerieslist,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeSerieslist\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeSerieslist\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Remove watched show\",\n id: \"trakt_remove_show_from_application\",\n explanations: [\n \"remove the show from Medusa if it's ended and completely watched\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.trakt\n .removeShowFromApplication,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"removeShowFromApplication\",\n $$v\n )\n },\n expression:\n \"notifiers.trakt.removeShowFromApplication\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Start paused\",\n id: \"trakt_start_paused\",\n explanations: [\n \"shows grabbed from your trakt watchlist start paused.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.startPaused,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"startPaused\",\n $$v\n )\n },\n expression: \"notifiers.trakt.startPaused\"\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Trakt blackList name\",\n id: \"trakt_blacklist_name\",\n explanations: [\n \"Name(slug) of List on Trakt for blacklisting show on 'Add Trending Show' & 'Add Recommended Shows' pages\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.trakt.blacklistName,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.trakt,\n \"blacklistName\",\n $$v\n )\n },\n expression: \"notifiers.trakt.blacklistName\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testTrakt-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Trakt\",\n id: \"testTrakt\"\n },\n on: { click: _vm.testTrakt }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Force Sync\",\n id: \"forceSync\"\n },\n on: { click: _vm.traktForceSync }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"trakt_pin_url\" },\n domProps: { value: _vm.notifiers.trakt.pinUrl }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-email\",\n attrs: { title: \"Email\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://en.wikipedia.org/wiki/Comparison_of_webmail_providers\"\n }\n },\n [_vm._v(\"Email\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Allows configuration of email notifications on a per show basis.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_email\",\n explanations: [\"Send email notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"enabled\", $$v)\n },\n expression: \"notifiers.email.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.email.enabled,\n expression: \"notifiers.email.enabled\"\n }\n ],\n attrs: { id: \"content-use-email\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"email_notify_onsnatch\",\n explanations: [\n \"Send a message when a download starts??\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.email.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"email_notify_ondownload\",\n explanations: [\n \"send a message when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.email.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"email_notify_onsubtitledownload\",\n explanations: [\n \"send a message when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.email\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.email.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"SMTP host\",\n id: \"email_host\",\n explanations: [\n \"hostname of your SMTP email server.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.host,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"host\", $$v)\n },\n expression: \"notifiers.email.host\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox-number\", {\n attrs: {\n min: 1,\n step: 1,\n label: \"SMTP port\",\n id: \"email_port\",\n explanations: [\n \"port number used to connect to your SMTP host.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.port,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"port\", $$v)\n },\n expression: \"notifiers.email.port\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"SMTP from\",\n id: \"email_from\",\n explanations: [\n \"sender email address, some hosts require a real address.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.from,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"from\", $$v)\n },\n expression: \"notifiers.email.from\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Use TLS\",\n id: \"email_tls\",\n explanations: [\"check to use TLS encryption.\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.tls,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.email, \"tls\", $$v)\n },\n expression: \"notifiers.email.tls\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"SMTP username\",\n id: \"email_username\",\n explanations: [\n \"(optional) your SMTP server username.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.username,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"username\",\n $$v\n )\n },\n expression: \"notifiers.email.username\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n type: \"password\",\n label: \"SMTP password\",\n id: \"email_password\",\n explanations: [\n \"(optional) your SMTP server password.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.password,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"password\",\n $$v\n )\n },\n expression: \"notifiers.email.password\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"email_list\",\n label: \"Global email list\"\n }\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"email_list\",\n id: \"email_list\",\n \"list-items\":\n _vm.notifiers.email.addressList\n },\n on: { change: _vm.emailUpdateAddressList }\n }),\n _vm._v(\n \"\\n Email addresses listed here, will receive notifications for \"\n ),\n _c(\"b\", [_vm._v(\"all\")]),\n _vm._v(\" shows.\"),\n _c(\"br\"),\n _vm._v(\n \"\\n (This field may be blank except when testing.)\\n \"\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Email Subject\",\n id: \"email_subject\",\n explanations: [\n \"Use a custom subject for some privacy protection?\",\n \"(Leave blank for the default Medusa subject)\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.email.subject,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.email,\n \"subject\",\n $$v\n )\n },\n expression: \"notifiers.email.subject\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"email_show\",\n label: \"Show notification list\"\n }\n },\n [\n _c(\"show-selector\", {\n attrs: {\n \"select-class\":\n \"form-control input-sm max-input350\",\n placeholder: \"-- Select a Show --\"\n },\n on: {\n change: function($event) {\n return _vm.emailUpdateShowEmail($event)\n }\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"offset-sm-2 col-sm-offset-2 col-sm-10 content\"\n },\n [\n _c(\"select-list\", {\n attrs: {\n name: \"email_list\",\n id: \"email_list\",\n \"list-items\":\n _vm.emailSelectedShowAdresses\n },\n on: {\n change: function($event) {\n return _vm.savePerShowNotifyList(\n \"email\",\n $event\n )\n }\n }\n }),\n _vm._v(\n \"\\n Email addresses listed here, will receive notifications for \"\n ),\n _c(\"b\", [_vm._v(\"all\")]),\n _vm._v(\" shows.\"),\n _c(\"br\"),\n _vm._v(\n \"\\n (This field may be blank except when testing.)\\n \"\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testEmail-result\" }\n },\n [_vm._v(\"Click below to test.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Email\",\n id: \"testEmail\"\n },\n on: { click: _vm.testEmail }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n {\n staticClass: \"component-group-desc col-xs-12 col-md-2\"\n },\n [\n _c(\"span\", {\n staticClass: \"icon-notifiers-slack\",\n attrs: { title: \"Slack\" }\n }),\n _vm._v(\" \"),\n _c(\n \"h3\",\n [\n _c(\n \"app-link\",\n { attrs: { href: \"https://slack.com\" } },\n [_vm._v(\"Slack\")]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Slack is a messaging app for teams.\")])\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Enable\",\n id: \"use_slack_client\",\n explanations: [\"Send Slack notifications?\"]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.enabled,\n callback: function($$v) {\n _vm.$set(_vm.notifiers.slack, \"enabled\", $$v)\n },\n expression: \"notifiers.slack.enabled\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.notifiers.slack.enabled,\n expression: \"notifiers.slack.enabled\"\n }\n ],\n attrs: { id: \"content-use-slack-client\" }\n },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on snatch\",\n id: \"slack_notify_onsnatch\",\n explanations: [\n \"send a notification when a download starts?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.notifyOnSnatch,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"notifyOnSnatch\",\n $$v\n )\n },\n expression: \"notifiers.slack.notifyOnSnatch\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on download\",\n id: \"slack_notify_ondownload\",\n explanations: [\n \"send a notification when a download finishes?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.notifyOnDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"notifyOnDownload\",\n $$v\n )\n },\n expression: \"notifiers.slack.notifyOnDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Notify on subtitle download\",\n id: \"slack_notify_onsubtitledownload\",\n explanations: [\n \"send a notification when subtitles are downloaded?\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value:\n _vm.notifiers.slack\n .notifyOnSubtitleDownload,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"notifyOnSubtitleDownload\",\n $$v\n )\n },\n expression:\n \"notifiers.slack.notifyOnSubtitleDownload\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Slack Incoming Webhook\",\n id: \"slack_webhook\",\n explanations: [\n \"Create an incoming webhook, to communicate with your slack channel.\"\n ]\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.notifiers.slack.webhook,\n callback: function($$v) {\n _vm.$set(\n _vm.notifiers.slack,\n \"webhook\",\n $$v\n )\n },\n expression: \"notifiers.slack.webhook\"\n }\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://my.slack.com/services/new/incoming-webhook\"\n }\n },\n [\n _vm._v(\n \"https://my.slack.com/services/new/incoming-webhook/\"\n )\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testSlack-result\" }\n },\n [_vm._v(\"Click below to test your settings.\")]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Test Slack\",\n id: \"testSlack\"\n },\n on: { click: _vm.testSlack }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"config_submitter btn-medusa\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n }),\n _vm._v(\" \"),\n _c(\"br\")\n ])\n ]\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"clearfix\" })\n ],\n 1\n )\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"label\",\n { staticClass: \"col-sm-2 control-label\", attrs: { for: \"kodi_host\" } },\n [_c(\"span\", [_vm._v(\"KODI IP:Port\")])]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"clear-left\" }, [\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\" some Plex Home Theaters \"),\n _c(\"b\", { staticClass: \"boldest\" }, [_vm._v(\"do not\")]),\n _vm._v(\" support notifications e.g. Plexapp for Samsung TVs\")\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/config-notifications.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1141,7 +1141,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"display-show-template\", class: _vm.theme },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _vm.show.id.slug\n ? _c(\"backstretch\", { attrs: { slug: _vm.show.id.slug } })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-id\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"indexer-name\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-slug\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"show-header\", {\n ref: \"show-header\",\n attrs: { type: \"show\", \"show-id\": _vm.id, \"show-indexer\": _vm.indexer },\n on: {\n reflow: _vm.reflowLayout,\n update: _vm.statusQualityUpdate,\n \"update-overview-status\": function($event) {\n _vm.filterByOverviewStatus = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\" },\n [\n _vm.show.seasons\n ? _c(\"vue-good-table\", {\n ref: \"table-seasons\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.orderSeasons,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: _vm.layout.show.pagination.enable,\n perPage: _vm.paginationPerPage,\n perPageDropdown: _vm.perPageDropdown\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search episodes\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"episode\", type: \"desc\" }\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: true\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n },\n \"on-per-page-change\": function($event) {\n return _vm.updatePaginationPerPage(\n $event.currentPerPage\n )\n },\n \"on-page-change\": _vm.onPageChange\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n {\n staticClass: \"season-header toggle collapse\"\n },\n [\n _c(\"app-link\", {\n attrs: {\n name: \"season-\" + props.row.season\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass:\n \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip:\n props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[\n props.column.field\n ],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.formattedRow[\n props.column.field\n ] || 0,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n props.formattedRow[\n props.column.field\n ],\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value: props.formattedRow[\n props.column.field\n ]\n ? props.formattedRow[\n props.column.field\n ]\n : \"\"\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description:\n props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.file.location\n }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Download\"\n ? _c(\n \"span\",\n [\n _vm.config.downloadUrl &&\n props.row.file.location &&\n [\"Downloaded\", \"Archived\"].includes(\n props.row.status\n )\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n _vm.config.downloadUrl +\n props.row.file.location\n }\n },\n [_vm._v(\"Download\")]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass:\n \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\n \"span\",\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 4204561448\n )\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.layout.show.specials &&\n _vm.specials &&\n _vm.specials.length > 0\n ? _c(\"vue-good-table\", {\n ref: \"table-specials\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.specials,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: false\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search specials\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"episode\", type: \"desc\" }\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: false\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n }\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n {\n staticClass: \"season-header toggle collapse\"\n },\n [\n _c(\"app-link\", {\n attrs: {\n name: \"season-\" + props.row.season\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass:\n \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip:\n props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[\n props.column.field\n ],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.formattedRow[\n props.column.field\n ] || 0,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n props.formattedRow[\n props.column.field\n ],\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value: props.formattedRow[\n props.column.field\n ]\n ? props.formattedRow[\n props.column.field\n ]\n : \"\"\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description:\n props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.file.location\n }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Download\"\n ? _c(\n \"span\",\n [\n _vm.config.downloadUrl &&\n props.row.file.location &&\n [\"Downloaded\", \"Archived\"].includes(\n props.row.status\n )\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n _vm.config.downloadUrl +\n props.row.file.location\n }\n },\n [_vm._v(\"Download\")]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass:\n \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\n \"span\",\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 4204561448\n )\n })\n : _vm._e()\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-start-backlog-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeBacklogSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-hidden\": \"true\"\n }\n },\n [_vm._v(\"×\")]\n ),\n _vm._v(\" \"),\n _c(\"h4\", { staticClass: \"modal-title\" }, [\n _vm._v(\"Start search?\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [\n _vm._v(\n \"Some episodes have been changed to 'Wanted'. Do you want to trigger a backlog search for these \" +\n _vm._s(_vm.backlogSearchEpisodes.length) +\n \" episode(s)\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search(_vm.backlogSearchEpisodes, \"backlog\")\n _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-mark-failed-and-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeFailedSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _vm._v(\n \"\\n Mark episode as failed and search?\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [_vm._v(\"Starting to search for the episode\")]),\n _vm._v(\" \"),\n _vm.failedSearchEpisode\n ? _c(\"p\", [\n _vm._v(\n \"Would you also like to mark episode \" +\n _vm._s(_vm.failedSearchEpisode.slug) +\n ' as \"failed\"? This will make sure the episode cannot be downloaded again'\n )\n ])\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search([_vm.failedSearchEpisode], \"backlog\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search([_vm.failedSearchEpisode], \"failed\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\n \"query-mark-failed-and-search\"\n )\n }\n }\n },\n [_vm._v(\"Cancel\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"display-show-template\", class: _vm.theme },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _vm.show.id.slug\n ? _c(\"backstretch\", { attrs: { slug: _vm.show.id.slug } })\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-id\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"indexer-name\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", id: \"series-slug\", value: \"\" } }),\n _vm._v(\" \"),\n _c(\"show-header\", {\n ref: \"show-header\",\n attrs: { type: \"show\", \"show-id\": _vm.id, \"show-indexer\": _vm.indexer },\n on: {\n reflow: _vm.reflowLayout,\n update: _vm.statusQualityUpdate,\n \"update-overview-status\": function($event) {\n _vm.filterByOverviewStatus = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\" },\n [\n _vm.show.seasons\n ? _c(\"vue-good-table\", {\n ref: \"table-seasons\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.orderSeasons,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: _vm.layout.show.pagination.enable,\n perPage: _vm.paginationPerPage,\n perPageDropdown: _vm.perPageDropdown\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search episodes\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"episode\", type: \"desc\" }\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: true\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n },\n \"on-per-page-change\": function($event) {\n return _vm.updatePaginationPerPage(\n $event.currentPerPage\n )\n },\n \"on-page-change\": _vm.onPageChange\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n {\n staticClass: \"season-header toggle collapse\"\n },\n [\n _c(\"app-link\", {\n attrs: {\n name: \"season-\" + props.row.season\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass:\n \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip:\n props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[\n props.column.field\n ],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.formattedRow[\n props.column.field\n ] || 0,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n props.formattedRow[\n props.column.field\n ],\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value: props.formattedRow[\n props.column.field\n ]\n ? props.formattedRow[\n props.column.field\n ]\n : \"\"\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description:\n props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.file.location\n }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Download\"\n ? _c(\n \"span\",\n [\n _vm.config.downloadUrl &&\n props.row.file.location &&\n [\"Downloaded\", \"Archived\"].includes(\n props.row.status\n )\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n _vm.config.downloadUrl +\n props.row.file.location\n }\n },\n [_vm._v(\"Download\")]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass:\n \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\n \"span\",\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 4204561448\n )\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.layout.show.specials &&\n _vm.specials &&\n _vm.specials.length > 0\n ? _c(\"vue-good-table\", {\n ref: \"table-specials\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.specials,\n groupOptions: {\n enabled: true,\n mode: \"span\",\n customChildObject: \"episodes\"\n },\n \"pagination-options\": {\n enabled: false\n },\n \"search-options\": {\n enabled: true,\n trigger: \"enter\",\n skipDiacritics: false,\n placeholder: \"Search specials\"\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"episode\", type: \"desc\" }\n },\n selectOptions: {\n enabled: true,\n selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row\n selectionInfoClass: \"select-info\",\n selectionText: \"episodes selected\",\n clearSelectionText: \"clear\",\n selectAllByGroup: true\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n \"column-filter-options\": {\n enabled: false\n }\n },\n on: {\n \"on-selected-rows-change\": function($event) {\n _vm.selectedEpisodes = $event.selectedRows\n }\n },\n scopedSlots: _vm._u(\n [\n {\n key: \"table-header-row\",\n fn: function(props) {\n return [\n _c(\n \"h3\",\n {\n staticClass: \"season-header toggle collapse\"\n },\n [\n _c(\"app-link\", {\n attrs: {\n name: \"season-\" + props.row.season\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.season > 0\n ? \"Season \" + props.row.season\n : \"Specials\"\n ) +\n \"\\n \"\n ),\n _vm._v(\" \"),\n _vm.anyEpisodeNotUnaired(props.row)\n ? _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=1&manual_search_type=season\"\n }\n },\n [\n _vm.config\n ? _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src:\n \"images/manualsearch-white.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", {\n staticClass: \"season-scene-exception\",\n attrs: {\n \"data-season\":\n props.row.season > 0\n ? props.row.season\n : \"Specials\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"img\",\n _vm._b(\n {},\n \"img\",\n _vm.getSeasonExceptions(props.row.season),\n false\n )\n )\n ],\n 1\n )\n ]\n }\n },\n {\n key: \"table-footer-row\",\n fn: function(ref) {\n var headerRow = ref.headerRow\n return [\n _c(\n \"tr\",\n {\n staticClass:\n \"seasoncols border-bottom shadow\",\n attrs: {\n colspan: \"9999\",\n id: \"season-\" + headerRow.season + \"-footer\"\n }\n },\n [\n _c(\n \"th\",\n {\n staticClass: \"col-footer\",\n attrs: { colspan: \"15\", align: \"left\" }\n },\n [\n _vm._v(\n \"Season contains \" +\n _vm._s(headerRow.episodes.length) +\n \" episodes with total filesize: \" +\n _vm._s(_vm.addFileSize(headerRow))\n )\n ]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"tr\", { staticClass: \"spacer\" })\n ]\n }\n },\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.field == \"content.hasNfo\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasNfo\n ? \"nfo.gif\"\n : \"nfo-no.gif\"),\n alt: props.row.content.hasNfo\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.field == \"content.hasTbn\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/\" +\n (props.row.content.hasTbn\n ? \"tbn.gif\"\n : \"tbn-no.gif\"),\n alt: props.row.content.hasTbn\n ? \"Y\"\n : \"N\",\n width: \"23\",\n height: \"11\"\n }\n })\n ])\n : props.column.label == \"Episode\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n class: {\n addQTip:\n props.row.file.location !== \"\"\n },\n attrs: {\n title:\n props.row.file.location !== \"\"\n ? props.row.file.location\n : \"\"\n }\n },\n [_vm._v(_vm._s(props.row.episode))]\n )\n ])\n : props.column.label == \"Scene\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneSeasonXEpisode form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode,\n size: \"6\",\n maxlength: \"8\",\n \"data-for-season\": props.row.season,\n \"data-for-episode\": props.row.episode,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n \"_\" +\n props.row.season +\n \"_\" +\n props.row.episode,\n title:\n \"Change this value if scene numbering differs from the indexer episode numbering. Generally used for non-anime shows.\"\n },\n domProps: {\n value:\n props.formattedRow[props.column.field]\n .season +\n \"x\" +\n props.formattedRow[props.column.field]\n .episode\n }\n })\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"input\", {\n staticClass:\n \"sceneAbsolute form-control input-scene addQTip\",\n staticStyle: {\n padding: \"0\",\n \"text-align\": \"center\",\n \"max-width\": \"60px\"\n },\n attrs: {\n type: \"text\",\n placeholder:\n props.formattedRow[\n props.column.field\n ],\n size: \"6\",\n maxlength: \"8\",\n \"data-for-absolute\":\n props.formattedRow[\n props.column.field\n ] || 0,\n id:\n \"sceneSeasonXEpisode_\" +\n _vm.show.id[_vm.show.indexer] +\n props.formattedRow[\n props.column.field\n ],\n title:\n \"Change this value if scene absolute numbering differs from the indexer absolute numbering. Generally used for anime shows.\"\n },\n domProps: {\n value: props.formattedRow[\n props.column.field\n ]\n ? props.formattedRow[\n props.column.field\n ]\n : \"\"\n }\n })\n ])\n : props.column.label == \"Title\"\n ? _c(\n \"span\",\n [\n props.row.description !== \"\"\n ? _c(\"plot-info\", {\n attrs: {\n description:\n props.row.description,\n \"show-slug\": _vm.show.id.slug,\n season: props.row.season,\n episode: props.row.episode\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.title) +\n \"\\n \"\n )\n ],\n 1\n )\n : props.column.label == \"File\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.file.location\n }\n },\n [_vm._v(_vm._s(props.row.file.name))]\n )\n ])\n : props.column.label == \"Download\"\n ? _c(\n \"span\",\n [\n _vm.config.downloadUrl &&\n props.row.file.location &&\n [\"Downloaded\", \"Archived\"].includes(\n props.row.status\n )\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n _vm.config.downloadUrl +\n props.row.file.location\n }\n },\n [_vm._v(\"Download\")]\n )\n : _vm._e()\n ],\n 1\n )\n : props.column.label == \"Subtitles\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n [\n \"Archived\",\n \"Downloaded\",\n \"Ignored\",\n \"Skipped\"\n ].includes(props.row.status)\n ? _c(\n \"div\",\n { staticClass: \"subtitles\" },\n _vm._l(props.row.subtitles, function(\n flag\n ) {\n return _c(\"div\", { key: flag }, [\n flag !== \"und\"\n ? _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"{flag}\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row,\n flag\n )\n }\n }\n })\n : _c(\"img\", {\n staticClass:\n \"subtitle-flag\",\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n flag +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: \"flag\",\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n }),\n 0\n )\n : _vm._e()\n ])\n : props.column.label == \"Status\"\n ? _c(\"span\", [\n _c(\n \"div\",\n [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.status) +\n \"\\n \"\n ),\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: {\n quality: props.row.quality\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.status !== \"Unaired\"\n ? _c(\"img\", {\n staticClass: \"addQTip\",\n attrs: {\n title: props.row.watched\n ? \"This episode has been flagged as watched\"\n : \"\",\n src:\n \"images/\" +\n (props.row.watched\n ? \"\"\n : \"not\") +\n \"watched.png\",\n width: \"16\"\n },\n on: {\n click: function($event) {\n return _vm.updateEpisodeWatched(\n props.row,\n !props.row.watched\n )\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ])\n : props.column.field == \"search\"\n ? _c(\n \"span\",\n [\n _c(\"img\", {\n ref: \"search-\" + props.row.slug,\n staticClass: \"epForcedSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n src: \"images/search16.png\",\n height: \"16\",\n alt: _vm.retryDownload(props.row)\n ? \"retry\"\n : \"search\",\n title: _vm.retryDownload(props.row)\n ? \"Retry Download\"\n : \"Forced Seach\"\n },\n on: {\n click: function($event) {\n return _vm.queueSearch(props.row)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"epManualSearch\",\n attrs: {\n id:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n name:\n _vm.show.indexer +\n \"x\" +\n _vm.show.id[_vm.show.indexer] +\n \"x\" +\n props.row.season +\n \"x\" +\n props.row.episode,\n href:\n \"home/snatchSelection?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer] +\n \"&season=\" +\n props.row.season +\n \"&episode=\" +\n props.row.episode\n }\n },\n [\n _c(\"img\", {\n attrs: {\n \"data-ep-manual-search\": \"\",\n src: \"images/manualsearch.png\",\n width: \"16\",\n height: \"16\",\n alt: \"search\",\n title: \"Manual Search\"\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _c(\"img\", {\n attrs: {\n src: \"images/closed_captioning.png\",\n height: \"16\",\n alt: \"search subtitles\",\n title: \"Search Subtitles\"\n },\n on: {\n click: function($event) {\n return _vm.searchSubtitle(\n $event,\n props.row\n )\n }\n }\n })\n ],\n 1\n )\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.formattedRow[props.column.field]\n ) +\n \"\\n \"\n )\n ])\n ]\n }\n },\n {\n key: \"table-column\",\n fn: function(props) {\n return [\n props.column.label == \"Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : props.column.label == \"Scene Abs. #\"\n ? _c(\"span\", [\n _c(\n \"span\",\n {\n staticClass: \"addQTip\",\n attrs: {\n title: \"Scene Absolute episode number\"\n }\n },\n [_vm._v(_vm._s(props.column.label))]\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.column.label) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ],\n null,\n false,\n 1270435715\n )\n })\n : _vm._e()\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-start-backlog-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeBacklogSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-hidden\": \"true\"\n }\n },\n [_vm._v(\"×\")]\n ),\n _vm._v(\" \"),\n _c(\"h4\", { staticClass: \"modal-title\" }, [\n _vm._v(\"Start search?\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [\n _vm._v(\n \"Some episodes have been changed to 'Wanted'. Do you want to trigger a backlog search for these \" +\n _vm._s(_vm.backlogSearchEpisodes.length) +\n \" episode(s)\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search(_vm.backlogSearchEpisodes, \"backlog\")\n _vm.$modal.hide(\"query-start-backlog-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-mark-failed-and-search\",\n height: \"auto\",\n width: \"80%\"\n },\n on: { \"before-open\": _vm.beforeFailedSearchModalClose }\n },\n [\n _c(\"transition\", { attrs: { name: \"modal\" } }, [\n _c(\"div\", { staticClass: \"modal-mask\" }, [\n _c(\"div\", { staticClass: \"modal-wrapper\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _vm._v(\n \"\\n Mark episode as failed and search?\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [_vm._v(\"Starting to search for the episode\")]),\n _vm._v(\" \"),\n _vm.failedSearchEpisode\n ? _c(\"p\", [\n _vm._v(\n \"Would you also like to mark episode \" +\n _vm._s(_vm.failedSearchEpisode.slug) +\n ' as \"failed\"? This will make sure the episode cannot be downloaded again'\n )\n ])\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search([_vm.failedSearchEpisode], \"backlog\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"No\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-success\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n _vm.search([_vm.failedSearchEpisode], \"failed\")\n _vm.$modal.hide(\"query-mark-failed-and-search\")\n }\n }\n },\n [_vm._v(\"Yes\")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-danger\",\n attrs: { type: \"button\", \"data-dismiss\": \"modal\" },\n on: {\n click: function($event) {\n return _vm.$modal.hide(\n \"query-mark-failed-and-search\"\n )\n }\n }\n },\n [_vm._v(\"Cancel\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/display-show.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1489,7 +1489,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-md-12 top-15 displayShow horizontal-scroll table-layout\",\n class: { fanartBackground: _vm.config.fanartBackground }\n },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.hideHistory ? \"Show History\" : \"Hide History\") +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression: \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\"\n }\n })\n ],\n 1\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.provider.name) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1561,7 +1561,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-results-wrapper\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12 top-15 displayShow horizontal-scroll\",\n class: { fanartBackground: _vm.config.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"button-row\" },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Refresh Results\" },\n on: { click: _vm.refreshResults }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Force Search\" },\n on: { click: _vm.forceSearch }\n }),\n _vm._v(\" \"),\n _vm.loading\n ? [\n _c(\"state-switch\", { attrs: { state: \"loading\" } }),\n _vm._v(\" \"),\n _c(\"span\", [_vm._v(_vm._s(_vm.loadingMessage))])\n ]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show.id.slug,\n expression: \"show.id.slug\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.combinedResults,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"pubdate\", type: \"desc\" }\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n styleClass: \"vgt-table condensed\"\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.imageName,\n alt: props.row.provider.name,\n width: \"16\"\n }\n })\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Added\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.dateAdded\n ? _vm.fuzzyParseDateTime(props.row.dateAdded)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Published\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.pubdate\n ? _vm.fuzzyParseDateTime(props.row.pubdate)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Updated\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.time\n ? _vm.fuzzyParseDateTime(props.row.time)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-results-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\n \"div\",\n { staticClass: \"button-row\" },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Refresh Results\" },\n on: { click: _vm.getProviderResults }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Force Search\" },\n on: { click: _vm.forceSearch }\n }),\n _vm._v(\" \"),\n _vm.loading\n ? [\n _c(\"state-switch\", { attrs: { state: \"loading\" } }),\n _vm._v(\" \"),\n _c(\"span\", [_vm._v(_vm._s(_vm.loadingMessage))])\n ]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show.id.slug,\n expression: \"show.id.slug\"\n }\n ],\n ref: \"vgt-show-results\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.combinedResults,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"pubdate\", type: \"desc\" }\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n styleClass: \"vgt-table condensed\"\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.imageName,\n alt: props.row.provider.name,\n width: \"16\"\n }\n })\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Added\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.dateAdded\n ? _vm.fuzzyParseDateTime(\n props.row.dateAdded\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Published\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.pubdate\n ? _vm.fuzzyParseDateTime(props.row.pubdate)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Updated\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.time\n ? _vm.fuzzyParseDateTime(props.row.time)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Snatch\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src: \"images/download.png\",\n width: \"16\",\n height: \"16\",\n alt: \"snatch\",\n title: \"Download selected episode\",\n \"data-identifier\": props.row.identifier\n },\n on: {\n click: function($event) {\n return _vm.snatchResult($event, props.row)\n }\n }\n })\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -4374,7 +4374,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-native-websocket */ \"./node_modules/vue-native-websocket/dist/build.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _modules__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules */ \"./src/store/modules/index.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vuex__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\nconst store = new vuex__WEBPACK_IMPORTED_MODULE_1__[\"Store\"]({\n modules: {\n auth: _modules__WEBPACK_IMPORTED_MODULE_3__[\"auth\"],\n config: _modules__WEBPACK_IMPORTED_MODULE_3__[\"config\"],\n defaults: _modules__WEBPACK_IMPORTED_MODULE_3__[\"defaults\"],\n history: _modules__WEBPACK_IMPORTED_MODULE_3__[\"history\"],\n notifications: _modules__WEBPACK_IMPORTED_MODULE_3__[\"notifications\"],\n provider: _modules__WEBPACK_IMPORTED_MODULE_3__[\"provider\"],\n search: _modules__WEBPACK_IMPORTED_MODULE_3__[\"search\"],\n shows: _modules__WEBPACK_IMPORTED_MODULE_3__[\"shows\"],\n socket: _modules__WEBPACK_IMPORTED_MODULE_3__[\"socket\"],\n stats: _modules__WEBPACK_IMPORTED_MODULE_3__[\"stats\"]\n },\n state: {},\n mutations: {},\n getters: {},\n actions: {}\n}); // Keep as a non-arrow function for `this` context.\n\nconst passToStoreHandler = function (eventName, event, next) {\n const target = eventName.toUpperCase();\n const eventData = event.data;\n\n if (target === 'SOCKET_ONMESSAGE') {\n const message = JSON.parse(eventData);\n const {\n data,\n event\n } = message; // Show the notification to the user\n\n if (event === 'notification') {\n const {\n body,\n hash,\n type,\n title\n } = data;\n window.displayNotification(type, title, body, hash);\n } else if (event === 'configUpdated') {\n const {\n section,\n config\n } = data;\n this.store.dispatch('updateConfig', {\n section,\n config\n });\n } else if (event === 'showUpdated') {\n this.store.dispatch('updateShow', data);\n } else if (event === 'addManualSearchResult') {\n this.store.dispatch('addManualSearchResult', data);\n } else if (event === 'QueueItemUpdate') {\n this.store.dispatch('updateQueueItem', data);\n } else {\n window.displayNotification('info', event, data);\n }\n } // Resume normal 'passToStore' handling\n\n\n next(eventName, event);\n};\n\nconst websocketUrl = (() => {\n const {\n protocol,\n host\n } = window.location;\n const proto = protocol === 'https:' ? 'wss:' : 'ws:';\n const WSMessageUrl = '/ui';\n const webRoot = document.body.getAttribute('web-root');\n return `${proto}//${host}${webRoot}/ws${WSMessageUrl}`;\n})();\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default.a, websocketUrl, {\n store,\n format: 'json',\n reconnection: true,\n // (Boolean) whether to reconnect automatically (false)\n reconnectionAttempts: 2,\n // (Number) number of reconnection attempts before giving up (Infinity),\n reconnectionDelay: 1000,\n // (Number) how long to initially wait before attempting a new (1000)\n passToStoreHandler,\n // (Function|) Handler for events triggered by the WebSocket (false)\n mutations: {\n SOCKET_ONOPEN: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONOPEN\"],\n SOCKET_ONCLOSE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONCLOSE\"],\n SOCKET_ONERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONERROR\"],\n SOCKET_ONMESSAGE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONMESSAGE\"],\n SOCKET_RECONNECT: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT\"],\n SOCKET_RECONNECT_ERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT_ERROR\"]\n }\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (store);\n\n//# sourceURL=webpack:///./src/store/index.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 vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-native-websocket */ \"./node_modules/vue-native-websocket/dist/build.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _modules__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules */ \"./src/store/modules/index.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vuex__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\nconst store = new vuex__WEBPACK_IMPORTED_MODULE_1__[\"Store\"]({\n modules: {\n auth: _modules__WEBPACK_IMPORTED_MODULE_3__[\"auth\"],\n config: _modules__WEBPACK_IMPORTED_MODULE_3__[\"config\"],\n defaults: _modules__WEBPACK_IMPORTED_MODULE_3__[\"defaults\"],\n history: _modules__WEBPACK_IMPORTED_MODULE_3__[\"history\"],\n notifications: _modules__WEBPACK_IMPORTED_MODULE_3__[\"notifications\"],\n provider: _modules__WEBPACK_IMPORTED_MODULE_3__[\"provider\"],\n search: _modules__WEBPACK_IMPORTED_MODULE_3__[\"search\"],\n shows: _modules__WEBPACK_IMPORTED_MODULE_3__[\"shows\"],\n socket: _modules__WEBPACK_IMPORTED_MODULE_3__[\"socket\"],\n stats: _modules__WEBPACK_IMPORTED_MODULE_3__[\"stats\"]\n },\n state: {},\n mutations: {},\n getters: {},\n actions: {}\n}); // Keep as a non-arrow function for `this` context.\n\nconst passToStoreHandler = function (eventName, event, next) {\n const target = eventName.toUpperCase();\n const eventData = event.data;\n\n if (target === 'SOCKET_ONMESSAGE') {\n const message = JSON.parse(eventData);\n const {\n data,\n event\n } = message; // Show the notification to the user\n\n if (event === 'notification') {\n const {\n body,\n hash,\n type,\n title\n } = data;\n window.displayNotification(type, title, body, hash);\n } else if (event === 'configUpdated') {\n const {\n section,\n config\n } = data;\n this.store.dispatch('updateConfig', {\n section,\n config\n });\n } else if (event === 'showUpdated' || event === 'showAdded') {\n this.store.dispatch('updateShow', data);\n } else if (event === 'addManualSearchResult') {\n this.store.dispatch('addManualSearchResult', data);\n } else if (event === 'QueueItemUpdate') {\n this.store.dispatch('updateQueueItem', data);\n } else {\n window.displayNotification('info', event, data);\n }\n } // Resume normal 'passToStore' handling\n\n\n next(eventName, event);\n};\n\nconst websocketUrl = (() => {\n const {\n protocol,\n host\n } = window.location;\n const proto = protocol === 'https:' ? 'wss:' : 'ws:';\n const WSMessageUrl = '/ui';\n const webRoot = document.body.getAttribute('web-root');\n return `${proto}//${host}${webRoot}/ws${WSMessageUrl}`;\n})();\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vue_native_websocket__WEBPACK_IMPORTED_MODULE_2___default.a, websocketUrl, {\n store,\n format: 'json',\n reconnection: true,\n // (Boolean) whether to reconnect automatically (false)\n reconnectionAttempts: 2,\n // (Number) number of reconnection attempts before giving up (Infinity),\n reconnectionDelay: 1000,\n // (Number) how long to initially wait before attempting a new (1000)\n passToStoreHandler,\n // (Function|) Handler for events triggered by the WebSocket (false)\n mutations: {\n SOCKET_ONOPEN: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONOPEN\"],\n SOCKET_ONCLOSE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONCLOSE\"],\n SOCKET_ONERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONERROR\"],\n SOCKET_ONMESSAGE: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_ONMESSAGE\"],\n SOCKET_RECONNECT: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT\"],\n SOCKET_RECONNECT_ERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_4__[\"SOCKET_RECONNECT_ERROR\"]\n }\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (store);\n\n//# sourceURL=webpack:///./src/store/index.js?"); /***/ }), @@ -4446,7 +4446,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /***/ (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/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../api */ \"./src/api.js\");\n/* harmony import */ var date_fns_format__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! date-fns/format */ \"./node_modules/date-fns/esm/format/index.js\");\n/* harmony import */ var date_fns_parseISO__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! date-fns/parseISO */ \"./node_modules/date-fns/esm/parseISO/index.js\");\n/* harmony import */ var javascript_time_ago__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! javascript-time-ago */ \"./node_modules/javascript-time-ago/index.js\");\n/* harmony import */ var javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! javascript-time-ago/locale/en */ \"./node_modules/javascript-time-ago/locale/en/index.js\");\n/* harmony import */ var javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5__);\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 // Add locale-specific relative date/time formatting rules.\n\njavascript_time_ago__WEBPACK_IMPORTED_MODULE_4__[\"default\"].addLocale(javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5___default.a);\nconst state = {\n show: {\n specials: null,\n showListOrder: [],\n pagination: {\n enable: null\n }\n },\n home: null,\n selectedRootIndex: null,\n history: null,\n historyLimit: null,\n schedule: null,\n wide: null,\n timezoneDisplay: null,\n timeStyle: null,\n dateStyle: null,\n themeName: null,\n animeSplitHomeInTabs: null,\n animeSplitHome: null,\n fanartBackground: null,\n fanartBackgroundOpacity: null,\n trimZero: null,\n sortArticle: null,\n fuzzyDating: null,\n comingEps: {\n missedRange: null,\n sort: null,\n displayPaused: null,\n layout: null\n },\n backlogOverview: {\n status: null,\n period: null\n },\n showFilterByName: '',\n posterSortdir: null,\n posterSortby: null,\n posterSize: 188,\n currentShowTab: null\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"]](state, {\n section,\n config\n }) {\n if (section === 'layout') {\n state = Object.assign(state, config);\n }\n }\n\n};\nconst getters = {\n fuzzyParseDateTime: state => airDate => {\n const timeAgo = new javascript_time_ago__WEBPACK_IMPORTED_MODULE_4__[\"default\"]('en-US');\n const {\n dateStyle,\n fuzzyDating,\n timeStyle\n } = state;\n\n if (!airDate) {\n return '';\n }\n\n if (fuzzyDating) {\n return timeAgo.format(new Date(airDate));\n }\n\n if (dateStyle === '%x') {\n return new Date(airDate).toLocaleString();\n }\n\n const fdate = Object(date_fns_parseISO__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(airDate);\n return Object(date_fns_format__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(fdate, Object(_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"convertDateFormat\"])(`${dateStyle} ${timeStyle}`));\n },\n getShowFilterByName: state => {\n return state.showFilterByName;\n }\n};\nconst actions = {\n setLayout(context, {\n page,\n layout\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n [page]: layout\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n [page]: layout\n }\n });\n });\n },\n\n setTheme(context, {\n themeName\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n themeName\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n themeName\n }\n });\n });\n },\n\n setSpecials(context, specials) {\n const {\n commit,\n state\n } = context;\n const show = Object.assign({}, state.show);\n show.specials = specials;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n show\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n show\n }\n });\n });\n },\n\n setShowFilterByName(context, {\n filter\n }) {\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n showFilterByName: filter\n }\n });\n },\n\n setPosterSortBy(context, {\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n posterSortby: value\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n posterSortby: value\n }\n });\n });\n },\n\n setPosterSortDir(context, {\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n posterSortdir: value\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n posterSortdir: value\n }\n });\n });\n },\n\n setPosterSize(context, {\n posterSize\n }) {\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n posterSize\n }\n });\n },\n\n setShowListOrder(context, {\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n show: {\n showListOrder: value\n }\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n show: {\n showListOrder: value\n }\n }\n });\n });\n },\n\n setStoreLayout(context, {\n key,\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n [key]: value\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n [key]: value\n }\n });\n });\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/config/layout.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/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../api */ \"./src/api.js\");\n/* harmony import */ var date_fns_format__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! date-fns/format */ \"./node_modules/date-fns/esm/format/index.js\");\n/* harmony import */ var date_fns_parseISO__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! date-fns/parseISO */ \"./node_modules/date-fns/esm/parseISO/index.js\");\n/* harmony import */ var javascript_time_ago__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! javascript-time-ago */ \"./node_modules/javascript-time-ago/index.js\");\n/* harmony import */ var javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! javascript-time-ago/locale/en */ \"./node_modules/javascript-time-ago/locale/en/index.js\");\n/* harmony import */ var javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5__);\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 // Add locale-specific relative date/time formatting rules.\n\njavascript_time_ago__WEBPACK_IMPORTED_MODULE_4__[\"default\"].addLocale(javascript_time_ago_locale_en__WEBPACK_IMPORTED_MODULE_5___default.a);\nconst state = {\n show: {\n specials: null,\n showListOrder: [],\n pagination: {\n enable: null\n }\n },\n home: null,\n selectedRootIndex: null,\n history: null,\n historyLimit: null,\n schedule: null,\n wide: null,\n timezoneDisplay: null,\n timeStyle: null,\n dateStyle: null,\n themeName: null,\n animeSplitHomeInTabs: null,\n animeSplitHome: null,\n fanartBackground: null,\n fanartBackgroundOpacity: null,\n trimZero: null,\n sortArticle: null,\n fuzzyDating: null,\n comingEps: {\n missedRange: null,\n sort: null,\n displayPaused: null,\n layout: null\n },\n backlogOverview: {\n status: null,\n period: null\n },\n showFilterByName: '',\n posterSortdir: null,\n posterSortby: null,\n posterSize: 188,\n currentShowTab: null\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"]](state, {\n section,\n config\n }) {\n if (section === 'layout') {\n state = Object.assign(state, config);\n }\n }\n\n};\nconst getters = {\n fuzzyParseDateTime: state => airDate => {\n const timeAgo = new javascript_time_ago__WEBPACK_IMPORTED_MODULE_4__[\"default\"]('en-US');\n const {\n dateStyle,\n fuzzyDating,\n timeStyle\n } = state;\n\n if (!airDate) {\n return '';\n }\n\n if (fuzzyDating) {\n return timeAgo.format(new Date(airDate));\n }\n\n if (dateStyle === '%x') {\n return new Date(airDate).toLocaleString();\n }\n\n const fdate = Object(date_fns_parseISO__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(airDate);\n return Object(date_fns_format__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(fdate, Object(_utils_core__WEBPACK_IMPORTED_MODULE_6__[\"convertDateFormat\"])(`${dateStyle} ${timeStyle}`));\n },\n getShowFilterByName: state => {\n return state.showFilterByName;\n }\n};\nconst actions = {\n setLayout(context, {\n page,\n layout\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n [page]: layout\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n [page]: layout\n }\n });\n });\n },\n\n setTheme(context, {\n themeName\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n themeName\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n themeName\n }\n });\n });\n },\n\n setSpecials(context, specials) {\n const {\n commit,\n state\n } = context;\n const show = Object.assign({}, state.show);\n show.specials = specials;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n show\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n show\n }\n });\n });\n },\n\n setShowFilterByName(context, {\n filter\n }) {\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n showFilterByName: filter\n }\n });\n },\n\n setPosterSortBy(context, {\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n posterSortby: value\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n posterSortby: value\n }\n });\n });\n },\n\n setPosterSortDir(context, {\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n posterSortdir: value\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n posterSortdir: value\n }\n });\n });\n },\n\n setPosterSize(context, {\n posterSize\n }) {\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n posterSize\n }\n });\n },\n\n setShowListOrder(context, {\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n show: {\n showListOrder: value\n }\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n show: {\n showListOrder: value\n }\n }\n });\n });\n },\n\n setStoreLayout(context, {\n key,\n value\n }) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch('config/main', {\n layout: {\n [key]: value\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n [key]: value\n }\n });\n });\n },\n\n setCurrentTab(context, value) {\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_0__[\"ADD_CONFIG\"], {\n section: 'layout',\n config: {\n currentShowTab: value\n }\n });\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/config/layout.js?"); /***/ }), @@ -4806,7 +4806,7 @@ eval("__webpack_require__.r(__webpack_exports__);\nconst state = {\n show: {\n /***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n history: [],\n page: 0,\n showHistory: {},\n episodeHistory: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"]](state, history) {\n // Update state\n state.history.push(...history);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_HISTORY\"]](state, {\n showSlug,\n history\n }) {\n // Keep an array of shows, with their history\n // Maybe we can just check the last id. And if the id's are newer, add them. Less fancy, much more fast.\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.showHistory, showSlug, history);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE_HISTORY\"]](state, {\n showSlug,\n episodeSlug,\n history\n }) {\n // Keep an object of shows, with their history per episode\n // Example: {tvdb1234: {s01e01: [history]}}\n if (!Object.keys(state.episodeHistory).includes(showSlug)) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.episodeHistory, showSlug, {});\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.episodeHistory[showSlug], episodeSlug, history);\n }\n\n};\nconst getters = {\n getShowHistoryBySlug: state => showSlug => state.showHistory[showSlug],\n getLastReleaseName: state => ({\n showSlug,\n episodeSlug\n }) => {\n if (state.episodeHistory[showSlug] !== undefined) {\n if (state.episodeHistory[showSlug][episodeSlug] !== undefined) {\n if (state.episodeHistory[showSlug][episodeSlug].length === 1) {\n return state.episodeHistory[showSlug][episodeSlug][0].resource;\n }\n\n const filteredHistory = state.episodeHistory[showSlug][episodeSlug].sort((a, b) => (a.actionDate - b.actionDate) * -1).filter(ep => ['Snatched', 'Downloaded'].includes(ep.statusName) && ep.resource !== '');\n\n if (filteredHistory.length > 0) {\n return filteredHistory[0].resource;\n }\n }\n }\n },\n getEpisodeHistory: state => ({\n showSlug,\n episodeSlug\n }) => {\n if (state.episodeHistory[showSlug] === undefined) {\n return [];\n }\n\n return state.episodeHistory[showSlug][episodeSlug] || [];\n },\n getSeasonHistory: state => ({\n showSlug\n }) => {\n if (state.episodeHistory[showSlug] === undefined) {\n return [];\n }\n\n return Object.keys(state.episodeHistory[showSlug]).reduce((r, k) => {\n return r.concat(state.episodeHistory[showSlug][k]);\n }, []);\n }\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show history from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n async getShowHistory(context, {\n slug\n }) {\n const {\n commit\n } = context;\n const response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/history/${slug}`);\n\n if (response.data.length > 0) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_HISTORY\"], {\n showSlug: slug,\n history: response.data\n });\n }\n },\n\n /**\n * Get history from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n async getHistory(context) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit\n };\n let lastPage = false;\n let response = null;\n\n while (!lastPage) {\n state.page += 1;\n params.page = state.page;\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/history', {\n params\n }); // eslint-disable-line no-await-in-loop\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"], response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n }\n },\n\n /**\n * Get episode history from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n async getShowEpisodeHistory(context, {\n showSlug,\n episodeSlug\n }) {\n const {\n commit\n } = context;\n\n try {\n const response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/history/${showSlug}/episode/${episodeSlug}`);\n\n if (response.data.length > 0) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE_HISTORY\"], {\n showSlug,\n episodeSlug,\n history: response.data\n });\n }\n } catch {\n console.warn(`No episode history found for show ${showSlug} and episode ${episodeSlug}`);\n }\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/history.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n history: [],\n page: 0,\n showHistory: {},\n episodeHistory: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"]](state, history) {\n // Update state\n state.history.push(...history);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_HISTORY\"]](state, {\n showSlug,\n history\n }) {\n // Keep an array of shows, with their history\n // Maybe we can just check the last id. And if the id's are newer, add them. Less fancy, much more fast.\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.showHistory, showSlug, history);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE_HISTORY\"]](state, {\n showSlug,\n episodeSlug,\n history\n }) {\n // Keep an object of shows, with their history per episode\n // Example: {tvdb1234: {s01e01: [history]}}\n if (!Object.keys(state.episodeHistory).includes(showSlug)) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.episodeHistory, showSlug, {});\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.episodeHistory[showSlug], episodeSlug, history);\n }\n\n};\nconst getters = {\n getShowHistoryBySlug: state => showSlug => state.showHistory[showSlug],\n getLastReleaseName: state => ({\n showSlug,\n episodeSlug\n }) => {\n if (state.episodeHistory[showSlug] !== undefined) {\n if (state.episodeHistory[showSlug][episodeSlug] !== undefined) {\n if (state.episodeHistory[showSlug][episodeSlug].length === 1) {\n return state.episodeHistory[showSlug][episodeSlug][0].resource;\n }\n\n const filteredHistory = state.episodeHistory[showSlug][episodeSlug].sort((a, b) => (a.actionDate - b.actionDate) * -1).filter(ep => ['Snatched', 'Downloaded'].includes(ep.statusName) && ep.resource !== '');\n\n if (filteredHistory.length > 0) {\n return filteredHistory[0].resource;\n }\n }\n }\n },\n getEpisodeHistory: state => ({\n showSlug,\n episodeSlug\n }) => {\n if (state.episodeHistory[showSlug] === undefined) {\n return [];\n }\n\n return state.episodeHistory[showSlug][episodeSlug] || [];\n },\n getSeasonHistory: state => ({\n showSlug\n }) => {\n if (state.episodeHistory[showSlug] === undefined) {\n return [];\n }\n\n return Object.keys(state.episodeHistory[showSlug]).reduce((r, k) => {\n return r.concat(state.episodeHistory[showSlug][k]);\n }, []);\n }\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show history from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n async getShowHistory(context, {\n slug\n }) {\n const {\n commit\n } = context;\n const response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/history/${slug}`);\n\n if (response.data.length > 0) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_HISTORY\"], {\n showSlug: slug,\n history: response.data\n });\n }\n },\n\n /**\n * Get history from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n async getHistory(context) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit\n };\n let lastPage = false;\n let response = null;\n\n while (!lastPage) {\n state.page += 1;\n params.page = state.page;\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/history', {\n params\n }); // eslint-disable-line no-await-in-loop\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_HISTORY\"], response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n }\n },\n\n /**\n * Get episode history from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n getShowEpisodeHistory(context, {\n showSlug,\n episodeSlug\n }) {\n return new Promise(resolve => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/history/${showSlug}/episode/${episodeSlug}`).then(response => {\n if (response.data.length > 0) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE_HISTORY\"], {\n showSlug,\n episodeSlug,\n history: response.data\n });\n }\n\n resolve();\n }).catch(() => {\n console.warn(`No episode history found for show ${showSlug} and episode ${episodeSlug}`);\n });\n });\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/history.js?"); /***/ }), @@ -4842,7 +4842,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n let page = 0;\n let lastPage = false;\n let response = null;\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n } // Empty the providers cache\n\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n }); // eslint-disable-line no-await-in-loop\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n }\n }\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n let page = 0;\n let lastPage = false;\n let response = null;\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n } // Empty the providers cache\n\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n }); // eslint-disable-line no-await-in-loop\n\n return new Promise(resolve => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n\n resolve();\n });\n }\n }\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.js?"); /***/ }), From abe78b19f75b5faee7a3e34741bda29e76716fde Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sun, 7 Jun 2020 19:06:27 +0200 Subject: [PATCH 39/87] Add show to store, when added in backend. Use websocket. --- medusa/show_queue.py | 4 ++++ themes-default/slim/src/store/index.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/medusa/show_queue.py b/medusa/show_queue.py index a8cc2f20fc..085ec83608 100644 --- a/medusa/show_queue.py +++ b/medusa/show_queue.py @@ -31,6 +31,7 @@ notifiers, scene_numbering, ui, + ws, ) from medusa.black_and_white_list import BlackAndWhiteList from medusa.common import WANTED, statusStrings @@ -659,6 +660,9 @@ def run(self): ) log.error(traceback.format_exc()) + # Send ws update to client + ws.Message('showAdded', self.show.to_json(detailed=False)).push() + self.finish() def _finishEarly(self): diff --git a/themes-default/slim/src/store/index.js b/themes-default/slim/src/store/index.js index 83e1ca9112..5aa464f237 100644 --- a/themes-default/slim/src/store/index.js +++ b/themes-default/slim/src/store/index.js @@ -59,7 +59,7 @@ const passToStoreHandler = function(eventName, event, next) { } else if (event === 'configUpdated') { const { section, config } = data; this.store.dispatch('updateConfig', { section, config }); - } else if (event === 'showUpdated') { + } else if (event === 'showUpdated' || event === 'showAdded') { this.store.dispatch('updateShow', data); } else if (event === 'addManualSearchResult') { this.store.dispatch('addManualSearchResult', data); From 1ae6c951134d734ddb2b935c18aa38fa78a49f85 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sun, 7 Jun 2020 19:15:52 +0200 Subject: [PATCH 40/87] Remove comments. * Fix the routes in handler.py. * Added a reminder TODO. --- medusa/server/web/home/handler.py | 119 +------ .../slim/src/components/snatch-selection.vue | 291 +----------------- themes/dark/assets/js/medusa-runtime.js | 2 +- themes/light/assets/js/medusa-runtime.js | 2 +- 4 files changed, 12 insertions(+), 402 deletions(-) diff --git a/medusa/server/web/home/handler.py b/medusa/server/web/home/handler.py index e47e6112d6..ae8cf0b3f2 100644 --- a/medusa/server/web/home/handler.py +++ b/medusa/server/web/home/handler.py @@ -723,7 +723,11 @@ def getSeasonSceneExceptions(self, indexername, seriesid): }) def displayShow(self, indexername=None, seriesid=None, ): - # @TODO: Remove all this code. And track visited shows, through the Vue router. + """ + Render the home page. + + [Converted to VueRouter] + """ try: indexer_id = indexer_name_to_id(indexername) series_obj = Show.find_by_id(app.showList, indexer_id, seriesid) @@ -735,25 +739,6 @@ def displayShow(self, indexername=None, seriesid=None, ): t = PageTemplate(rh=self, filename='index.mako') - indexer_id = int(series_obj.indexer) - series_id = int(series_obj.series_id) - - # Delete any previous occurrances - indexer_name = indexer_id_to_name(indexer_id) - for index, recentShow in enumerate(app.SHOWS_RECENT): - if recentShow['indexerName'] == indexer_name and recentShow['showId'] == series_id: - del app.SHOWS_RECENT[index] - - # Only track 5 most recent shows - del app.SHOWS_RECENT[4:] - - # Insert most recent show - app.SHOWS_RECENT.insert(0, { - 'indexerName': indexer_name, - 'showId': series_id, - 'name': series_obj.name, - }) - return t.render( controller='home', action='displayShow', ) @@ -899,8 +884,11 @@ def manualSearchCheckCache(self, indexername, seriesid, season=None, episode=Non def snatchSelection(self, indexername, seriesid, season=None, episode=None, manual_search_type='episode', perform_search=0, down_cur_quality=0, show_all_results=0): - """ The view with results for the manual selected show/episode """ + """ + Render the home page. + [Converted to VueRouter] + """ # @TODO: add more comprehensive show validation try: indexer_id = indexer_name_to_id(indexername) @@ -911,97 +899,8 @@ def snatchSelection(self, indexername, seriesid, season=None, episode=None, manu if series_obj is None: return self._genericMessage('Error', 'Show not in show list') - # Retrieve cache results from providers - search_show = {'series': series_obj, 'season': season, 'episode': episode, 'manual_search_type': manual_search_type} - - provider_results = get_provider_cache_results(series_obj, perform_search=perform_search, - show_all_results=show_all_results, **search_show) - t = PageTemplate(rh=self, filename='index.mako') - series_obj.exceptions = get_scene_exceptions(series_obj) - - indexer_id = int(series_obj.indexer) - series_id = int(series_obj.series_id) - - # Delete any previous occurrances - indexer_name = indexer_id_to_name(indexer_id) - for index, recentShow in enumerate(app.SHOWS_RECENT): - if recentShow['indexerName'] == indexer_name and recentShow['showId'] == series_id: - del app.SHOWS_RECENT[index] - - # Only track 5 most recent shows - del app.SHOWS_RECENT[4:] - - # Insert most recent show - app.SHOWS_RECENT.insert(0, { - 'indexerName': indexer_name, - 'showId': series_id, - 'name': series_obj.name, - }) - - # episode_history = [] - # try: - # main_db_con = db.DBConnection() - # episode_status_result = main_db_con.select( - # 'SELECT date, action, quality, provider, resource, size ' - # 'FROM history ' - # 'WHERE indexer_id = ? ' - # 'AND showid = ? ' - # 'AND season = ? ' - # 'AND episode = ? ' - # 'AND action in (?, ?, ?, ?, ?) ' - # 'ORDER BY date DESC', - # [indexer_id, series_id, season, episode, - # DOWNLOADED, SNATCHED, SNATCHED_PROPER, SNATCHED_BEST, FAILED] - # ) - # episode_history = episode_status_result - # for i in episode_history: - # i['status'] = i['action'] - # i['action_date'] = sbdatetime.sbfdatetime(datetime.strptime(text_type(i['date']), History.date_format), show_seconds=True) - # i['resource_file'] = os.path.basename(i['resource']) - # i['pretty_size'] = pretty_file_size(i['size']) if i['size'] > -1 else 'N/A' - # i['status_name'] = statusStrings[i['status']] - # provider = None - # if i['status'] == DOWNLOADED: - # i['status_color_style'] = 'downloaded' - # elif i['status'] in (SNATCHED, SNATCHED_PROPER, SNATCHED_BEST): - # i['status_color_style'] = 'snatched' - # provider = providers.get_provider_class(GenericProvider.make_id(i['provider'])) - # elif i['status'] == FAILED: - # i['status_color_style'] = 'failed' - # provider = providers.get_provider_class(GenericProvider.make_id(i['provider'])) - # if provider is not None: - # i['provider_name'] = provider.name - # i['provider_img_link'] = 'images/providers/' + provider.image_name() - # else: - # i['provider_name'] = i['provider'] if i['provider'] != '-1' else 'Unknown' - # i['provider_img_link'] = '' - - # # Compare manual search results with history and set status - # for provider_result in provider_results['found_items']: - # failed_statuses = [FAILED, ] - # snatched_statuses = [SNATCHED, SNATCHED_PROPER, SNATCHED_BEST] - # if any([item for item in episode_history - # if all([prepare_failed_name(provider_result['name']) in item['resource'], - # item['provider'] in (provider_result['provider'], provider_result['release_group'],), - # item['status'] in failed_statuses]) - # ]): - # provider_result['status_highlight'] = 'failed' - # elif any([item for item in episode_history - # if all([provider_result['name'] in item['resource'], - # item['provider'] in provider_result['provider'], - # item['status'] in snatched_statuses, - # item['size'] == provider_result['size']]) - # ]): - # provider_result['status_highlight'] = 'snatched' - # else: - # provider_result['status_highlight'] = '' - - # # TODO: Remove the catchall, make sure we only catch expected exceptions! - # except Exception as msg: - # logger.log("Couldn't read latest episode status. Error: {error}".format(error=msg)) - return t.render( controller='home', action='snatchSelection' ) diff --git a/themes-default/slim/src/components/snatch-selection.vue b/themes-default/slim/src/components/snatch-selection.vue index 53efcba61a..beca111088 100644 --- a/themes-default/slim/src/components/snatch-selection.vue +++ b/themes-default/slim/src/components/snatch-selection.vue @@ -79,12 +79,7 @@ export default { getShow: 'getShow', // Map `this.getShow()` to `this.$store.dispatch('getShow')` getHistory: 'getHistory' }), - // /** - // * Attaches IMDB tooltip, - // */ - // reflowLayout() { - // attachImdbTooltip(); // eslint-disable-line no-undef - // }, + // TODO: Move this to show-results! getReleaseNameClasses(name) { const { effectiveIgnored, effectiveRequired, search, show } = this; const classes = []; @@ -107,19 +102,6 @@ export default { classes.push('global-undesired'); } - /** Disabled for now. Because global + series ignored can be concatenated or excluded. So it's not that simple to color them. */ - // if (this.show.config.release.ignoredWords.map( word => { - // return name.toLowerCase().includes(word.toLowerCase()); - // }).filter(x => x === true).length) { - // classes.push('show-ignored'); - // } - - // if (this.show.config.release.requiredWords.map( word => { - // return name.toLowerCase().includes(word.toLowerCase()); - // }).filter(x => x === true).length) { - // classes.push('show-required'); - // } - return classes.join(' '); } }, @@ -138,281 +120,10 @@ export default { id }); - // getHistory(); - // We need the show info, so let's get it. if (!show || !show.id.slug) { getShow({ id, indexer, detailed: false }); } - - // this.$watch('show', () => { - // this.$nextTick(() => this.reflowLayout()); - // }); - - // ['load', 'resize'].map(event => { - // return window.addEventListener(event, () => { - // this.reflowLayout(); - // }); - // }); - - const updateSpinner = function(message, showSpinner) { - // Get spinner object as needed - const spinner = $('#searchNotification'); - if (showSpinner) { - message = ' ' + message; - } - $(spinner).empty().append(message); - }; - - // // Check the previous status of the history table, for hidden or shown, through the data attribute - // // data-history-toggle-hidden - // function toggleHistoryTable() { // eslint-disable-line no-unused-vars - // // Get previous state which was saved on the wrapper - // const showOrHide = $('#wrapper').attr('data-history-toggle'); - // $('#historydata').collapse(showOrHide); - // } - - // $.fn.loadContainer = function(path, loadingTxt, errorTxt, callback) { - // updateSpinner(loadingTxt); - // $('#manualSearchMeta').load(path + ' #manualSearchMeta meta'); - // $(this).load(path + ' #manualSearchTbody tr', (response, status) => { - // if (status === 'error') { - // updateSpinner(errorTxt, false); - // } - // if (typeof callback !== 'undefined') { - // callback(); - // } - // }); - // }; - - // // Click event for the download button for snatching a result - // $(document.body).on('click', '.epManualSearch', event => { - // event.preventDefault(); - // const link = event.currentTarget; - // $(link).children('img').prop('src', 'images/loading16.gif'); - // $.getJSON(event.currentTarget.href, data => { - // if (data.result === 'success') { - // $(link).children('img').prop('src', 'images/save.png'); - // } else { - // $(link).children('img').prop('src', 'images/no16.png'); - // } - // }); - // }); - - // function initTableSorter(table) { - // // Nasty hack to re-initialize tablesorter after refresh - // $(table).tablesorter({ - // widgets: ['saveSort', 'stickyHeaders', 'columnSelector', 'filter'], - // widgetOptions: { - // filter_columnFilters: true, // eslint-disable-line camelcase - // filter_hideFilters: true, // eslint-disable-line camelcase - // filter_saveFilters: true, // eslint-disable-line camelcase - // columnSelector_saveColumns: true, // eslint-disable-line camelcase - // columnSelector_layout: '', // eslint-disable-line camelcase - // columnSelector_mediaquery: false, // eslint-disable-line camelcase - // columnSelector_cssChecked: 'checked' // eslint-disable-line camelcase - // }, - // textExtraction: (function() { - // return { - // // 2: Provider - // 2(node) { - // return $(node).find('img').attr('title'); - // }, - // // 6: The size column needs an explicit field for the filtering on raw size. - // 6(node) { - // return node.getAttribute('data-size'); - // }, - // // 9: Published date - // 9(node) { - // return node.getAttribute('data-datetime'); - // }, - // // 10: Added date - // 10(node) { - // return node.getAttribute('data-datetime'); - // } - // }; - // })(), - // headers: { - // 9: { sorter: 'realISODate' }, // Published - // 10: { sorter: 'realISODate' }, // Added - // 11: { sorter: false, parser: false } // Snatch link - // } - // }); - // } - - // function checkCacheUpdates(repeat) { - // let pollInterval = 5000; - // repeat = repeat || true; - - // const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name'); - // const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id'); - // const season = $('meta[data-last-prov-updates]').attr('data-season'); - // const episode = $('meta[data-last-prov-updates]').attr('data-episode'); - // const data = $('meta[data-last-prov-updates]').data('last-prov-updates'); - // const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type'); - - // const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => { - // return checkIsTrue; - // }); - - // if (!checkParams) { - // console.log( - // 'Something went wrong in getting the paramaters from dom.' + - // ` indexerName: ${indexerName}, seriesId: ${seriesId}, season: ${season}, episode: ${episode}` - // ); - // return; - // } - - // let urlParams = '?indexername=' + indexerName + '&seriesid=' + seriesId + '&season=' + season + '&episode=' + episode; - - // if (manualSearchType === 'season') { - // urlParams += '&manual_search_type=' + manualSearchType; - // } - - // if (!$.isNumeric(seriesId) || !$.isNumeric(season) || !$.isNumeric(episode)) { - // setTimeout(() => { - // checkCacheUpdates(true); - // }, 200); - // } - - // $.ajax({ - // url: 'home/manualSearchCheckCache' + urlParams, - // type: 'GET', - // data, - // contentType: 'application/json', - // error() { - // // Repeat = false; - // console.log('Error occurred!!'); - // $('.manualSearchButton').removeAttr('disabled'); - // }, - // complete() { - // if (repeat) { - // setTimeout(checkCacheUpdates, pollInterval); - // } - // }, - // timeout: 15000 // Timeout after 15s - // }).done(data => { - // // @TODO: Combine the lower if statements - // if (data === '') { - // updateSpinner('Search finished', false); - // $('.manualSearchButton').removeAttr('disabled'); - // repeat = false; - // } - - // if (data.result === 'refresh') { - // window.location.reload(); - // updateSpinner('Refreshed results...', true); - // } - // if (data.result === 'searching') { - // // Ep is searched, you will get a results any minute now - // pollInterval = 5000; - // $('.manualSearchButton').prop('disabled', true); - // updateSpinner('The episode is being searched, please wait......', true); - // } - // if (data.result === 'queued') { - // // Ep is queued, this might take some time to get results - // pollInterval = 7000; - // $('.manualSearchButton').prop('disabled', true); - // updateSpinner('The episode has been queued, because another search is taking place. please wait..', true); - // } - // if (data.result === 'finished') { - // // Ep search is finished - // updateSpinner('Search finished', false); - // $('.manualSearchButton').removeAttr('disabled'); - // repeat = false; - // $('#srchresults').trigger('update', true); - // $('[datetime]').timeago(); - // } - // if (data.result === 'error') { - // // Ep search is finished but with an error - // console.log('Probably tried to call manualSelectCheckCache, while page was being refreshed.'); - // $('.manualSearchButton').removeAttr('disabled'); - // repeat = true; - // } - // }); - // } - - // setTimeout(checkCacheUpdates, 2000); - - // // Click event for the reload results and force search buttons - // $(document.body).on('click', '.manualSearchButton', event => { - // event.preventDefault(); - // $('.manualSearchButton').prop('disabled', true); - // const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name'); - // const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id'); - // const season = $('meta[data-last-prov-updates]').attr('data-season'); - // const episode = $('meta[data-last-prov-updates]').attr('data-episode'); - // const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type'); - // const forceSearch = $(event.currentTarget).attr('data-force-search'); - - // const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => { - // return checkIsTrue; - // }); - - // if (!checkParams) { - // console.log( - // 'Something went wrong in getting the paramaters from dom.' + - // ` indexerName: ${indexerName}, seriesId: ${seriesId}, season: ${season}, episode: ${episode}` - // ); - // return; - // } - - // if ($.isNumeric(seriesId) && $.isNumeric(season) && $.isNumeric(episode)) { - // updateSpinner('Started a forced manual search...', true); - // $.getJSON('home/snatchSelection', { - // indexername: indexerName, - // seriesid: seriesId, - // season, - // episode, - // manual_search_type: manualSearchType, // eslint-disable-line camelcase - // perform_search: forceSearch // eslint-disable-line camelcase - // }); - // // Force the search, but give the checkCacheUpdates the time to start up a search thread - // setTimeout(() => { - // checkCacheUpdates(true); - // }, 2000); - // } - // }); - - // Moved and rewritten this from displayShow. This changes the button when clicked for collapsing/expanding the - // "Show History" button to show or hide the snatch/download/failed history for a manual searched episode or pack. - - // $('#popover').popover({ - // placement: 'bottom', - // html: true, // Required if content has HTML - // content: '
    ' - // }).on('shown.bs.popover', () => { // Bootstrap popover event triggered when the popover opens - // $.tablesorter.columnSelector.attachTo($('#srchresults'), '#popover-target'); - // }); - - // $('#btnReset').click(() => { - // $('#showTable') - // .trigger('saveSortReset') // Clear saved sort - // .trigger('sortReset'); // Reset current table sort - // return false; - // }); - - // initTableSorter('#srchresults'); - // this.reflowLayout(); - - // $('body').on('hide.bs.collapse', '.collapse.toggle', () => { - // $('#showhistory').text('Show History'); - // $('#wrapper').prop('data-history-toggle', 'hide'); - // }); - // $('body').on('show.bs.collapse', '.collapse.toggle', () => { - // $('#showhistory').text('Hide History'); - // $('#wrapper').prop('data-history-toggle', 'show'); - // }); - - // $(document.body).on('click', '.release-name-ellipses, .release-name-ellipses-toggled', event => { - // const target = $(event.currentTarget); - - // if (target.hasClass('release-name-ellipses')) { - // target.switchClass('release-name-ellipses', 'release-name-ellipses-toggled', 100); - // } else { - // target.switchClass('release-name-ellipses-toggled', 'release-name-ellipses', 100); - // } - // }); } }; diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index 28eaa4c438..9a46c5061b 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -620,7 +620,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/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _show_results_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./show-results.vue */ \"./src/components/show-results.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n ShowHistory: _show_history_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n ShowResults: _show_results_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config,\n search: state => state.config.search,\n history: state => state.history\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired',\n getShowHistoryBySlug: 'getShowHistoryBySlug',\n getEpisode: 'getEpisode'\n }),\n\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid);\n },\n\n season() {\n return Number(this.$route.query.season);\n },\n\n episode() {\n return Number(this.$route.query.episode);\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getHistory: 'getHistory'\n }),\n\n // /**\n // * Attaches IMDB tooltip,\n // */\n // reflowLayout() {\n // attachImdbTooltip(); // eslint-disable-line no-undef\n // },\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n search,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n /** Disabled for now. Because global + series ignored can be concatenated or excluded. So it's not that simple to color them. */\n // if (this.show.config.release.ignoredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-ignored');\n // }\n // if (this.show.config.release.requiredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-required');\n // }\n\n\n return classes.join(' ');\n }\n\n },\n\n mounted() {\n const {\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n }); // getHistory();\n // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n } // this.$watch('show', () => {\n // this.$nextTick(() => this.reflowLayout());\n // });\n // ['load', 'resize'].map(event => {\n // return window.addEventListener(event, () => {\n // this.reflowLayout();\n // });\n // });\n\n\n const updateSpinner = function (message, showSpinner) {\n // Get spinner object as needed\n const spinner = $('#searchNotification');\n\n if (showSpinner) {\n message = ' ' + message;\n }\n\n $(spinner).empty().append(message);\n }; // // Check the previous status of the history table, for hidden or shown, through the data attribute\n // // data-history-toggle-hidden\n // function toggleHistoryTable() { // eslint-disable-line no-unused-vars\n // // Get previous state which was saved on the wrapper\n // const showOrHide = $('#wrapper').attr('data-history-toggle');\n // $('#historydata').collapse(showOrHide);\n // }\n // $.fn.loadContainer = function(path, loadingTxt, errorTxt, callback) {\n // updateSpinner(loadingTxt);\n // $('#manualSearchMeta').load(path + ' #manualSearchMeta meta');\n // $(this).load(path + ' #manualSearchTbody tr', (response, status) => {\n // if (status === 'error') {\n // updateSpinner(errorTxt, false);\n // }\n // if (typeof callback !== 'undefined') {\n // callback();\n // }\n // });\n // };\n // // Click event for the download button for snatching a result\n // $(document.body).on('click', '.epManualSearch', event => {\n // event.preventDefault();\n // const link = event.currentTarget;\n // $(link).children('img').prop('src', 'images/loading16.gif');\n // $.getJSON(event.currentTarget.href, data => {\n // if (data.result === 'success') {\n // $(link).children('img').prop('src', 'images/save.png');\n // } else {\n // $(link).children('img').prop('src', 'images/no16.png');\n // }\n // });\n // });\n // function initTableSorter(table) {\n // // Nasty hack to re-initialize tablesorter after refresh\n // $(table).tablesorter({\n // widgets: ['saveSort', 'stickyHeaders', 'columnSelector', 'filter'],\n // widgetOptions: {\n // filter_columnFilters: true, // eslint-disable-line camelcase\n // filter_hideFilters: true, // eslint-disable-line camelcase\n // filter_saveFilters: true, // eslint-disable-line camelcase\n // columnSelector_saveColumns: true, // eslint-disable-line camelcase\n // columnSelector_layout: '', // eslint-disable-line camelcase\n // columnSelector_mediaquery: false, // eslint-disable-line camelcase\n // columnSelector_cssChecked: 'checked' // eslint-disable-line camelcase\n // },\n // textExtraction: (function() {\n // return {\n // // 2: Provider\n // 2(node) {\n // return $(node).find('img').attr('title');\n // },\n // // 6: The size column needs an explicit field for the filtering on raw size.\n // 6(node) {\n // return node.getAttribute('data-size');\n // },\n // // 9: Published date\n // 9(node) {\n // return node.getAttribute('data-datetime');\n // },\n // // 10: Added date\n // 10(node) {\n // return node.getAttribute('data-datetime');\n // }\n // };\n // })(),\n // headers: {\n // 9: { sorter: 'realISODate' }, // Published\n // 10: { sorter: 'realISODate' }, // Added\n // 11: { sorter: false, parser: false } // Snatch link\n // }\n // });\n // }\n // function checkCacheUpdates(repeat) {\n // let pollInterval = 5000;\n // repeat = repeat || true;\n // const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n // const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n // const season = $('meta[data-last-prov-updates]').attr('data-season');\n // const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n // const data = $('meta[data-last-prov-updates]').data('last-prov-updates');\n // const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n // const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n // return checkIsTrue;\n // });\n // if (!checkParams) {\n // console.log(\n // 'Something went wrong in getting the paramaters from dom.' +\n // ` indexerName: ${indexerName}, seriesId: ${seriesId}, season: ${season}, episode: ${episode}`\n // );\n // return;\n // }\n // let urlParams = '?indexername=' + indexerName + '&seriesid=' + seriesId + '&season=' + season + '&episode=' + episode;\n // if (manualSearchType === 'season') {\n // urlParams += '&manual_search_type=' + manualSearchType;\n // }\n // if (!$.isNumeric(seriesId) || !$.isNumeric(season) || !$.isNumeric(episode)) {\n // setTimeout(() => {\n // checkCacheUpdates(true);\n // }, 200);\n // }\n // $.ajax({\n // url: 'home/manualSearchCheckCache' + urlParams,\n // type: 'GET',\n // data,\n // contentType: 'application/json',\n // error() {\n // // Repeat = false;\n // console.log('Error occurred!!');\n // $('.manualSearchButton').removeAttr('disabled');\n // },\n // complete() {\n // if (repeat) {\n // setTimeout(checkCacheUpdates, pollInterval);\n // }\n // },\n // timeout: 15000 // Timeout after 15s\n // }).done(data => {\n // // @TODO: Combine the lower if statements\n // if (data === '') {\n // updateSpinner('Search finished', false);\n // $('.manualSearchButton').removeAttr('disabled');\n // repeat = false;\n // }\n // if (data.result === 'refresh') {\n // window.location.reload();\n // updateSpinner('Refreshed results...', true);\n // }\n // if (data.result === 'searching') {\n // // Ep is searched, you will get a results any minute now\n // pollInterval = 5000;\n // $('.manualSearchButton').prop('disabled', true);\n // updateSpinner('The episode is being searched, please wait......', true);\n // }\n // if (data.result === 'queued') {\n // // Ep is queued, this might take some time to get results\n // pollInterval = 7000;\n // $('.manualSearchButton').prop('disabled', true);\n // updateSpinner('The episode has been queued, because another search is taking place. please wait..', true);\n // }\n // if (data.result === 'finished') {\n // // Ep search is finished\n // updateSpinner('Search finished', false);\n // $('.manualSearchButton').removeAttr('disabled');\n // repeat = false;\n // $('#srchresults').trigger('update', true);\n // $('[datetime]').timeago();\n // }\n // if (data.result === 'error') {\n // // Ep search is finished but with an error\n // console.log('Probably tried to call manualSelectCheckCache, while page was being refreshed.');\n // $('.manualSearchButton').removeAttr('disabled');\n // repeat = true;\n // }\n // });\n // }\n // setTimeout(checkCacheUpdates, 2000);\n // // Click event for the reload results and force search buttons\n // $(document.body).on('click', '.manualSearchButton', event => {\n // event.preventDefault();\n // $('.manualSearchButton').prop('disabled', true);\n // const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n // const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n // const season = $('meta[data-last-prov-updates]').attr('data-season');\n // const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n // const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n // const forceSearch = $(event.currentTarget).attr('data-force-search');\n // const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n // return checkIsTrue;\n // });\n // if (!checkParams) {\n // console.log(\n // 'Something went wrong in getting the paramaters from dom.' +\n // ` indexerName: ${indexerName}, seriesId: ${seriesId}, season: ${season}, episode: ${episode}`\n // );\n // return;\n // }\n // if ($.isNumeric(seriesId) && $.isNumeric(season) && $.isNumeric(episode)) {\n // updateSpinner('Started a forced manual search...', true);\n // $.getJSON('home/snatchSelection', {\n // indexername: indexerName,\n // seriesid: seriesId,\n // season,\n // episode,\n // manual_search_type: manualSearchType, // eslint-disable-line camelcase\n // perform_search: forceSearch // eslint-disable-line camelcase\n // });\n // // Force the search, but give the checkCacheUpdates the time to start up a search thread\n // setTimeout(() => {\n // checkCacheUpdates(true);\n // }, 2000);\n // }\n // });\n // Moved and rewritten this from displayShow. This changes the button when clicked for collapsing/expanding the\n // \"Show History\" button to show or hide the snatch/download/failed history for a manual searched episode or pack.\n // $('#popover').popover({\n // placement: 'bottom',\n // html: true, // Required if content has HTML\n // content: '
    '\n // }).on('shown.bs.popover', () => { // Bootstrap popover event triggered when the popover opens\n // $.tablesorter.columnSelector.attachTo($('#srchresults'), '#popover-target');\n // });\n // $('#btnReset').click(() => {\n // $('#showTable')\n // .trigger('saveSortReset') // Clear saved sort\n // .trigger('sortReset'); // Reset current table sort\n // return false;\n // });\n // initTableSorter('#srchresults');\n // this.reflowLayout();\n // $('body').on('hide.bs.collapse', '.collapse.toggle', () => {\n // $('#showhistory').text('Show History');\n // $('#wrapper').prop('data-history-toggle', 'hide');\n // });\n // $('body').on('show.bs.collapse', '.collapse.toggle', () => {\n // $('#showhistory').text('Hide History');\n // $('#wrapper').prop('data-history-toggle', 'show');\n // });\n // $(document.body).on('click', '.release-name-ellipses, .release-name-ellipses-toggled', event => {\n // const target = $(event.currentTarget);\n // if (target.hasClass('release-name-ellipses')) {\n // target.switchClass('release-name-ellipses', 'release-name-ellipses-toggled', 100);\n // } else {\n // target.switchClass('release-name-ellipses-toggled', 'release-name-ellipses', 100);\n // }\n // });\n\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _show_results_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./show-results.vue */ \"./src/components/show-results.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n ShowHistory: _show_history_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n ShowResults: _show_results_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config,\n search: state => state.config.search,\n history: state => state.history\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired',\n getShowHistoryBySlug: 'getShowHistoryBySlug',\n getEpisode: 'getEpisode'\n }),\n\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid);\n },\n\n season() {\n return Number(this.$route.query.season);\n },\n\n episode() {\n return Number(this.$route.query.episode);\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getHistory: 'getHistory'\n }),\n\n // TODO: Move this to show-results!\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n search,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n\n return classes.join(' ');\n }\n\n },\n\n mounted() {\n const {\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n }); // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n }\n }\n\n});\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), diff --git a/themes/light/assets/js/medusa-runtime.js b/themes/light/assets/js/medusa-runtime.js index 28eaa4c438..9a46c5061b 100644 --- a/themes/light/assets/js/medusa-runtime.js +++ b/themes/light/assets/js/medusa-runtime.js @@ -620,7 +620,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/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _show_results_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./show-results.vue */ \"./src/components/show-results.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n ShowHistory: _show_history_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n ShowResults: _show_results_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config,\n search: state => state.config.search,\n history: state => state.history\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired',\n getShowHistoryBySlug: 'getShowHistoryBySlug',\n getEpisode: 'getEpisode'\n }),\n\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid);\n },\n\n season() {\n return Number(this.$route.query.season);\n },\n\n episode() {\n return Number(this.$route.query.episode);\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getHistory: 'getHistory'\n }),\n\n // /**\n // * Attaches IMDB tooltip,\n // */\n // reflowLayout() {\n // attachImdbTooltip(); // eslint-disable-line no-undef\n // },\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n search,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n /** Disabled for now. Because global + series ignored can be concatenated or excluded. So it's not that simple to color them. */\n // if (this.show.config.release.ignoredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-ignored');\n // }\n // if (this.show.config.release.requiredWords.map( word => {\n // return name.toLowerCase().includes(word.toLowerCase());\n // }).filter(x => x === true).length) {\n // classes.push('show-required');\n // }\n\n\n return classes.join(' ');\n }\n\n },\n\n mounted() {\n const {\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n }); // getHistory();\n // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n } // this.$watch('show', () => {\n // this.$nextTick(() => this.reflowLayout());\n // });\n // ['load', 'resize'].map(event => {\n // return window.addEventListener(event, () => {\n // this.reflowLayout();\n // });\n // });\n\n\n const updateSpinner = function (message, showSpinner) {\n // Get spinner object as needed\n const spinner = $('#searchNotification');\n\n if (showSpinner) {\n message = ' ' + message;\n }\n\n $(spinner).empty().append(message);\n }; // // Check the previous status of the history table, for hidden or shown, through the data attribute\n // // data-history-toggle-hidden\n // function toggleHistoryTable() { // eslint-disable-line no-unused-vars\n // // Get previous state which was saved on the wrapper\n // const showOrHide = $('#wrapper').attr('data-history-toggle');\n // $('#historydata').collapse(showOrHide);\n // }\n // $.fn.loadContainer = function(path, loadingTxt, errorTxt, callback) {\n // updateSpinner(loadingTxt);\n // $('#manualSearchMeta').load(path + ' #manualSearchMeta meta');\n // $(this).load(path + ' #manualSearchTbody tr', (response, status) => {\n // if (status === 'error') {\n // updateSpinner(errorTxt, false);\n // }\n // if (typeof callback !== 'undefined') {\n // callback();\n // }\n // });\n // };\n // // Click event for the download button for snatching a result\n // $(document.body).on('click', '.epManualSearch', event => {\n // event.preventDefault();\n // const link = event.currentTarget;\n // $(link).children('img').prop('src', 'images/loading16.gif');\n // $.getJSON(event.currentTarget.href, data => {\n // if (data.result === 'success') {\n // $(link).children('img').prop('src', 'images/save.png');\n // } else {\n // $(link).children('img').prop('src', 'images/no16.png');\n // }\n // });\n // });\n // function initTableSorter(table) {\n // // Nasty hack to re-initialize tablesorter after refresh\n // $(table).tablesorter({\n // widgets: ['saveSort', 'stickyHeaders', 'columnSelector', 'filter'],\n // widgetOptions: {\n // filter_columnFilters: true, // eslint-disable-line camelcase\n // filter_hideFilters: true, // eslint-disable-line camelcase\n // filter_saveFilters: true, // eslint-disable-line camelcase\n // columnSelector_saveColumns: true, // eslint-disable-line camelcase\n // columnSelector_layout: '', // eslint-disable-line camelcase\n // columnSelector_mediaquery: false, // eslint-disable-line camelcase\n // columnSelector_cssChecked: 'checked' // eslint-disable-line camelcase\n // },\n // textExtraction: (function() {\n // return {\n // // 2: Provider\n // 2(node) {\n // return $(node).find('img').attr('title');\n // },\n // // 6: The size column needs an explicit field for the filtering on raw size.\n // 6(node) {\n // return node.getAttribute('data-size');\n // },\n // // 9: Published date\n // 9(node) {\n // return node.getAttribute('data-datetime');\n // },\n // // 10: Added date\n // 10(node) {\n // return node.getAttribute('data-datetime');\n // }\n // };\n // })(),\n // headers: {\n // 9: { sorter: 'realISODate' }, // Published\n // 10: { sorter: 'realISODate' }, // Added\n // 11: { sorter: false, parser: false } // Snatch link\n // }\n // });\n // }\n // function checkCacheUpdates(repeat) {\n // let pollInterval = 5000;\n // repeat = repeat || true;\n // const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n // const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n // const season = $('meta[data-last-prov-updates]').attr('data-season');\n // const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n // const data = $('meta[data-last-prov-updates]').data('last-prov-updates');\n // const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n // const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n // return checkIsTrue;\n // });\n // if (!checkParams) {\n // console.log(\n // 'Something went wrong in getting the paramaters from dom.' +\n // ` indexerName: ${indexerName}, seriesId: ${seriesId}, season: ${season}, episode: ${episode}`\n // );\n // return;\n // }\n // let urlParams = '?indexername=' + indexerName + '&seriesid=' + seriesId + '&season=' + season + '&episode=' + episode;\n // if (manualSearchType === 'season') {\n // urlParams += '&manual_search_type=' + manualSearchType;\n // }\n // if (!$.isNumeric(seriesId) || !$.isNumeric(season) || !$.isNumeric(episode)) {\n // setTimeout(() => {\n // checkCacheUpdates(true);\n // }, 200);\n // }\n // $.ajax({\n // url: 'home/manualSearchCheckCache' + urlParams,\n // type: 'GET',\n // data,\n // contentType: 'application/json',\n // error() {\n // // Repeat = false;\n // console.log('Error occurred!!');\n // $('.manualSearchButton').removeAttr('disabled');\n // },\n // complete() {\n // if (repeat) {\n // setTimeout(checkCacheUpdates, pollInterval);\n // }\n // },\n // timeout: 15000 // Timeout after 15s\n // }).done(data => {\n // // @TODO: Combine the lower if statements\n // if (data === '') {\n // updateSpinner('Search finished', false);\n // $('.manualSearchButton').removeAttr('disabled');\n // repeat = false;\n // }\n // if (data.result === 'refresh') {\n // window.location.reload();\n // updateSpinner('Refreshed results...', true);\n // }\n // if (data.result === 'searching') {\n // // Ep is searched, you will get a results any minute now\n // pollInterval = 5000;\n // $('.manualSearchButton').prop('disabled', true);\n // updateSpinner('The episode is being searched, please wait......', true);\n // }\n // if (data.result === 'queued') {\n // // Ep is queued, this might take some time to get results\n // pollInterval = 7000;\n // $('.manualSearchButton').prop('disabled', true);\n // updateSpinner('The episode has been queued, because another search is taking place. please wait..', true);\n // }\n // if (data.result === 'finished') {\n // // Ep search is finished\n // updateSpinner('Search finished', false);\n // $('.manualSearchButton').removeAttr('disabled');\n // repeat = false;\n // $('#srchresults').trigger('update', true);\n // $('[datetime]').timeago();\n // }\n // if (data.result === 'error') {\n // // Ep search is finished but with an error\n // console.log('Probably tried to call manualSelectCheckCache, while page was being refreshed.');\n // $('.manualSearchButton').removeAttr('disabled');\n // repeat = true;\n // }\n // });\n // }\n // setTimeout(checkCacheUpdates, 2000);\n // // Click event for the reload results and force search buttons\n // $(document.body).on('click', '.manualSearchButton', event => {\n // event.preventDefault();\n // $('.manualSearchButton').prop('disabled', true);\n // const indexerName = $('meta[data-last-prov-updates]').attr('data-indexer-name');\n // const seriesId = $('meta[data-last-prov-updates]').attr('data-series-id');\n // const season = $('meta[data-last-prov-updates]').attr('data-season');\n // const episode = $('meta[data-last-prov-updates]').attr('data-episode');\n // const manualSearchType = $('meta[data-last-prov-updates]').attr('data-manual-search-type');\n // const forceSearch = $(event.currentTarget).attr('data-force-search');\n // const checkParams = [indexerName, seriesId, season, episode].every(checkIsTrue => {\n // return checkIsTrue;\n // });\n // if (!checkParams) {\n // console.log(\n // 'Something went wrong in getting the paramaters from dom.' +\n // ` indexerName: ${indexerName}, seriesId: ${seriesId}, season: ${season}, episode: ${episode}`\n // );\n // return;\n // }\n // if ($.isNumeric(seriesId) && $.isNumeric(season) && $.isNumeric(episode)) {\n // updateSpinner('Started a forced manual search...', true);\n // $.getJSON('home/snatchSelection', {\n // indexername: indexerName,\n // seriesid: seriesId,\n // season,\n // episode,\n // manual_search_type: manualSearchType, // eslint-disable-line camelcase\n // perform_search: forceSearch // eslint-disable-line camelcase\n // });\n // // Force the search, but give the checkCacheUpdates the time to start up a search thread\n // setTimeout(() => {\n // checkCacheUpdates(true);\n // }, 2000);\n // }\n // });\n // Moved and rewritten this from displayShow. This changes the button when clicked for collapsing/expanding the\n // \"Show History\" button to show or hide the snatch/download/failed history for a manual searched episode or pack.\n // $('#popover').popover({\n // placement: 'bottom',\n // html: true, // Required if content has HTML\n // content: '
    '\n // }).on('shown.bs.popover', () => { // Bootstrap popover event triggered when the popover opens\n // $.tablesorter.columnSelector.attachTo($('#srchresults'), '#popover-target');\n // });\n // $('#btnReset').click(() => {\n // $('#showTable')\n // .trigger('saveSortReset') // Clear saved sort\n // .trigger('sortReset'); // Reset current table sort\n // return false;\n // });\n // initTableSorter('#srchresults');\n // this.reflowLayout();\n // $('body').on('hide.bs.collapse', '.collapse.toggle', () => {\n // $('#showhistory').text('Show History');\n // $('#wrapper').prop('data-history-toggle', 'hide');\n // });\n // $('body').on('show.bs.collapse', '.collapse.toggle', () => {\n // $('#showhistory').text('Hide History');\n // $('#wrapper').prop('data-history-toggle', 'show');\n // });\n // $(document.body).on('click', '.release-name-ellipses, .release-name-ellipses-toggled', event => {\n // const target = $(event.currentTarget);\n // if (target.hasClass('release-name-ellipses')) {\n // target.switchClass('release-name-ellipses', 'release-name-ellipses-toggled', 100);\n // } else {\n // target.switchClass('release-name-ellipses-toggled', 'release-name-ellipses', 100);\n // }\n // });\n\n }\n\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _show_results_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./show-results.vue */ \"./src/components/show-results.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'snatch-selection',\n template: '#snatch-selection-template',\n components: {\n Backstretch: _backstretch_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n ShowHeader: _show_header_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n ShowHistory: _show_history_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n ShowResults: _show_results_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n\n metaInfo() {\n if (!this.show || !this.show.title) {\n return {\n title: 'Medusa'\n };\n }\n\n const {\n title\n } = this.show;\n return {\n title,\n titleTemplate: '%s | Medusa'\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n shows: state => state.shows.shows,\n config: state => state.config,\n search: state => state.config.search,\n history: state => state.history\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n show: 'getCurrentShow',\n effectiveIgnored: 'effectiveIgnored',\n effectiveRequired: 'effectiveRequired',\n getShowHistoryBySlug: 'getShowHistoryBySlug',\n getEpisode: 'getEpisode'\n }),\n\n indexer() {\n return this.$route.query.indexername;\n },\n\n id() {\n return Number(this.$route.query.seriesid);\n },\n\n season() {\n return Number(this.$route.query.season);\n },\n\n episode() {\n return Number(this.$route.query.episode);\n }\n\n },\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShow: 'getShow',\n // Map `this.getShow()` to `this.$store.dispatch('getShow')`\n getHistory: 'getHistory'\n }),\n\n // TODO: Move this to show-results!\n getReleaseNameClasses(name) {\n const {\n effectiveIgnored,\n effectiveRequired,\n search,\n show\n } = this;\n const classes = [];\n\n if (effectiveIgnored(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-ignored');\n }\n\n if (effectiveRequired(show).map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-required');\n }\n\n if (search.filters.undesired.map(word => {\n return name.toLowerCase().includes(word.toLowerCase());\n }).filter(x => x === true).length > 0) {\n classes.push('global-undesired');\n }\n\n return classes.join(' ');\n }\n\n },\n\n mounted() {\n const {\n indexer,\n id,\n show,\n getShow,\n $store\n } = this; // Let's tell the store which show we currently want as current.\n\n $store.commit('currentShow', {\n indexer,\n id\n }); // We need the show info, so let's get it.\n\n if (!show || !show.id.slug) {\n getShow({\n id,\n indexer,\n detailed: false\n });\n }\n }\n\n});\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), From 35c8a14ecb60f6287cfce06900614820081b9ce8 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sun, 7 Jun 2020 19:19:07 +0200 Subject: [PATCH 41/87] whoops --- medusa/server/api/v2/history.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/medusa/server/api/v2/history.py b/medusa/server/api/v2/history.py index 0a7a94fe88..dc0a3b2079 100644 --- a/medusa/server/api/v2/history.py +++ b/medusa/server/api/v2/history.py @@ -6,7 +6,7 @@ from medusa import db from medusa.common import statusStrings -from meudsa.provider import GenericProvider +from medusa.providers.generic_provider import GenericProvider from medusa.server.api.v2.base import BaseRequestHandler from medusa.tv.series import SeriesIdentifier From a94c1157091da2a78dc8193834fdc73dd06cc469 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Mon, 15 Jun 2020 17:26:58 +0200 Subject: [PATCH 42/87] Return descriptive fields for the "resouce" field. * Map provider field to descriptive fields, based on specific action id's. --- medusa/server/api/v2/episode_history.py | 39 +++++++++++++++++++------ medusa/server/api/v2/history.py | 37 ++++++++++++++++++----- 2 files changed, 59 insertions(+), 17 deletions(-) diff --git a/medusa/server/api/v2/episode_history.py b/medusa/server/api/v2/episode_history.py index a54fc0b0fc..706590ea50 100644 --- a/medusa/server/api/v2/episode_history.py +++ b/medusa/server/api/v2/episode_history.py @@ -6,7 +6,7 @@ from os.path import basename from medusa import db -from medusa.common import statusStrings +from medusa.common import DOWNLOADED, FAILED, SNATCHED, SUBTITLED, statusStrings from medusa.logger.adapters.style import BraceAdapter from medusa.providers.generic_provider import GenericProvider from medusa.server.api.v2.base import BaseRequestHandler @@ -62,7 +62,7 @@ def get(self, series_slug, episode_slug, path_param): sql_base = """ SELECT rowid, date, action, quality, provider, version, resource, size, proper_tags, - indexer_id, showid, season, episode, manually_searched + indexer_id, showid, season, episode, manually_searched, info_hash FROM history WHERE showid = ? AND indexer_id = ? AND season = ? AND episode = ? """ @@ -75,9 +75,28 @@ def get(self, series_slug, episode_slug, path_param): def data_generator(): """Read history data and normalize key/value pairs.""" for item in results: - provider_id = None - if item['provider']: - provider_id = GenericProvider.make_id(item['provider']) + provider = {} + release_group = None + release_name = None + file_name = None + subtitle_language = None + + if item['action'] in (SNATCHED, FAILED): + provider.update({ + 'id': GenericProvider.make_id(item['provider']), + 'name': item['provider'] + }) + release_name = item['resource'] + + if item['action'] == DOWNLOADED: + release_group = item['provider'] + file_name = item['resource'] + + if item['action'] == SUBTITLED: + subtitle_language = item['resource'] + + if item['action'] == SUBTITLED: + subtitle_language = item['resource'] yield { 'id': item['rowid'], @@ -92,10 +111,12 @@ def data_generator(): 'season': item['season'], 'episode': item['episode'], 'manuallySearched': bool(item['manually_searched']), - 'provider': { - 'id': provider_id, - 'name': item['provider'], - } + 'infoHash': item['info_hash'], + 'provider': provider, + 'release_name': release_name, + 'releaseGroup': release_group, + 'fileName': file_name, + 'subtitleLanguage': subtitle_language } if not results: diff --git a/medusa/server/api/v2/history.py b/medusa/server/api/v2/history.py index dc0a3b2079..74604778ff 100644 --- a/medusa/server/api/v2/history.py +++ b/medusa/server/api/v2/history.py @@ -5,7 +5,7 @@ from os.path import basename from medusa import db -from medusa.common import statusStrings +from medusa.common import DOWNLOADED, FAILED, SNATCHED, SUBTITLED, statusStrings from medusa.providers.generic_provider import GenericProvider from medusa.server.api.v2.base import BaseRequestHandler from medusa.tv.series import SeriesIdentifier @@ -56,9 +56,28 @@ def data_generator(): start = arg_limit * (arg_page - 1) for item in results[start:start + arg_limit]: - provider_id = None - if item['provider']: - provider_id = GenericProvider.make_id(item['provider']) + provider = {} + release_group = None + release_name = None + file_name = None + subtitle_language = None + + if item['action'] in (SNATCHED, FAILED): + provider.update({ + 'id': GenericProvider.make_id(item['provider']), + 'name': item['provider'] + }) + release_name = item['resource'] + + if item['action'] == DOWNLOADED: + release_group = item['provider'] + file_name = item['resource'] + + if item['action'] == SUBTITLED: + subtitle_language = item['resource'] + + if item['action'] == SUBTITLED: + subtitle_language = item['resource'] yield { 'id': item['rowid'], @@ -73,10 +92,12 @@ def data_generator(): 'season': item['season'], 'episode': item['episode'], 'manuallySearched': bool(item['manually_searched']), - 'provider': { - 'id': provider_id, - 'name': item['provider'], - } + 'infoHash': item['info_hash'], + 'provider': provider, + 'release_name': release_name, + 'releaseGroup': release_group, + 'fileName': file_name, + 'subtitleLanguage': subtitle_language } if not results: From da3af43fcd23ecf1c67b1e598f75621e372b6189 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Wed, 17 Jun 2020 20:00:19 +0200 Subject: [PATCH 43/87] Fix showing provider/release group in same column. --- themes-default/slim/src/components/show-history.vue | 9 +++++---- themes/dark/assets/js/medusa-runtime.js | 4 ++-- themes/light/assets/js/medusa-runtime.js | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/themes-default/slim/src/components/show-history.vue b/themes-default/slim/src/components/show-history.vue index f8761dbd11..15c452673b 100644 --- a/themes-default/slim/src/components/show-history.vue +++ b/themes-default/slim/src/components/show-history.vue @@ -30,9 +30,10 @@ - - - {{props.row.provider.name}} + + + + {{props.row.statusName === 'Downloaded' ? (props.row.releaseGroup !== -1 ? props.row.releaseGroup : '') : props.row.provider.name}} @@ -92,7 +93,7 @@ export default { field: 'quality', type: 'number' }, { - label: 'Provider', + label: 'Provider/Group', field: 'provider.id' }, { label: 'Release', diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index 9a46c5061b..b15b930850 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -536,7 +536,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider/Group',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1489,7 +1489,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.provider.name) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider/Group\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.statusName !== \"Downloaded\"\n ? _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.statusName === \"Downloaded\"\n ? props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n : props.row.provider.name\n ) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), diff --git a/themes/light/assets/js/medusa-runtime.js b/themes/light/assets/js/medusa-runtime.js index 9a46c5061b..b15b930850 100644 --- a/themes/light/assets/js/medusa-runtime.js +++ b/themes/light/assets/js/medusa-runtime.js @@ -536,7 +536,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider/Group',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1489,7 +1489,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.provider.name) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider/Group\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.statusName !== \"Downloaded\"\n ? _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.statusName === \"Downloaded\"\n ? props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n : props.row.provider.name\n ) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), From 188be380a86d800aa0ca0d0a4e5c5aa4bfda8571 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Wed, 17 Jun 2020 20:56:27 +0200 Subject: [PATCH 44/87] Force search, when no initial results found. --- .../slim/src/components/show-history.vue | 1 - .../slim/src/components/show-results.vue | 15 +++++---- .../slim/src/store/modules/provider.js | 32 +++++++++++-------- themes/dark/assets/js/medusa-runtime.js | 6 ++-- themes/light/assets/js/medusa-runtime.js | 6 ++-- 5 files changed, 33 insertions(+), 27 deletions(-) diff --git a/themes-default/slim/src/components/show-history.vue b/themes-default/slim/src/components/show-history.vue index 15c452673b..0b4b19698f 100644 --- a/themes-default/slim/src/components/show-history.vue +++ b/themes-default/slim/src/components/show-history.vue @@ -31,7 +31,6 @@ - {{props.row.statusName === 'Downloaded' ? (props.row.releaseGroup !== -1 ? props.row.releaseGroup : '') : props.row.provider.name}} diff --git a/themes-default/slim/src/components/show-results.vue b/themes-default/slim/src/components/show-results.vue index 7448fa9616..68abb46aaf 100644 --- a/themes-default/slim/src/components/show-results.vue +++ b/themes-default/slim/src/components/show-results.vue @@ -160,13 +160,14 @@ export default { loadingMessage: '' }; }, - mounted() { - const { getProviders, getProviderResults } = this; - getProviders() - .then(() => { - // We need to get the providers, before we know which providers to query. - getProviderResults(); - }); + async mounted() { + const { combinedResults, forceSearch, getProviders, getProviderCacheResults, show, season, episode } = this; + await getProviders(); + await getProviderCacheResults({ showSlug: show.id.slug, season, episode }); + // TODO: put a modal in between + if (combinedResults.length === 0) { + forceSearch(); + } }, computed: { ...mapState({ diff --git a/themes-default/slim/src/store/modules/provider.js b/themes-default/slim/src/store/modules/provider.js index be62e6b869..d78ac6bd0c 100644 --- a/themes-default/slim/src/store/modules/provider.js +++ b/themes-default/slim/src/store/modules/provider.js @@ -89,7 +89,7 @@ const actions = { * @param {String} The provider id. * @returns {void}. */ - async getProviderCacheResults(context, { showSlug, season, episode }) { + getProviderCacheResults(context, { showSlug, season, episode }) { const { commit, state } = context; const limit = 1000; const params = { limit, showslug: showSlug, season }; @@ -97,14 +97,10 @@ const actions = { params.episode = episode; } - let page = 0; - let lastPage = false; - let response = null; - - for (const provider in state.providers) { - if (!state.providers[provider].config.enabled) { - continue; - } + const getProviderResults = async provider => { + let response = null; + let page = 0; + let lastPage = false; // Empty the providers cache commit(SET_PROVIDER_CACHE, { providerId: provider, cache: [] }); @@ -118,16 +114,26 @@ const actions = { page += 1; params.page = page; - response = await api.get(`/providers/${providerId}/results`, { params }); // eslint-disable-line no-await-in-loop - return new Promise(resolve => { + try { + response = await api.get(`/providers/${providerId}/results`, { params }); commit(ADD_PROVIDER_CACHE, { providerId, cache: response.data }); if (response.data.length < limit) { lastPage = true; } - resolve(); - }); + } catch (error) { + console.debug(String(error)); + lastPage = true; + } } + }; + + for (const provider in state.providers) { + if (!state.providers[provider].config.enabled) { + continue; + } + + getProviderResults(provider); } }, /** diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index b15b930850..c2b764c2d0 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -536,7 +536,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider/Group',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider/Group',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -608,7 +608,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n mounted() {\n const {\n getProviders,\n getProviderResults\n } = this;\n getProviders().then(() => {\n // We need to get the providers, before we know which providers to query.\n getProviderResults();\n });\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n async mounted() {\n const {\n combinedResults,\n forceSearch,\n getProviders,\n getProviderCacheResults,\n show,\n season,\n episode\n } = this;\n await getProviders();\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // TODO: put a modal in between\n\n if (combinedResults.length === 0) {\n forceSearch();\n }\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -4842,7 +4842,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n let page = 0;\n let lastPage = false;\n let response = null;\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n } // Empty the providers cache\n\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n }); // eslint-disable-line no-await-in-loop\n\n return new Promise(resolve => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n\n resolve();\n });\n }\n }\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n getProviderResults(provider);\n }\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.js?"); /***/ }), diff --git a/themes/light/assets/js/medusa-runtime.js b/themes/light/assets/js/medusa-runtime.js index b15b930850..c2b764c2d0 100644 --- a/themes/light/assets/js/medusa-runtime.js +++ b/themes/light/assets/js/medusa-runtime.js @@ -536,7 +536,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider/Group',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider/Group',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -608,7 +608,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n mounted() {\n const {\n getProviders,\n getProviderResults\n } = this;\n getProviders().then(() => {\n // We need to get the providers, before we know which providers to query.\n getProviderResults();\n });\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n async mounted() {\n const {\n combinedResults,\n forceSearch,\n getProviders,\n getProviderCacheResults,\n show,\n season,\n episode\n } = this;\n await getProviders();\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // TODO: put a modal in between\n\n if (combinedResults.length === 0) {\n forceSearch();\n }\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -4842,7 +4842,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n let page = 0;\n let lastPage = false;\n let response = null;\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n } // Empty the providers cache\n\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n }); // eslint-disable-line no-await-in-loop\n\n return new Promise(resolve => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n\n resolve();\n });\n }\n }\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n getProviderResults(provider);\n }\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.js?"); /***/ }), From 4a7358e0cafed1e8c45e75d258b11ffbc71baae0 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Wed, 17 Jun 2020 21:53:07 +0200 Subject: [PATCH 45/87] Fix searching when no cache present. --- .../slim/src/components/show-results.vue | 8 +++++--- .../slim/src/store/modules/provider.js | 17 +++++++++++++++-- themes-default/slim/src/store/modules/search.js | 2 +- themes/dark/assets/js/medusa-runtime.js | 6 +++--- themes/light/assets/js/medusa-runtime.js | 6 +++--- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/themes-default/slim/src/components/show-results.vue b/themes-default/slim/src/components/show-results.vue index 68abb46aaf..7ef45a04e8 100644 --- a/themes-default/slim/src/components/show-results.vue +++ b/themes-default/slim/src/components/show-results.vue @@ -161,11 +161,13 @@ export default { }; }, async mounted() { - const { combinedResults, forceSearch, getProviders, getProviderCacheResults, show, season, episode } = this; + const { forceSearch, getProviders, getProviderCacheResults, show, season, episode } = this; await getProviders(); - await getProviderCacheResults({ showSlug: show.id.slug, season, episode }); + + const result = await getProviderCacheResults({ showSlug: show.id.slug, season, episode }); + // TODO: put a modal in between - if (combinedResults.length === 0) { + if (result.providersSearched > 0 && result.totalSearchResults.length === 0) { forceSearch(); } }, diff --git a/themes-default/slim/src/store/modules/provider.js b/themes-default/slim/src/store/modules/provider.js index d78ac6bd0c..f661bfd8db 100644 --- a/themes-default/slim/src/store/modules/provider.js +++ b/themes-default/slim/src/store/modules/provider.js @@ -89,7 +89,7 @@ const actions = { * @param {String} The provider id. * @returns {void}. */ - getProviderCacheResults(context, { showSlug, season, episode }) { + async getProviderCacheResults(context, { showSlug, season, episode }) { const { commit, state } = context; const limit = 1000; const params = { limit, showslug: showSlug, season }; @@ -101,6 +101,7 @@ const actions = { let response = null; let page = 0; let lastPage = false; + const results = []; // Empty the providers cache commit(SET_PROVIDER_CACHE, { providerId: provider, cache: [] }); @@ -116,7 +117,9 @@ const actions = { params.page = page; try { response = await api.get(`/providers/${providerId}/results`, { params }); + commit(ADD_PROVIDER_CACHE, { providerId, cache: response.data }); + results.push(...response.data); if (response.data.length < limit) { lastPage = true; @@ -126,6 +129,12 @@ const actions = { lastPage = true; } } + return results; + }; + + const result = { + providersSearched: 0, + totalSearchResults: [] }; for (const provider in state.providers) { @@ -133,8 +142,12 @@ const actions = { continue; } - getProviderResults(provider); + result.providersSearched += 1; + const providerResults = await getProviderResults(provider); + result.totalSearchResults.push(...providerResults); } + + return result; }, /** * Get provider cache results for enabled providers. diff --git a/themes-default/slim/src/store/modules/search.js b/themes-default/slim/src/store/modules/search.js index 060520e6be..da4b2b9fba 100644 --- a/themes-default/slim/src/store/modules/search.js +++ b/themes-default/slim/src/store/modules/search.js @@ -12,7 +12,7 @@ const mutations = { if (existingQueueItem) { Vue.set(state.queueitems, state.queueitems.indexOf(existingQueueItem), { ...existingQueueItem, ...queueItem }); } else { - state.queueitems.push(queueItem); + Vue.set(state.queueitems, state.queueitems.length, queueItem); } } }; diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index c2b764c2d0..f4ea990bbc 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -608,7 +608,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n async mounted() {\n const {\n combinedResults,\n forceSearch,\n getProviders,\n getProviderCacheResults,\n show,\n season,\n episode\n } = this;\n await getProviders();\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // TODO: put a modal in between\n\n if (combinedResults.length === 0) {\n forceSearch();\n }\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n async mounted() {\n const {\n forceSearch,\n getProviders,\n getProviderCacheResults,\n show,\n season,\n episode\n } = this;\n await getProviders();\n const result = await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // TODO: put a modal in between\n\n if (result.providersSearched > 0 && result.totalSearchResults.length === 0) {\n forceSearch();\n }\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -4842,7 +4842,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n getProviderResults(provider);\n }\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false;\n const results = []; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n results.push(...response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n\n return results;\n };\n\n const result = {\n providersSearched: 0,\n totalSearchResults: []\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n result.providersSearched += 1;\n const providerResults = await getProviderResults(provider);\n result.totalSearchResults.push(...providerResults);\n }\n\n return result;\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.js?"); /***/ }), @@ -4854,7 +4854,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\nconst state = {\n queueitems: []\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__[\"ADD_QUEUE_ITEM\"]](state, queueItem) {\n const existingQueueItem = state.queueitems.find(item => item.identifier === queueItem.identifier);\n\n if (existingQueueItem) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.queueitems, state.queueitems.indexOf(existingQueueItem), { ...existingQueueItem,\n ...queueItem\n });\n } else {\n state.queueitems.push(queueItem);\n }\n }\n\n};\nconst getters = {};\nconst actions = {\n updateQueueItem(context, queueItem) {\n // Update local store\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__[\"ADD_QUEUE_ITEM\"], queueItem);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/search.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 _mutation_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\nconst state = {\n queueitems: []\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__[\"ADD_QUEUE_ITEM\"]](state, queueItem) {\n const existingQueueItem = state.queueitems.find(item => item.identifier === queueItem.identifier);\n\n if (existingQueueItem) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.queueitems, state.queueitems.indexOf(existingQueueItem), { ...existingQueueItem,\n ...queueItem\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.queueitems, state.queueitems.length, queueItem);\n }\n }\n\n};\nconst getters = {};\nconst actions = {\n updateQueueItem(context, queueItem) {\n // Update local store\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__[\"ADD_QUEUE_ITEM\"], queueItem);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/search.js?"); /***/ }), diff --git a/themes/light/assets/js/medusa-runtime.js b/themes/light/assets/js/medusa-runtime.js index c2b764c2d0..f4ea990bbc 100644 --- a/themes/light/assets/js/medusa-runtime.js +++ b/themes/light/assets/js/medusa-runtime.js @@ -608,7 +608,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n async mounted() {\n const {\n combinedResults,\n forceSearch,\n getProviders,\n getProviderCacheResults,\n show,\n season,\n episode\n } = this;\n await getProviders();\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // TODO: put a modal in between\n\n if (combinedResults.length === 0) {\n forceSearch();\n }\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n async mounted() {\n const {\n forceSearch,\n getProviders,\n getProviderCacheResults,\n show,\n season,\n episode\n } = this;\n await getProviders();\n const result = await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // TODO: put a modal in between\n\n if (result.providersSearched > 0 && result.totalSearchResults.length === 0) {\n forceSearch();\n }\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -4842,7 +4842,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n getProviderResults(provider);\n }\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false;\n const results = []; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n results.push(...response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n\n return results;\n };\n\n const result = {\n providersSearched: 0,\n totalSearchResults: []\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n result.providersSearched += 1;\n const providerResults = await getProviderResults(provider);\n result.totalSearchResults.push(...providerResults);\n }\n\n return result;\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.js?"); /***/ }), @@ -4854,7 +4854,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\nconst state = {\n queueitems: []\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__[\"ADD_QUEUE_ITEM\"]](state, queueItem) {\n const existingQueueItem = state.queueitems.find(item => item.identifier === queueItem.identifier);\n\n if (existingQueueItem) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.queueitems, state.queueitems.indexOf(existingQueueItem), { ...existingQueueItem,\n ...queueItem\n });\n } else {\n state.queueitems.push(queueItem);\n }\n }\n\n};\nconst getters = {};\nconst actions = {\n updateQueueItem(context, queueItem) {\n // Update local store\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__[\"ADD_QUEUE_ITEM\"], queueItem);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/search.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 _mutation_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\nconst state = {\n queueitems: []\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__[\"ADD_QUEUE_ITEM\"]](state, queueItem) {\n const existingQueueItem = state.queueitems.find(item => item.identifier === queueItem.identifier);\n\n if (existingQueueItem) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.queueitems, state.queueitems.indexOf(existingQueueItem), { ...existingQueueItem,\n ...queueItem\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.queueitems, state.queueitems.length, queueItem);\n }\n }\n\n};\nconst getters = {};\nconst actions = {\n updateQueueItem(context, queueItem) {\n // Update local store\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__[\"ADD_QUEUE_ITEM\"], queueItem);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/search.js?"); /***/ }), From 788e143aa0bc5433faed895348713e351abde39b Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sat, 20 Jun 2020 20:05:27 +0200 Subject: [PATCH 46/87] Add episode title to snatchSelection (showHeader) component. --- .../slim/src/components/show-header.vue | 55 ++++++++++++++----- .../slim/src/store/modules/shows.js | 2 +- themes/dark/assets/js/medusa-runtime.js | 8 +-- themes/light/assets/js/medusa-runtime.js | 8 +-- 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/themes-default/slim/src/components/show-header.vue b/themes-default/slim/src/components/show-header.vue index 392a1a7a52..ca236f7696 100644 --- a/themes-default/slim/src/components/show-header.vue +++ b/themes-default/slim/src/components/show-header.vue @@ -12,15 +12,17 @@ -
    + +
    - Manual search for:
    - {{ show.title }} / Season {{ season }} + Manual search for: Season {{ season }} +
    + + {{episodeTitle}}
    + +
    Display Specials: {{ displaySpecials ? 'Hide' : 'Show' }} @@ -441,6 +443,7 @@ export default { }), ...mapGetters({ show: 'getCurrentShow', + getEpisode: 'getEpisode', getOverviewStatus: 'getOverviewStatus', getQualityPreset: 'getQualityPreset', getStatus: 'getStatus' @@ -532,6 +535,19 @@ export default { const { show } = this; // Only return an array with seasons (integers) return show.seasonCount.map(season => season.season); + }, + episodeTitle() { + const { getEpisode, show, season, episode } = this; + if (!(show.id.slug && season && episode)) { + return ''; + } + + const curEpisode = getEpisode({ showSlug: show.id.slug, season, episode }); + if (curEpisode) { + return curEpisode.title; + } + + return ''; } }, mounted() { @@ -646,8 +662,18 @@ export default { width: 15px; } +#showtitle { + float: none; +} + #show-specials-and-seasons { - margin-bottom: 15px; + bottom: 5px; + right: 15px; + position: absolute; +} + +.episode-info span { + display: block; } span.required { @@ -704,12 +730,6 @@ span.ignored { .display-seasons { top: -60px; } - - #show-specials-and-seasons { - bottom: 5px; - right: 15px; - position: absolute; - } } @media (max-width: 767px) { @@ -731,6 +751,15 @@ span.ignored { padding-top: 5px; width: 100%; } + + #showtitle { + margin-bottom: 40px; + } + + #show-specials-and-seasons { + bottom: -40px; + left: 15px; + } } @media (max-width: 991px) and (min-width: 768px) { diff --git a/themes-default/slim/src/store/modules/shows.js b/themes-default/slim/src/store/modules/shows.js index 2630716f4b..8434f58d3f 100644 --- a/themes-default/slim/src/store/modules/shows.js +++ b/themes-default/slim/src/store/modules/shows.js @@ -161,7 +161,7 @@ const getters = { }, getEpisode: state => ({ showSlug, season, episode }) => { const show = state.shows.find(show => show.id.slug === showSlug); - return show && show.seasons && show.seasons[season] ? show.seasons[season][episode] : undefined; + return show && show.seasons && show.seasons.find(s => s.season === season) ? show.seasons.find(s => s.season === season).episodes.find(ep => ep.episode === episode) : undefined; }, getCurrentShow: (state, getters, rootState) => { return state.shows.find(show => Number(show.id[state.currentShow.indexer]) === Number(state.currentShow.id)) || rootState.defaults.show; diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index f4ea990bbc..8065f9fcf5 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -524,7 +524,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-truncate-collapsed */ \"./node_modules/vue-truncate-collapsed/dist/vue-truncate-collapsed.es.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! country-language */ \"./node_modules/country-language/index.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(country_language__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-scrollto */ \"./node_modules/vue-scrollto/vue-scrollto.js\");\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n/**\n * Return the first item of `values` that is not `null`, `undefined` or `NaN`.\n * @param {...any} values - Values to check.\n * @returns {any} - The first item that fits the criteria, `undefined` otherwise.\n */\n\nconst resolveToValue = (...values) => {\n return values.find(value => {\n return !Number.isNaN(value) && value !== null && value !== undefined;\n });\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-header',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"AppLink\"],\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"Asset\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"QualityPill\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"StateSwitch\"],\n Truncate: vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n },\n props: {\n /**\n * Page type: show or snatch-selection\n */\n type: {\n type: String,\n default: 'show',\n validator: value => ['show', 'snatch-selection'].includes(value)\n },\n\n /**\n * Show indexer\n */\n showIndexer: {\n type: String\n },\n\n /**\n * Show id\n */\n showId: {\n type: Number\n },\n\n /**\n * Season\n */\n showSeason: {\n type: Number\n },\n\n /**\n * Episode\n */\n showEpisode: {\n type: Number\n },\n\n /**\n * Manual Search Type (snatch-selection)\n */\n manualSearchType: {\n type: String\n }\n },\n\n data() {\n return {\n jumpToSeason: 'jump',\n selectedStatus: 'Change status to:',\n selectedQuality: 'Change quality to:',\n overviewStatus: [{\n id: 'wanted',\n checked: true,\n name: 'Wanted'\n }, {\n id: 'allowed',\n checked: true,\n name: 'Allowed'\n }, {\n id: 'preferred',\n checked: true,\n name: 'Preferred'\n }, {\n id: 'skipped',\n checked: true,\n name: 'Skipped'\n }, {\n id: 'snatched',\n checked: true,\n name: 'Snatched'\n }]\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n shows: state => state.shows.shows,\n indexers: state => state.config.indexers,\n indexerConfig: state => state.config.indexers.indexers,\n displaySpecials: state => state.config.layout.show.specials,\n qualities: state => state.config.consts.qualities.values,\n statuses: state => state.config.consts.statuses,\n search: state => state.config.search,\n configLoaded: state => state.config.layout.fanartBackground !== null\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapGetters\"])({\n show: 'getCurrentShow',\n getOverviewStatus: 'getOverviewStatus',\n getQualityPreset: 'getQualityPreset',\n getStatus: 'getStatus'\n }),\n\n indexer() {\n return this.showIndexer || this.$route.query.indexername;\n },\n\n id() {\n return this.showId || Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return resolveToValue(this.showSeason, Number(this.$route.query.season));\n },\n\n episode() {\n return resolveToValue(this.showEpisode, Number(this.$route.query.episode));\n },\n\n showIndexerUrl() {\n const {\n show,\n indexerConfig\n } = this;\n\n if (!show.indexer) {\n return;\n }\n\n const id = show.id[show.indexer];\n const indexerUrl = indexerConfig[show.indexer].showUrl;\n return `${indexerUrl}${id}`;\n },\n\n activeShowQueueStatuses() {\n const {\n showQueueStatus\n } = this.show;\n\n if (!showQueueStatus) {\n return [];\n }\n\n return showQueueStatus.filter(status => status.active === true);\n },\n\n showGenres() {\n const {\n show,\n dedupeGenres\n } = this;\n const {\n imdbInfo\n } = show;\n const {\n genres\n } = imdbInfo;\n let result = [];\n\n if (genres) {\n result = dedupeGenres(genres.split('|'));\n }\n\n return result;\n },\n\n episodeSummary() {\n const {\n getOverviewStatus,\n show\n } = this;\n const {\n seasons\n } = show;\n const summary = {\n Unaired: 0,\n Skipped: 0,\n Wanted: 0,\n Snatched: 0,\n Preferred: 0,\n Allowed: 0\n };\n seasons.forEach(season => {\n season.episodes.forEach(episode => {\n summary[getOverviewStatus(episode.status, episode.quality, show.config.qualities)] += 1;\n });\n });\n return summary;\n },\n\n changeStatusOptions() {\n const {\n search,\n getStatus,\n statuses\n } = this;\n const {\n general\n } = search;\n\n if (statuses.length === 0) {\n return [];\n } // Get status objects, in this order\n\n\n const defaultOptions = ['wanted', 'skipped', 'ignored', 'downloaded', 'archived'].map(key => getStatus({\n key\n }));\n\n if (general.failedDownloads.enabled) {\n defaultOptions.push(getStatus({\n key: 'failed'\n }));\n }\n\n return defaultOptions;\n },\n\n combinedQualities() {\n const {\n allowed,\n preferred\n } = this.show.config.qualities;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"combineQualities\"])(allowed, preferred);\n },\n\n seasons() {\n const {\n show\n } = this; // Only return an array with seasons (integers)\n\n return show.seasonCount.map(season => season.season);\n }\n\n },\n\n mounted() {\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.$nextTick(() => this.reflowLayout());\n });\n });\n this.$watch('show', function (slug) {\n // eslint-disable-line object-shorthand\n // Show has changed. Meaning we should reflow the layout.\n if (slug) {\n const {\n reflowLayout\n } = this;\n this.$nextTick(() => reflowLayout());\n }\n }, {\n deep: true\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapActions\"])(['setSpecials']),\n combineQualities: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"combineQualities\"],\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n\n changeStatusClicked() {\n const {\n changeStatusOptions,\n changeQualityOptions,\n selectedStatus,\n selectedQuality\n } = this;\n this.$emit('update', {\n newStatus: selectedStatus,\n newQuality: selectedQuality,\n statusOptions: changeStatusOptions,\n qualityOptions: changeQualityOptions\n });\n },\n\n toggleSpecials() {\n const {\n setSpecials\n } = this;\n setSpecials(!this.displaySpecials);\n },\n\n reverse(array) {\n return array ? array.slice().reverse() : [];\n },\n\n dedupeGenres(genres) {\n return genres ? [...new Set(genres.slice(0).map(genre => genre.replace('-', ' ')))] : [];\n },\n\n getCountryISO2ToISO3(country) {\n return Object(country_language__WEBPACK_IMPORTED_MODULE_1__[\"getLanguage\"])(country).iso639_2en;\n },\n\n toggleConfigOption(option) {\n const {\n show\n } = this;\n const {\n config\n } = show;\n this.show.config[option] = !this.show.config[option];\n const data = {\n config: {\n [option]: config[option]\n }\n };\n _api__WEBPACK_IMPORTED_MODULE_4__[\"api\"].patch('series/' + show.id.slug, data).then(_ => {\n this.$snotify.success(`${data.config[option] ? 'enabled' : 'disabled'} show option ${option}`, 'Saved', {\n timeout: 5000\n });\n }).catch(error => {\n this.$snotify.error('Error while trying to save \"' + show.title + '\": ' + error.message || false, 'Error');\n });\n },\n\n reflowLayout() {\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_6__[\"attachImdbTooltip\"])(); // eslint-disable-line no-undef\n }\n\n },\n watch: {\n jumpToSeason(season) {\n // Don't jump until an option is selected\n if (season !== 'jump') {\n // Calculate duration\n let duration = (this.seasons.length - season) * 50;\n duration = Math.max(500, Math.min(duration, 2000)); // Limit to (500ms <= duration <= 2000ms)\n // Calculate offset\n\n let offset = -50; // Navbar\n // Needs extra offset when the sub menu is \"fixed\".\n\n offset -= window.matchMedia('(min-width: 1281px)').matches ? 40 : 0;\n const name = `season-${season}`;\n console.debug(`Jumping to #${name} (${duration}ms)`);\n Object(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__[\"scrollTo\"])(`[name=\"${name}\"]`, duration, {\n container: 'body',\n easing: 'ease-in-out',\n offset\n }); // Update URL hash\n\n window.location.hash = name; // Reset jump\n\n this.jumpToSeason = 'jump';\n }\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-truncate-collapsed */ \"./node_modules/vue-truncate-collapsed/dist/vue-truncate-collapsed.es.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! country-language */ \"./node_modules/country-language/index.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(country_language__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-scrollto */ \"./node_modules/vue-scrollto/vue-scrollto.js\");\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n/**\n * Return the first item of `values` that is not `null`, `undefined` or `NaN`.\n * @param {...any} values - Values to check.\n * @returns {any} - The first item that fits the criteria, `undefined` otherwise.\n */\n\nconst resolveToValue = (...values) => {\n return values.find(value => {\n return !Number.isNaN(value) && value !== null && value !== undefined;\n });\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-header',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"AppLink\"],\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"Asset\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"QualityPill\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"StateSwitch\"],\n Truncate: vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n },\n props: {\n /**\n * Page type: show or snatch-selection\n */\n type: {\n type: String,\n default: 'show',\n validator: value => ['show', 'snatch-selection'].includes(value)\n },\n\n /**\n * Show indexer\n */\n showIndexer: {\n type: String\n },\n\n /**\n * Show id\n */\n showId: {\n type: Number\n },\n\n /**\n * Season\n */\n showSeason: {\n type: Number\n },\n\n /**\n * Episode\n */\n showEpisode: {\n type: Number\n },\n\n /**\n * Manual Search Type (snatch-selection)\n */\n manualSearchType: {\n type: String\n }\n },\n\n data() {\n return {\n jumpToSeason: 'jump',\n selectedStatus: 'Change status to:',\n selectedQuality: 'Change quality to:',\n overviewStatus: [{\n id: 'wanted',\n checked: true,\n name: 'Wanted'\n }, {\n id: 'allowed',\n checked: true,\n name: 'Allowed'\n }, {\n id: 'preferred',\n checked: true,\n name: 'Preferred'\n }, {\n id: 'skipped',\n checked: true,\n name: 'Skipped'\n }, {\n id: 'snatched',\n checked: true,\n name: 'Snatched'\n }]\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n shows: state => state.shows.shows,\n indexers: state => state.config.indexers,\n indexerConfig: state => state.config.indexers.indexers,\n displaySpecials: state => state.config.layout.show.specials,\n qualities: state => state.config.consts.qualities.values,\n statuses: state => state.config.consts.statuses,\n search: state => state.config.search,\n configLoaded: state => state.config.layout.fanartBackground !== null\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapGetters\"])({\n show: 'getCurrentShow',\n getEpisode: 'getEpisode',\n getOverviewStatus: 'getOverviewStatus',\n getQualityPreset: 'getQualityPreset',\n getStatus: 'getStatus'\n }),\n\n indexer() {\n return this.showIndexer || this.$route.query.indexername;\n },\n\n id() {\n return this.showId || Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return resolveToValue(this.showSeason, Number(this.$route.query.season));\n },\n\n episode() {\n return resolveToValue(this.showEpisode, Number(this.$route.query.episode));\n },\n\n showIndexerUrl() {\n const {\n show,\n indexerConfig\n } = this;\n\n if (!show.indexer) {\n return;\n }\n\n const id = show.id[show.indexer];\n const indexerUrl = indexerConfig[show.indexer].showUrl;\n return `${indexerUrl}${id}`;\n },\n\n activeShowQueueStatuses() {\n const {\n showQueueStatus\n } = this.show;\n\n if (!showQueueStatus) {\n return [];\n }\n\n return showQueueStatus.filter(status => status.active === true);\n },\n\n showGenres() {\n const {\n show,\n dedupeGenres\n } = this;\n const {\n imdbInfo\n } = show;\n const {\n genres\n } = imdbInfo;\n let result = [];\n\n if (genres) {\n result = dedupeGenres(genres.split('|'));\n }\n\n return result;\n },\n\n episodeSummary() {\n const {\n getOverviewStatus,\n show\n } = this;\n const {\n seasons\n } = show;\n const summary = {\n Unaired: 0,\n Skipped: 0,\n Wanted: 0,\n Snatched: 0,\n Preferred: 0,\n Allowed: 0\n };\n seasons.forEach(season => {\n season.episodes.forEach(episode => {\n summary[getOverviewStatus(episode.status, episode.quality, show.config.qualities)] += 1;\n });\n });\n return summary;\n },\n\n changeStatusOptions() {\n const {\n search,\n getStatus,\n statuses\n } = this;\n const {\n general\n } = search;\n\n if (statuses.length === 0) {\n return [];\n } // Get status objects, in this order\n\n\n const defaultOptions = ['wanted', 'skipped', 'ignored', 'downloaded', 'archived'].map(key => getStatus({\n key\n }));\n\n if (general.failedDownloads.enabled) {\n defaultOptions.push(getStatus({\n key: 'failed'\n }));\n }\n\n return defaultOptions;\n },\n\n combinedQualities() {\n const {\n allowed,\n preferred\n } = this.show.config.qualities;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"combineQualities\"])(allowed, preferred);\n },\n\n seasons() {\n const {\n show\n } = this; // Only return an array with seasons (integers)\n\n return show.seasonCount.map(season => season.season);\n },\n\n episodeTitle() {\n const {\n getEpisode,\n show,\n season,\n episode\n } = this;\n\n if (!(show.id.slug && season && episode)) {\n return '';\n }\n\n const curEpisode = getEpisode({\n showSlug: show.id.slug,\n season,\n episode\n });\n\n if (curEpisode) {\n return curEpisode.title;\n }\n\n return '';\n }\n\n },\n\n mounted() {\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.$nextTick(() => this.reflowLayout());\n });\n });\n this.$watch('show', function (slug) {\n // eslint-disable-line object-shorthand\n // Show has changed. Meaning we should reflow the layout.\n if (slug) {\n const {\n reflowLayout\n } = this;\n this.$nextTick(() => reflowLayout());\n }\n }, {\n deep: true\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapActions\"])(['setSpecials']),\n combineQualities: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"combineQualities\"],\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n\n changeStatusClicked() {\n const {\n changeStatusOptions,\n changeQualityOptions,\n selectedStatus,\n selectedQuality\n } = this;\n this.$emit('update', {\n newStatus: selectedStatus,\n newQuality: selectedQuality,\n statusOptions: changeStatusOptions,\n qualityOptions: changeQualityOptions\n });\n },\n\n toggleSpecials() {\n const {\n setSpecials\n } = this;\n setSpecials(!this.displaySpecials);\n },\n\n reverse(array) {\n return array ? array.slice().reverse() : [];\n },\n\n dedupeGenres(genres) {\n return genres ? [...new Set(genres.slice(0).map(genre => genre.replace('-', ' ')))] : [];\n },\n\n getCountryISO2ToISO3(country) {\n return Object(country_language__WEBPACK_IMPORTED_MODULE_1__[\"getLanguage\"])(country).iso639_2en;\n },\n\n toggleConfigOption(option) {\n const {\n show\n } = this;\n const {\n config\n } = show;\n this.show.config[option] = !this.show.config[option];\n const data = {\n config: {\n [option]: config[option]\n }\n };\n _api__WEBPACK_IMPORTED_MODULE_4__[\"api\"].patch('series/' + show.id.slug, data).then(_ => {\n this.$snotify.success(`${data.config[option] ? 'enabled' : 'disabled'} show option ${option}`, 'Saved', {\n timeout: 5000\n });\n }).catch(error => {\n this.$snotify.error('Error while trying to save \"' + show.title + '\": ' + error.message || false, 'Error');\n });\n },\n\n reflowLayout() {\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_6__[\"attachImdbTooltip\"])(); // eslint-disable-line no-undef\n }\n\n },\n watch: {\n jumpToSeason(season) {\n // Don't jump until an option is selected\n if (season !== 'jump') {\n // Calculate duration\n let duration = (this.seasons.length - season) * 50;\n duration = Math.max(500, Math.min(duration, 2000)); // Limit to (500ms <= duration <= 2000ms)\n // Calculate offset\n\n let offset = -50; // Navbar\n // Needs extra offset when the sub menu is \"fixed\".\n\n offset -= window.matchMedia('(min-width: 1281px)').matches ? 40 : 0;\n const name = `season-${season}`;\n console.debug(`Jumping to #${name} (${duration}ms)`);\n Object(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__[\"scrollTo\"])(`[name=\"${name}\"]`, duration, {\n container: 'body',\n easing: 'ease-in-out',\n offset\n }); // Update URL hash\n\n window.location.hash = name; // Reset jump\n\n this.jumpToSeason = 'jump';\n }\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -931,7 +931,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.summaryTable[data-v-2465ca06] {\\n overflow: hidden;\\n}\\n.summaryTable tr td[data-v-2465ca06] {\\n word-break: break-word;\\n}\\n.ver-spacer[data-v-2465ca06] {\\n width: 15px;\\n}\\n#show-specials-and-seasons[data-v-2465ca06] {\\n margin-bottom: 15px;\\n}\\nspan.required[data-v-2465ca06] {\\n color: green;\\n}\\nspan.preferred[data-v-2465ca06] {\\n color: rgb(41, 87, 48);\\n}\\nspan.undesired[data-v-2465ca06] {\\n color: orange;\\n}\\nspan.ignored[data-v-2465ca06] {\\n color: red;\\n}\\n.shadow-background[data-v-2465ca06] {\\n padding: 10px;\\n}\\n#col-show-summary[data-v-2465ca06] {\\n display: table;\\n}\\n#col-show-summary[data-v-2465ca06] img.show-image {\\n width: 180px;\\n}\\n.show-poster-container[data-v-2465ca06] {\\n margin-right: 10px;\\n display: table-cell;\\n width: 180px;\\n}\\n.show-info-container[data-v-2465ca06] {\\n overflow: hidden;\\n display: table-cell;\\n}\\n.showLegend[data-v-2465ca06] {\\n padding-right: 6px;\\n padding-bottom: 1px;\\n width: 150px;\\n}\\n.invalid-value[data-v-2465ca06] {\\n color: rgb(255, 0, 0);\\n}\\n@media (min-width: 768px) {\\n.display-specials[data-v-2465ca06],\\n .display-seasons[data-v-2465ca06] {\\n top: -60px;\\n}\\n#show-specials-and-seasons[data-v-2465ca06] {\\n bottom: 5px;\\n right: 15px;\\n position: absolute;\\n}\\n}\\n@media (max-width: 767px) {\\n.show-poster-container[data-v-2465ca06] {\\n display: inline-block;\\n width: 100%;\\n margin: 0 auto;\\n border-style: none;\\n}\\n.show-poster-container[data-v-2465ca06] img {\\n display: block;\\n margin: 0 auto;\\n max-width: 280px !important;\\n}\\n.show-info-container[data-v-2465ca06] {\\n display: block;\\n padding-top: 5px;\\n width: 100%;\\n}\\n}\\n@media (max-width: 991px) and (min-width: 768px) {\\n.show-poster-container[data-v-2465ca06] {\\n float: left;\\n display: inline-block;\\n width: 100%;\\n border-style: none;\\n}\\n.show-info-container[data-v-2465ca06] {\\n display: block;\\n width: 100%;\\n}\\n#col-show-summary[data-v-2465ca06] img.show-image {\\n width: 280px;\\n}\\n}\\n.unaired[data-v-2465ca06] {\\n background-color: rgb(245, 241, 228);\\n}\\n.skipped[data-v-2465ca06] {\\n background-color: rgb(190, 222, 237);\\n}\\n.preferred[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.archived[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.allowed[data-v-2465ca06] {\\n background-color: rgb(255, 218, 138);\\n}\\n.wanted[data-v-2465ca06] {\\n background-color: rgb(255, 176, 176);\\n}\\n.snatched[data-v-2465ca06] {\\n background-color: rgb(235, 193, 234);\\n}\\n.downloaded[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.failed[data-v-2465ca06] {\\n background-color: rgb(255, 153, 153);\\n}\\nspan.unaired[data-v-2465ca06] {\\n color: rgb(88, 75, 32);\\n}\\nspan.skipped[data-v-2465ca06] {\\n color: rgb(29, 80, 104);\\n}\\nspan.preffered[data-v-2465ca06] {\\n color: rgb(41, 87, 48);\\n}\\nspan.allowed[data-v-2465ca06] {\\n color: rgb(118, 81, 0);\\n}\\nspan.wanted[data-v-2465ca06] {\\n color: rgb(137, 0, 0);\\n}\\nspan.snatched[data-v-2465ca06] {\\n color: rgb(101, 33, 100);\\n}\\nspan.unaired b[data-v-2465ca06],\\nspan.skipped b[data-v-2465ca06],\\nspan.preferred b[data-v-2465ca06],\\nspan.allowed b[data-v-2465ca06],\\nspan.wanted b[data-v-2465ca06],\\nspan.snatched b[data-v-2465ca06] {\\n color: rgb(0, 0, 0);\\n font-weight: 800;\\n}\\nspan.global-filter[data-v-2465ca06] {\\n font-style: italic;\\n}\\n.show-status[data-v-2465ca06] {\\n font-size: 11px;\\n text-align: left;\\n display: block;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.summaryTable[data-v-2465ca06] {\\n overflow: hidden;\\n}\\n.summaryTable tr td[data-v-2465ca06] {\\n word-break: break-word;\\n}\\n.ver-spacer[data-v-2465ca06] {\\n width: 15px;\\n}\\n#showtitle[data-v-2465ca06] {\\n float: none;\\n}\\n#show-specials-and-seasons[data-v-2465ca06] {\\n bottom: 5px;\\n right: 15px;\\n position: absolute;\\n}\\n.episode-info span[data-v-2465ca06] {\\n display: block;\\n}\\nspan.required[data-v-2465ca06] {\\n color: green;\\n}\\nspan.preferred[data-v-2465ca06] {\\n color: rgb(41, 87, 48);\\n}\\nspan.undesired[data-v-2465ca06] {\\n color: orange;\\n}\\nspan.ignored[data-v-2465ca06] {\\n color: red;\\n}\\n.shadow-background[data-v-2465ca06] {\\n padding: 10px;\\n}\\n#col-show-summary[data-v-2465ca06] {\\n display: table;\\n}\\n#col-show-summary[data-v-2465ca06] img.show-image {\\n width: 180px;\\n}\\n.show-poster-container[data-v-2465ca06] {\\n margin-right: 10px;\\n display: table-cell;\\n width: 180px;\\n}\\n.show-info-container[data-v-2465ca06] {\\n overflow: hidden;\\n display: table-cell;\\n}\\n.showLegend[data-v-2465ca06] {\\n padding-right: 6px;\\n padding-bottom: 1px;\\n width: 150px;\\n}\\n.invalid-value[data-v-2465ca06] {\\n color: rgb(255, 0, 0);\\n}\\n@media (min-width: 768px) {\\n.display-specials[data-v-2465ca06],\\n .display-seasons[data-v-2465ca06] {\\n top: -60px;\\n}\\n}\\n@media (max-width: 767px) {\\n.show-poster-container[data-v-2465ca06] {\\n display: inline-block;\\n width: 100%;\\n margin: 0 auto;\\n border-style: none;\\n}\\n.show-poster-container[data-v-2465ca06] img {\\n display: block;\\n margin: 0 auto;\\n max-width: 280px !important;\\n}\\n.show-info-container[data-v-2465ca06] {\\n display: block;\\n padding-top: 5px;\\n width: 100%;\\n}\\n#showtitle[data-v-2465ca06] {\\n margin-bottom: 40px;\\n}\\n#show-specials-and-seasons[data-v-2465ca06] {\\n bottom: -40px;\\n left: 15px;\\n}\\n}\\n@media (max-width: 991px) and (min-width: 768px) {\\n.show-poster-container[data-v-2465ca06] {\\n float: left;\\n display: inline-block;\\n width: 100%;\\n border-style: none;\\n}\\n.show-info-container[data-v-2465ca06] {\\n display: block;\\n width: 100%;\\n}\\n#col-show-summary[data-v-2465ca06] img.show-image {\\n width: 280px;\\n}\\n}\\n.unaired[data-v-2465ca06] {\\n background-color: rgb(245, 241, 228);\\n}\\n.skipped[data-v-2465ca06] {\\n background-color: rgb(190, 222, 237);\\n}\\n.preferred[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.archived[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.allowed[data-v-2465ca06] {\\n background-color: rgb(255, 218, 138);\\n}\\n.wanted[data-v-2465ca06] {\\n background-color: rgb(255, 176, 176);\\n}\\n.snatched[data-v-2465ca06] {\\n background-color: rgb(235, 193, 234);\\n}\\n.downloaded[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.failed[data-v-2465ca06] {\\n background-color: rgb(255, 153, 153);\\n}\\nspan.unaired[data-v-2465ca06] {\\n color: rgb(88, 75, 32);\\n}\\nspan.skipped[data-v-2465ca06] {\\n color: rgb(29, 80, 104);\\n}\\nspan.preffered[data-v-2465ca06] {\\n color: rgb(41, 87, 48);\\n}\\nspan.allowed[data-v-2465ca06] {\\n color: rgb(118, 81, 0);\\n}\\nspan.wanted[data-v-2465ca06] {\\n color: rgb(137, 0, 0);\\n}\\nspan.snatched[data-v-2465ca06] {\\n color: rgb(101, 33, 100);\\n}\\nspan.unaired b[data-v-2465ca06],\\nspan.skipped b[data-v-2465ca06],\\nspan.preferred b[data-v-2465ca06],\\nspan.allowed b[data-v-2465ca06],\\nspan.wanted b[data-v-2465ca06],\\nspan.snatched b[data-v-2465ca06] {\\n color: rgb(0, 0, 0);\\n font-weight: 800;\\n}\\nspan.global-filter[data-v-2465ca06] {\\n font-style: italic;\\n}\\n.show-status[data-v-2465ca06] {\\n font-size: 11px;\\n text-align: left;\\n display: block;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1477,7 +1477,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"show-header-container\" },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"col-lg-12\",\n attrs: { id: \"showtitle\", \"data-showname\": _vm.show.title }\n },\n [\n _c(\"div\", [\n _c(\n \"h1\",\n {\n staticClass: \"title\",\n attrs: {\n \"data-indexer-name\": _vm.show.indexer,\n \"data-series-id\": _vm.show.id[_vm.show.indexer],\n id: \"scene_exception_\" + _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _vm.type === \"snatch-selection\"\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\"\\n Manual search for:\"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n ),\n _vm._v(\" / Season \" + _vm._s(_vm.season)),\n _vm.episode !== undefined &&\n _vm.manualSearchType !== \"season\"\n ? [_vm._v(\" Episode \" + _vm._s(_vm.episode))]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.type !== \"snatch-selection\" && _vm.seasons.length >= 1\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _vm.seasons.includes(0)\n ? _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Display Specials: \"\n ),\n _c(\n \"a\",\n {\n staticClass: \"inner\",\n staticStyle: { cursor: \"pointer\" },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.toggleSpecials()\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n _vm.displaySpecials ? \"Hide\" : \"Show\"\n )\n )\n ]\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"h2footer display-seasons clear\" },\n [\n _c(\n \"span\",\n [\n _vm.seasons.length >= 15\n ? _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.jumpToSeason,\n expression: \"jumpToSeason\"\n }\n ],\n staticClass: \"form-control input-sm\",\n staticStyle: { position: \"relative\" },\n attrs: { id: \"seasonJump\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.jumpToSeason = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { value: \"jump\" } },\n [_vm._v(\"Jump to Season\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.seasons, function(\n seasonNumber\n ) {\n return _c(\n \"option\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n domProps: { value: seasonNumber }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : \"Season \" + seasonNumber\n ) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n )\n : _vm.seasons.length >= 1\n ? [\n _vm._v(\n \"\\n Season:\\n \"\n ),\n _vm._l(_vm.reverse(_vm.seasons), function(\n seasonNumber,\n index\n ) {\n return [\n _c(\n \"app-link\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n attrs: {\n href: \"#season-\" + seasonNumber\n },\n nativeOn: {\n click: function($event) {\n $event.preventDefault()\n _vm.jumpToSeason = seasonNumber\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : seasonNumber\n ) +\n \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n index !== _vm.seasons.length - 1\n ? _c(\n \"span\",\n {\n key: \"separator-\" + index,\n staticClass: \"separator\"\n },\n [_vm._v(\"| \")]\n )\n : _vm._e()\n ]\n })\n ]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _vm._l(_vm.activeShowQueueStatuses, function(queueItem) {\n return _c(\"div\", { key: queueItem.action, staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"alert alert-info\" }, [\n _vm._v(\"\\n \" + _vm._s(queueItem.message) + \"\\n \")\n ])\n ])\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"summaryBackground\" }\n },\n [\n _c(\"div\", { staticClass: \"row\", attrs: { id: \"row-show-summary\" } }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { id: \"col-show-summary\" } },\n [\n _c(\"div\", { staticClass: \"show-poster-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"image-flex-container col-md-12\" },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/poster.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"posterThumb\",\n cls: \"show-image shadow\",\n link: true\n }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"ver-spacer\" }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-info-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"pull-right col-lg-3 col-md-3 hidden-sm hidden-xs\"\n },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/banner.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"banner\",\n cls: \"show-banner pull-right shadow\",\n link: true\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"show-rating\" }\n },\n [\n _vm.show.rating.imdb && _vm.show.rating.imdb.rating\n ? _c(\n \"span\",\n {\n staticClass: \"imdbstars\",\n attrs: {\n \"qtip-content\":\n _vm.show.rating.imdb.rating +\n \" / 10 Stars
    \" +\n _vm.show.rating.imdb.votes +\n \" Votes\"\n }\n },\n [\n _c(\"span\", {\n style: {\n width:\n Number(_vm.show.rating.imdb.rating) * 10 +\n \"%\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n !_vm.show.id.imdb\n ? [\n _vm.show.year.start\n ? _c(\"span\", [\n _vm._v(\n \"(\" +\n _vm._s(_vm.show.year.start) +\n \") - \" +\n _vm._s(_vm.show.runtime) +\n \" minutes - \"\n )\n ])\n : _vm._e()\n ]\n : [\n _vm._l(_vm.show.countryCodes, function(country) {\n return _c(\"img\", {\n key: \"flag-\" + country,\n class: [\"country-flag\", \"flag-\" + country],\n staticStyle: {\n \"margin-left\": \"3px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n src: \"images/blank.png\",\n width: \"16\",\n height: \"11\"\n }\n })\n }),\n _vm._v(\" \"),\n _vm.show.imdbInfo.year\n ? _c(\"span\", [\n _vm._v(\n \"\\n (\" +\n _vm._s(_vm.show.imdbInfo.year) +\n \") -\\n \"\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.imdbInfo.runtimes ||\n _vm.show.runtime\n ) +\n \" minutes\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb,\n title:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _vm.show.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[_vm.show.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl,\n title: _vm.showIndexerUrl\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[_vm.show.indexer].name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[_vm.show.indexer].icon\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.xemNumbering &&\n _vm.show.xemNumbering.length > 0\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://thexem.de/search?q=\" +\n _vm.show.title,\n title:\n \"http://thexem.de/search?q=\" +\n _vm.show.title\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[xem]\",\n height: \"16\",\n width: \"16\",\n src: \"images/xem.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.id.tvdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://fanart.tv/series/\" +\n _vm.show.id.tvdb,\n title:\n \"https://fanart.tv/series/\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\"img\", {\n staticClass: \"fanart\",\n attrs: {\n alt: \"[fanart.tv]\",\n height: \"16\",\n width: \"16\",\n src: \"images/fanart.tv.png\"\n }\n })\n ]\n )\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"tags\" }\n },\n [\n _vm.show.genres\n ? _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(\n _vm.dedupeGenres(_vm.show.genres),\n function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://trakt.tv/shows/popular/?genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on trakt.tv\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }\n ),\n 1\n )\n : _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(_vm.showGenres, function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://www.imdb.com/search/title?count=100&title_type=tv_series&genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on IMDB\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }),\n 1\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.configLoaded\n ? _c(\n \"div\",\n {\n ref: \"summary\",\n staticClass: \"col-md-12\",\n attrs: { id: \"summary\" }\n },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-9 col-md-8 col-sm-8 col-xs-12\",\n class: {\n summaryFanArt: _vm.layout.fanartBackground\n },\n attrs: { id: \"show-summary\" }\n },\n [\n _c(\n \"table\",\n { staticClass: \"summaryTable pull-left\" },\n [\n _vm.show.plot\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticStyle: {\n \"padding-bottom\": \"15px\"\n },\n attrs: { colspan: \"2\" }\n },\n [\n _c(\"truncate\", {\n attrs: {\n length: 250,\n clamp: \"show more...\",\n less: \"show less...\",\n text: _vm.show.plot\n },\n on: {\n toggle: function($event) {\n return _vm.$emit(\"reflow\")\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.getQualityPreset({\n value: _vm.combinedQualities\n }) !== undefined\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Quality:\")]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\"quality-pill\", {\n attrs: {\n quality:\n _vm.combinedQualities\n }\n })\n ],\n 1\n )\n ])\n : [\n _vm.combineQualities(\n _vm.show.config.qualities.allowed\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Allowed Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.allowed,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"allowed-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.combineQualities(\n _vm.show.config.qualities\n .preferred\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Preferred Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.preferred,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"preferred-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n _vm._v(\" \"),\n _vm.show.network && _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\n \" on \" +\n _vm._s(_vm.show.network)\n )\n ])\n ])\n : _vm.show.network\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.network))\n ])\n ])\n : _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Show Status: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.status))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Default EP Status: \")]\n ),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config\n .defaultEpisodeStatus\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [_vm._v(\"Location: \")]\n )\n ]\n ),\n _c(\"td\", [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [\n _vm._v(\n _vm._s(_vm.show.config.location)\n )\n ]\n ),\n _vm._v(\n _vm._s(\n _vm.show.config.locationValid\n ? \"\"\n : \" (Missing)\"\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _vm.show.config.aliases.filter(function(\n alias\n ) {\n return alias.season === -1\n }).length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [_vm._v(\"Scene Name:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.aliases\n .filter(function(alias) {\n return alias.season === -1\n })\n .map(function(alias) {\n return alias.title\n })\n .join(\", \")\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.requiredWords\n .length +\n _vm.search.filters.required.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n required:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Required Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .requiredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.requiredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.required\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .requiredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .requiredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.required.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.ignoredWords\n .length +\n _vm.search.filters.ignored.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n ignored:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Ignored Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .ignoredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.ignoredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.ignored\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .ignoredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .ignoredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.ignored.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.preferred.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n preferred:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Preferred Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.preferred.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.undesired.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n undesired:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Undesired Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.undesired.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.whitelist &&\n _vm.show.config.release.whitelist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Wanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.whitelist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.blacklist &&\n _vm.show.config.release.blacklist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Unwanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.blacklist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.airdateOffset !== 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Daily search offset:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.airdateOffset\n ) + \" hours\"\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.locationValid &&\n _vm.show.size > -1\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Size:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.humanFileSize(\n _vm.show.size\n )\n )\n )\n ])\n ])\n : _vm._e()\n ],\n 2\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-3 col-md-4 col-sm-4 col-xs-12 pull-xs-left\",\n attrs: { id: \"show-status\" }\n },\n [\n _c(\n \"table\",\n {\n staticClass:\n \"pull-xs-left pull-md-right pull-sm-right pull-lg-right\"\n },\n [\n _vm.show.language\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Info Language:\")]\n ),\n _c(\"td\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n _vm.getCountryISO2ToISO3(\n _vm.show.language\n ) +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: _vm.show.language,\n title: _vm.show.language,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.config.subtitles.enabled\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Subtitles: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .subtitlesEnabled\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"subtitlesEnabled\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Season Folders: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .seasonFolders ||\n _vm.config.namingForceFolders\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Paused: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.paused\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"paused\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Air-by-Date: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.airByDate\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"airByDate\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Sports: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.sports\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"sports\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Anime: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.anime\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"anime\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"DVD Order: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.dvdOrder\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"dvdOrder\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Scene Numbering: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.scene\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"scene\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n ]\n )\n ]\n )\n ])\n ]\n )\n : _vm._e()\n ])\n ])\n ]\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"episodes-controll-background\" }\n },\n [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"row\",\n attrs: { id: \"row-show-episodes-controls\" }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12\",\n attrs: { id: \"col-show-episodes-controls\" }\n },\n [\n _vm.type === \"show\"\n ? _c(\"div\", { staticClass: \"row key\" }, [\n _c(\n \"div\",\n {\n ref: \"checkboxControls\",\n staticClass: \"col-lg-12\",\n attrs: { id: \"checkboxControls\" }\n },\n [\n _vm.show.seasons\n ? _c(\n \"div\",\n {\n staticClass: \"pull-left top-5\",\n attrs: { id: \"key-padding\" }\n },\n _vm._l(_vm.overviewStatus, function(\n status\n ) {\n return _c(\n \"label\",\n {\n key: status.id,\n attrs: { for: status.id }\n },\n [\n _c(\"span\", { class: status.id }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: status.checked,\n expression: \"status.checked\"\n }\n ],\n attrs: {\n type: \"checkbox\",\n id: status.id\n },\n domProps: {\n checked: Array.isArray(\n status.checked\n )\n ? _vm._i(\n status.checked,\n null\n ) > -1\n : status.checked\n },\n on: {\n change: [\n function($event) {\n var $$a = status.checked,\n $$el = $event.target,\n $$c = $$el.checked\n ? true\n : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(\n status,\n \"checked\",\n $$a.concat([$$v])\n )\n } else {\n $$i > -1 &&\n _vm.$set(\n status,\n \"checked\",\n $$a\n .slice(0, $$i)\n .concat(\n $$a.slice(\n $$i + 1\n )\n )\n )\n }\n } else {\n _vm.$set(\n status,\n \"checked\",\n $$c\n )\n }\n },\n function($event) {\n return _vm.$emit(\n \"update-overview-status\",\n _vm.overviewStatus\n )\n }\n ]\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \": \"\n ),\n _c(\"b\", [\n _vm._v(\n _vm._s(\n _vm.episodeSummary[\n status.name\n ]\n )\n )\n ])\n ])\n ]\n )\n }),\n 0\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"pull-lg-right top-5\" },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedStatus,\n expression: \"selectedStatus\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"statusSelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedStatus = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change status to:\"\n }\n },\n [_vm._v(\"Change status to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(\n _vm.changeStatusOptions,\n function(status) {\n return _c(\n \"option\",\n {\n key: status.key,\n domProps: {\n value: status.value\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \"\\n \"\n )\n ]\n )\n }\n )\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedQuality,\n expression: \"selectedQuality\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"qualitySelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedQuality = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change quality to:\"\n }\n },\n [_vm._v(\"Change quality to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.qualities, function(\n quality\n ) {\n return _c(\n \"option\",\n {\n key: quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-slug\"\n },\n domProps: { value: _vm.show.id.slug }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-id\"\n },\n domProps: {\n value: _vm.show.id[_vm.show.indexer]\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"indexer\" },\n domProps: { value: _vm.show.indexer }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n id: \"changeStatus\",\n value: \"Go\"\n },\n on: { click: _vm.changeStatusClicked }\n })\n ]\n )\n ]\n )\n ])\n : _c(\"div\")\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"show-header-container\" },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"col-lg-12\",\n attrs: { id: \"showtitle\", \"data-showname\": _vm.show.title }\n },\n [\n _c(\"div\", [\n _c(\n \"h1\",\n {\n staticClass: \"title\",\n attrs: {\n \"data-indexer-name\": _vm.show.indexer,\n \"data-series-id\": _vm.show.id[_vm.show.indexer],\n id: \"scene_exception_\" + _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _vm.type === \"snatch-selection\"\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right episode-info\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Manual search for: Season \" +\n _vm._s(_vm.season)\n ),\n _vm.episode !== undefined &&\n _vm.manualSearchType !== \"season\"\n ? [_vm._v(\" Episode \" + _vm._s(_vm.episode))]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.episodeTitle) +\n \"\\n \"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.type !== \"snatch-selection\" && _vm.seasons.length >= 1\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _vm.seasons.includes(0)\n ? _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Display Specials: \"\n ),\n _c(\n \"a\",\n {\n staticClass: \"inner\",\n staticStyle: { cursor: \"pointer\" },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.toggleSpecials()\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n _vm.displaySpecials ? \"Hide\" : \"Show\"\n )\n )\n ]\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"h2footer display-seasons clear\" },\n [\n _c(\n \"span\",\n [\n _vm.seasons.length >= 15\n ? _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.jumpToSeason,\n expression: \"jumpToSeason\"\n }\n ],\n staticClass: \"form-control input-sm\",\n staticStyle: { position: \"relative\" },\n attrs: { id: \"seasonJump\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.jumpToSeason = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { value: \"jump\" } },\n [_vm._v(\"Jump to Season\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.seasons, function(\n seasonNumber\n ) {\n return _c(\n \"option\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n domProps: { value: seasonNumber }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : \"Season \" + seasonNumber\n ) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n )\n : _vm.seasons.length >= 1\n ? [\n _vm._v(\n \"\\n Season:\\n \"\n ),\n _vm._l(_vm.reverse(_vm.seasons), function(\n seasonNumber,\n index\n ) {\n return [\n _c(\n \"app-link\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n attrs: {\n href: \"#season-\" + seasonNumber\n },\n nativeOn: {\n click: function($event) {\n $event.preventDefault()\n _vm.jumpToSeason = seasonNumber\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : seasonNumber\n ) +\n \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n index !== _vm.seasons.length - 1\n ? _c(\n \"span\",\n {\n key: \"separator-\" + index,\n staticClass: \"separator\"\n },\n [_vm._v(\"| \")]\n )\n : _vm._e()\n ]\n })\n ]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _vm._l(_vm.activeShowQueueStatuses, function(queueItem) {\n return _c(\"div\", { key: queueItem.action, staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"alert alert-info\" }, [\n _vm._v(\"\\n \" + _vm._s(queueItem.message) + \"\\n \")\n ])\n ])\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"summaryBackground\" }\n },\n [\n _c(\"div\", { staticClass: \"row\", attrs: { id: \"row-show-summary\" } }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { id: \"col-show-summary\" } },\n [\n _c(\"div\", { staticClass: \"show-poster-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"image-flex-container col-md-12\" },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/poster.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"posterThumb\",\n cls: \"show-image shadow\",\n link: true\n }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"ver-spacer\" }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-info-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"pull-right col-lg-3 col-md-3 hidden-sm hidden-xs\"\n },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/banner.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"banner\",\n cls: \"show-banner pull-right shadow\",\n link: true\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"show-rating\" }\n },\n [\n _vm.show.rating.imdb && _vm.show.rating.imdb.rating\n ? _c(\n \"span\",\n {\n staticClass: \"imdbstars\",\n attrs: {\n \"qtip-content\":\n _vm.show.rating.imdb.rating +\n \" / 10 Stars
    \" +\n _vm.show.rating.imdb.votes +\n \" Votes\"\n }\n },\n [\n _c(\"span\", {\n style: {\n width:\n Number(_vm.show.rating.imdb.rating) * 10 +\n \"%\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n !_vm.show.id.imdb\n ? [\n _vm.show.year.start\n ? _c(\"span\", [\n _vm._v(\n \"(\" +\n _vm._s(_vm.show.year.start) +\n \") - \" +\n _vm._s(_vm.show.runtime) +\n \" minutes - \"\n )\n ])\n : _vm._e()\n ]\n : [\n _vm._l(_vm.show.countryCodes, function(country) {\n return _c(\"img\", {\n key: \"flag-\" + country,\n class: [\"country-flag\", \"flag-\" + country],\n staticStyle: {\n \"margin-left\": \"3px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n src: \"images/blank.png\",\n width: \"16\",\n height: \"11\"\n }\n })\n }),\n _vm._v(\" \"),\n _vm.show.imdbInfo.year\n ? _c(\"span\", [\n _vm._v(\n \"\\n (\" +\n _vm._s(_vm.show.imdbInfo.year) +\n \") -\\n \"\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.imdbInfo.runtimes ||\n _vm.show.runtime\n ) +\n \" minutes\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb,\n title:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _vm.show.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[_vm.show.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl,\n title: _vm.showIndexerUrl\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[_vm.show.indexer].name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[_vm.show.indexer].icon\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.xemNumbering &&\n _vm.show.xemNumbering.length > 0\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://thexem.de/search?q=\" +\n _vm.show.title,\n title:\n \"http://thexem.de/search?q=\" +\n _vm.show.title\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[xem]\",\n height: \"16\",\n width: \"16\",\n src: \"images/xem.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.id.tvdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://fanart.tv/series/\" +\n _vm.show.id.tvdb,\n title:\n \"https://fanart.tv/series/\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\"img\", {\n staticClass: \"fanart\",\n attrs: {\n alt: \"[fanart.tv]\",\n height: \"16\",\n width: \"16\",\n src: \"images/fanart.tv.png\"\n }\n })\n ]\n )\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"tags\" }\n },\n [\n _vm.show.genres\n ? _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(\n _vm.dedupeGenres(_vm.show.genres),\n function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://trakt.tv/shows/popular/?genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on trakt.tv\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }\n ),\n 1\n )\n : _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(_vm.showGenres, function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://www.imdb.com/search/title?count=100&title_type=tv_series&genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on IMDB\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }),\n 1\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.configLoaded\n ? _c(\n \"div\",\n {\n ref: \"summary\",\n staticClass: \"col-md-12\",\n attrs: { id: \"summary\" }\n },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-9 col-md-8 col-sm-8 col-xs-12\",\n class: {\n summaryFanArt: _vm.layout.fanartBackground\n },\n attrs: { id: \"show-summary\" }\n },\n [\n _c(\n \"table\",\n { staticClass: \"summaryTable pull-left\" },\n [\n _vm.show.plot\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticStyle: {\n \"padding-bottom\": \"15px\"\n },\n attrs: { colspan: \"2\" }\n },\n [\n _c(\"truncate\", {\n attrs: {\n length: 250,\n clamp: \"show more...\",\n less: \"show less...\",\n text: _vm.show.plot\n },\n on: {\n toggle: function($event) {\n return _vm.$emit(\"reflow\")\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.getQualityPreset({\n value: _vm.combinedQualities\n }) !== undefined\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Quality:\")]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\"quality-pill\", {\n attrs: {\n quality:\n _vm.combinedQualities\n }\n })\n ],\n 1\n )\n ])\n : [\n _vm.combineQualities(\n _vm.show.config.qualities.allowed\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Allowed Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.allowed,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"allowed-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.combineQualities(\n _vm.show.config.qualities\n .preferred\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Preferred Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.preferred,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"preferred-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n _vm._v(\" \"),\n _vm.show.network && _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\n \" on \" +\n _vm._s(_vm.show.network)\n )\n ])\n ])\n : _vm.show.network\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.network))\n ])\n ])\n : _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Show Status: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.status))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Default EP Status: \")]\n ),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config\n .defaultEpisodeStatus\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [_vm._v(\"Location: \")]\n )\n ]\n ),\n _c(\"td\", [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [\n _vm._v(\n _vm._s(_vm.show.config.location)\n )\n ]\n ),\n _vm._v(\n _vm._s(\n _vm.show.config.locationValid\n ? \"\"\n : \" (Missing)\"\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _vm.show.config.aliases.filter(function(\n alias\n ) {\n return alias.season === -1\n }).length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [_vm._v(\"Scene Name:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.aliases\n .filter(function(alias) {\n return alias.season === -1\n })\n .map(function(alias) {\n return alias.title\n })\n .join(\", \")\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.requiredWords\n .length +\n _vm.search.filters.required.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n required:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Required Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .requiredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.requiredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.required\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .requiredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .requiredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.required.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.ignoredWords\n .length +\n _vm.search.filters.ignored.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n ignored:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Ignored Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .ignoredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.ignoredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.ignored\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .ignoredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .ignoredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.ignored.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.preferred.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n preferred:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Preferred Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.preferred.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.undesired.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n undesired:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Undesired Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.undesired.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.whitelist &&\n _vm.show.config.release.whitelist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Wanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.whitelist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.blacklist &&\n _vm.show.config.release.blacklist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Unwanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.blacklist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.airdateOffset !== 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Daily search offset:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.airdateOffset\n ) + \" hours\"\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.locationValid &&\n _vm.show.size > -1\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Size:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.humanFileSize(\n _vm.show.size\n )\n )\n )\n ])\n ])\n : _vm._e()\n ],\n 2\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-3 col-md-4 col-sm-4 col-xs-12 pull-xs-left\",\n attrs: { id: \"show-status\" }\n },\n [\n _c(\n \"table\",\n {\n staticClass:\n \"pull-xs-left pull-md-right pull-sm-right pull-lg-right\"\n },\n [\n _vm.show.language\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Info Language:\")]\n ),\n _c(\"td\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n _vm.getCountryISO2ToISO3(\n _vm.show.language\n ) +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: _vm.show.language,\n title: _vm.show.language,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.config.subtitles.enabled\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Subtitles: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .subtitlesEnabled\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"subtitlesEnabled\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Season Folders: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .seasonFolders ||\n _vm.config.namingForceFolders\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Paused: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.paused\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"paused\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Air-by-Date: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.airByDate\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"airByDate\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Sports: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.sports\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"sports\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Anime: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.anime\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"anime\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"DVD Order: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.dvdOrder\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"dvdOrder\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Scene Numbering: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.scene\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"scene\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n ]\n )\n ]\n )\n ])\n ]\n )\n : _vm._e()\n ])\n ])\n ]\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"episodes-controll-background\" }\n },\n [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"row\",\n attrs: { id: \"row-show-episodes-controls\" }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12\",\n attrs: { id: \"col-show-episodes-controls\" }\n },\n [\n _vm.type === \"show\"\n ? _c(\"div\", { staticClass: \"row key\" }, [\n _c(\n \"div\",\n {\n ref: \"checkboxControls\",\n staticClass: \"col-lg-12\",\n attrs: { id: \"checkboxControls\" }\n },\n [\n _vm.show.seasons\n ? _c(\n \"div\",\n {\n staticClass: \"pull-left top-5\",\n attrs: { id: \"key-padding\" }\n },\n _vm._l(_vm.overviewStatus, function(\n status\n ) {\n return _c(\n \"label\",\n {\n key: status.id,\n attrs: { for: status.id }\n },\n [\n _c(\"span\", { class: status.id }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: status.checked,\n expression: \"status.checked\"\n }\n ],\n attrs: {\n type: \"checkbox\",\n id: status.id\n },\n domProps: {\n checked: Array.isArray(\n status.checked\n )\n ? _vm._i(\n status.checked,\n null\n ) > -1\n : status.checked\n },\n on: {\n change: [\n function($event) {\n var $$a = status.checked,\n $$el = $event.target,\n $$c = $$el.checked\n ? true\n : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(\n status,\n \"checked\",\n $$a.concat([$$v])\n )\n } else {\n $$i > -1 &&\n _vm.$set(\n status,\n \"checked\",\n $$a\n .slice(0, $$i)\n .concat(\n $$a.slice(\n $$i + 1\n )\n )\n )\n }\n } else {\n _vm.$set(\n status,\n \"checked\",\n $$c\n )\n }\n },\n function($event) {\n return _vm.$emit(\n \"update-overview-status\",\n _vm.overviewStatus\n )\n }\n ]\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \": \"\n ),\n _c(\"b\", [\n _vm._v(\n _vm._s(\n _vm.episodeSummary[\n status.name\n ]\n )\n )\n ])\n ])\n ]\n )\n }),\n 0\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"pull-lg-right top-5\" },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedStatus,\n expression: \"selectedStatus\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"statusSelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedStatus = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change status to:\"\n }\n },\n [_vm._v(\"Change status to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(\n _vm.changeStatusOptions,\n function(status) {\n return _c(\n \"option\",\n {\n key: status.key,\n domProps: {\n value: status.value\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \"\\n \"\n )\n ]\n )\n }\n )\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedQuality,\n expression: \"selectedQuality\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"qualitySelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedQuality = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change quality to:\"\n }\n },\n [_vm._v(\"Change quality to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.qualities, function(\n quality\n ) {\n return _c(\n \"option\",\n {\n key: quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-slug\"\n },\n domProps: { value: _vm.show.id.slug }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-id\"\n },\n domProps: {\n value: _vm.show.id[_vm.show.indexer]\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"indexer\" },\n domProps: { value: _vm.show.indexer }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n id: \"changeStatus\",\n value: \"Go\"\n },\n on: { click: _vm.changeStatusClicked }\n })\n ]\n )\n ]\n )\n ])\n : _c(\"div\")\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -4866,7 +4866,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n/**\n * @typedef {object} ShowIdentifier\n * @property {string} indexer The indexer name (e.g. `tvdb`)\n * @property {number} id The show ID on the indexer (e.g. `12345`)\n */\n\nconst state = {\n shows: [],\n currentShow: {\n indexer: null,\n id: null\n },\n loading: {\n total: null,\n current: null,\n display: false,\n finished: false\n }\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW\"]](state, show) {\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n\n if (!existingShow) {\n console.debug(`Adding ${show.title || show.indexer + String(show.id)} as it wasn't found in the shows array`, show);\n state.shows.push(show);\n return;\n } // Merge new show object over old one\n // this allows detailed queries to update the record\n // without the non-detailed removing the extra data\n\n\n console.debug(`Found ${show.title || show.indexer + String(show.id)} in shows array attempting merge`);\n const newShow = { ...existingShow,\n ...show\n }; // Update state\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.debug(`Merged ${newShow.title || newShow.indexer + String(newShow.id)}`, newShow);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOWS\"]](state, shows) {\n // Quick check on duplicate shows.\n const newShows = shows.filter(newShow => {\n return !state.shows.find(({\n id,\n indexer\n }) => Number(newShow.id[newShow.indexer]) === Number(id[indexer]) && newShow.indexer === indexer);\n });\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state, 'shows', [...state.shows, ...newShows]);\n console.debug(`Added ${shows.length} shows to store`);\n },\n\n currentShow(state, {\n indexer,\n id\n }) {\n state.currentShow.indexer = indexer;\n state.currentShow.id = id;\n },\n\n setLoadingTotal(state, total) {\n state.loading.total = total;\n },\n\n setLoadingCurrent(state, current) {\n state.loading.current = current;\n },\n\n updateLoadingCurrent(state, current) {\n state.loading.current += current;\n },\n\n setLoadingDisplay(state, display) {\n state.loading.display = display;\n },\n\n setLoadingFinished(state, finished) {\n state.loading.finished = finished;\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE\"]](state, {\n show,\n episodes\n }) {\n // Creating a new show object (from the state one) as we want to trigger a store update\n const newShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (!newShow.seasons) {\n newShow.seasons = [];\n } // Recreate an Array with season objects, with each season having an episodes array.\n // This format is used by vue-good-table (displayShow).\n\n\n episodes.forEach(episode => {\n const existingSeason = newShow.seasons.find(season => season.season === episode.season);\n\n if (existingSeason) {\n const foundIndex = existingSeason.episodes.findIndex(element => element.slug === episode.slug);\n\n if (foundIndex === -1) {\n existingSeason.episodes.push(episode);\n } else {\n existingSeason.episodes.splice(foundIndex, 1, episode);\n }\n } else {\n const newSeason = {\n season: episode.season,\n episodes: [],\n html: false,\n mode: 'span',\n label: 1\n };\n newShow.seasons.push(newSeason);\n newSeason.episodes.push(episode);\n }\n }); // Update state\n\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.log(`Storing episodes for show ${newShow.title} seasons: ${[...new Set(episodes.map(episode => episode.season))].join(', ')}`);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_SCENE_EXCEPTION\"]](state, {\n show,\n exception\n }) {\n // Get current show object\n const currentShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (currentShow.config.aliases.find(e => e.title === exception.title && e.season === exception.season)) {\n console.warn(`Can't add exception ${exception.title} with season ${exception.season} to show ${currentShow.title} as it already exists.`);\n return;\n }\n\n currentShow.config.aliases.push(exception);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"REMOVE_SHOW_SCENE_EXCEPTION\"]](state, {\n show,\n exception\n }) {\n // Get current show object\n const currentShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (!currentShow.config.aliases.find(e => e.title === exception.title && e.season === exception.season)) {\n console.warn(`Can't remove exception ${exception.title} with season ${exception.season} to show ${currentShow.title} as it does not exist.`);\n return;\n }\n\n currentShow.config.aliases.splice(currentShow.config.aliases.indexOf(exception), 1);\n }\n\n};\nconst getters = {\n getShowById: state => {\n /**\n * Get a show from the loaded shows state, identified by show ID and indexer name.\n *\n * @param {ShowIdentifier} show Show identifiers.\n * @returns {object|undefined} Show object or undefined if not found.\n */\n const getShowById = ({\n id,\n indexer\n }) => state.shows.find(show => Number(show.id[indexer]) === Number(id));\n\n return getShowById;\n },\n getShowByTitle: state => title => state.shows.find(show => show.title === title),\n getSeason: state => ({\n showSlug,\n season\n }) => {\n const show = state.shows.find(show => show.id.slug === showSlug);\n return show && show.seasons ? show.seasons[season] : undefined;\n },\n getEpisode: state => ({\n showSlug,\n season,\n episode\n }) => {\n const show = state.shows.find(show => show.id.slug === showSlug);\n return show && show.seasons && show.seasons[season] ? show.seasons[season][episode] : undefined;\n },\n getCurrentShow: (state, getters, rootState) => {\n return state.shows.find(show => Number(show.id[state.currentShow.indexer]) === Number(state.currentShow.id)) || rootState.defaults.show;\n },\n showsWithStats: (state, getters, rootState) => {\n if (!state.shows) {\n return [];\n }\n\n return state.shows.map(show => {\n let showStats = rootState.stats.show.stats.find(stat => stat.indexerId === getters.indexerNameToId(show.indexer) && stat.seriesId === show.id[show.indexer]);\n const newLine = '\\u000D';\n let text = 'Unaired';\n let title = '';\n\n if (!showStats) {\n showStats = {\n epDownloaded: 0,\n epSnatched: 0,\n epTotal: 0,\n seriesSize: 0\n };\n }\n\n if (showStats.epTotal >= 1) {\n text = showStats.epDownloaded;\n title = `Downloaded: ${showStats.epDownloaded}`;\n\n if (showStats.epSnatched) {\n text += `+${showStats.epSnatched}`;\n title += `${newLine}Snatched: ${showStats.epSnatched}`;\n }\n\n text += ` / ${showStats.epTotal}`;\n title += `${newLine}Total: ${showStats.epTotal}`;\n }\n\n show.stats = {\n episodes: {\n total: showStats.epTotal,\n snatched: showStats.epSnatched,\n downloaded: showStats.epDownloaded,\n size: showStats.seriesSize\n },\n tooltip: {\n text,\n title,\n percentage: showStats.epDownloaded * 100 / (showStats.epTotal || 1)\n }\n };\n return show;\n });\n }\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n getShow(context, {\n indexer,\n id,\n detailed,\n episodes\n }) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n const params = {};\n let timeout = 30000;\n\n if (detailed !== undefined) {\n params.detailed = detailed;\n timeout = 60000;\n timeout = 60000;\n }\n\n if (episodes !== undefined) {\n params.episodes = episodes;\n timeout = 60000;\n }\n\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/series/${indexer}${id}`, {\n params,\n timeout\n }).then(res => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW\"], res.data);\n resolve(res.data);\n }).catch(error => {\n reject(error);\n });\n });\n },\n\n /**\n * Get episdoes for a specified show from API and commit it to the store.\n *\n * @param {*} context - The store context.\n * @param {ShowParameteres} parameters - Request parameters.\n * @returns {Promise} The API response.\n */\n getEpisodes({\n commit,\n getters\n }, {\n indexer,\n id,\n season\n }) {\n return new Promise((resolve, reject) => {\n const {\n getShowById\n } = getters;\n const show = getShowById({\n id,\n indexer\n });\n const limit = 1000;\n const params = {\n limit\n };\n\n if (season !== undefined) {\n params.season = season;\n } // Get episodes\n\n\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/series/${indexer}${id}/episodes`, {\n params\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE\"], {\n show,\n episodes: response.data\n });\n resolve();\n }).catch(error => {\n console.log(`Could not retrieve a episodes for show ${indexer}${id}, error: ${error}`);\n reject(error);\n });\n });\n },\n\n /**\n * Get shows from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n getShows(context, shows) {\n const {\n commit,\n dispatch\n } = context; // If no shows are provided get the first 1000\n\n if (!shows) {\n // Loading new shows, commit show loading information to state.\n commit('setLoadingTotal', 0);\n commit('setLoadingCurrent', 0);\n commit('setLoadingDisplay', true);\n const limit = 1000;\n const page = 1;\n const params = {\n limit,\n page\n };\n const pageRequests = []; // Get first page\n\n pageRequests.push(_api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/series', {\n params\n }).then(response => {\n commit('setLoadingTotal', Number(response.headers['x-pagination-count']));\n const totalPages = Number(response.headers['x-pagination-total']);\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOWS\"], response.data);\n commit('updateLoadingCurrent', response.data.length); // Optionally get additional pages\n\n for (let page = 2; page <= totalPages; page++) {\n const newPage = {\n page\n };\n newPage.limit = params.limit;\n pageRequests.push(_api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/series', {\n params: newPage\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOWS\"], response.data);\n commit('updateLoadingCurrent', response.data.length);\n }));\n }\n }).catch(() => {\n console.log('Could not retrieve a list of shows');\n }));\n return Promise.all(pageRequests);\n }\n\n return shows.forEach(show => dispatch('getShow', show));\n },\n\n setShow(context, {\n indexer,\n id,\n data\n }) {\n // Update show, updated show will arrive over a WebSocket message\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch(`series/${indexer}${id}`, data);\n },\n\n updateShow(context, show) {\n // Update local store\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW\"], show);\n },\n\n addSceneException(context, {\n show,\n exception\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_SCENE_EXCEPTION\"], {\n show,\n exception\n });\n },\n\n removeSceneException(context, {\n show,\n exception\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"REMOVE_SHOW_SCENE_EXCEPTION\"], {\n show,\n exception\n });\n },\n\n setCurrentShow(context, {\n indexer,\n id\n }) {\n // Set current show\n const {\n commit\n } = context;\n return commit('currentShow', {\n indexer,\n id\n });\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/shows.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n/**\n * @typedef {object} ShowIdentifier\n * @property {string} indexer The indexer name (e.g. `tvdb`)\n * @property {number} id The show ID on the indexer (e.g. `12345`)\n */\n\nconst state = {\n shows: [],\n currentShow: {\n indexer: null,\n id: null\n },\n loading: {\n total: null,\n current: null,\n display: false,\n finished: false\n }\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW\"]](state, show) {\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n\n if (!existingShow) {\n console.debug(`Adding ${show.title || show.indexer + String(show.id)} as it wasn't found in the shows array`, show);\n state.shows.push(show);\n return;\n } // Merge new show object over old one\n // this allows detailed queries to update the record\n // without the non-detailed removing the extra data\n\n\n console.debug(`Found ${show.title || show.indexer + String(show.id)} in shows array attempting merge`);\n const newShow = { ...existingShow,\n ...show\n }; // Update state\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.debug(`Merged ${newShow.title || newShow.indexer + String(newShow.id)}`, newShow);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOWS\"]](state, shows) {\n // Quick check on duplicate shows.\n const newShows = shows.filter(newShow => {\n return !state.shows.find(({\n id,\n indexer\n }) => Number(newShow.id[newShow.indexer]) === Number(id[indexer]) && newShow.indexer === indexer);\n });\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state, 'shows', [...state.shows, ...newShows]);\n console.debug(`Added ${shows.length} shows to store`);\n },\n\n currentShow(state, {\n indexer,\n id\n }) {\n state.currentShow.indexer = indexer;\n state.currentShow.id = id;\n },\n\n setLoadingTotal(state, total) {\n state.loading.total = total;\n },\n\n setLoadingCurrent(state, current) {\n state.loading.current = current;\n },\n\n updateLoadingCurrent(state, current) {\n state.loading.current += current;\n },\n\n setLoadingDisplay(state, display) {\n state.loading.display = display;\n },\n\n setLoadingFinished(state, finished) {\n state.loading.finished = finished;\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE\"]](state, {\n show,\n episodes\n }) {\n // Creating a new show object (from the state one) as we want to trigger a store update\n const newShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (!newShow.seasons) {\n newShow.seasons = [];\n } // Recreate an Array with season objects, with each season having an episodes array.\n // This format is used by vue-good-table (displayShow).\n\n\n episodes.forEach(episode => {\n const existingSeason = newShow.seasons.find(season => season.season === episode.season);\n\n if (existingSeason) {\n const foundIndex = existingSeason.episodes.findIndex(element => element.slug === episode.slug);\n\n if (foundIndex === -1) {\n existingSeason.episodes.push(episode);\n } else {\n existingSeason.episodes.splice(foundIndex, 1, episode);\n }\n } else {\n const newSeason = {\n season: episode.season,\n episodes: [],\n html: false,\n mode: 'span',\n label: 1\n };\n newShow.seasons.push(newSeason);\n newSeason.episodes.push(episode);\n }\n }); // Update state\n\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.log(`Storing episodes for show ${newShow.title} seasons: ${[...new Set(episodes.map(episode => episode.season))].join(', ')}`);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_SCENE_EXCEPTION\"]](state, {\n show,\n exception\n }) {\n // Get current show object\n const currentShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (currentShow.config.aliases.find(e => e.title === exception.title && e.season === exception.season)) {\n console.warn(`Can't add exception ${exception.title} with season ${exception.season} to show ${currentShow.title} as it already exists.`);\n return;\n }\n\n currentShow.config.aliases.push(exception);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"REMOVE_SHOW_SCENE_EXCEPTION\"]](state, {\n show,\n exception\n }) {\n // Get current show object\n const currentShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (!currentShow.config.aliases.find(e => e.title === exception.title && e.season === exception.season)) {\n console.warn(`Can't remove exception ${exception.title} with season ${exception.season} to show ${currentShow.title} as it does not exist.`);\n return;\n }\n\n currentShow.config.aliases.splice(currentShow.config.aliases.indexOf(exception), 1);\n }\n\n};\nconst getters = {\n getShowById: state => {\n /**\n * Get a show from the loaded shows state, identified by show ID and indexer name.\n *\n * @param {ShowIdentifier} show Show identifiers.\n * @returns {object|undefined} Show object or undefined if not found.\n */\n const getShowById = ({\n id,\n indexer\n }) => state.shows.find(show => Number(show.id[indexer]) === Number(id));\n\n return getShowById;\n },\n getShowByTitle: state => title => state.shows.find(show => show.title === title),\n getSeason: state => ({\n showSlug,\n season\n }) => {\n const show = state.shows.find(show => show.id.slug === showSlug);\n return show && show.seasons ? show.seasons[season] : undefined;\n },\n getEpisode: state => ({\n showSlug,\n season,\n episode\n }) => {\n const show = state.shows.find(show => show.id.slug === showSlug);\n return show && show.seasons && show.seasons.find(s => s.season === season) ? show.seasons.find(s => s.season === season).episodes.find(ep => ep.episode === episode) : undefined;\n },\n getCurrentShow: (state, getters, rootState) => {\n return state.shows.find(show => Number(show.id[state.currentShow.indexer]) === Number(state.currentShow.id)) || rootState.defaults.show;\n },\n showsWithStats: (state, getters, rootState) => {\n if (!state.shows) {\n return [];\n }\n\n return state.shows.map(show => {\n let showStats = rootState.stats.show.stats.find(stat => stat.indexerId === getters.indexerNameToId(show.indexer) && stat.seriesId === show.id[show.indexer]);\n const newLine = '\\u000D';\n let text = 'Unaired';\n let title = '';\n\n if (!showStats) {\n showStats = {\n epDownloaded: 0,\n epSnatched: 0,\n epTotal: 0,\n seriesSize: 0\n };\n }\n\n if (showStats.epTotal >= 1) {\n text = showStats.epDownloaded;\n title = `Downloaded: ${showStats.epDownloaded}`;\n\n if (showStats.epSnatched) {\n text += `+${showStats.epSnatched}`;\n title += `${newLine}Snatched: ${showStats.epSnatched}`;\n }\n\n text += ` / ${showStats.epTotal}`;\n title += `${newLine}Total: ${showStats.epTotal}`;\n }\n\n show.stats = {\n episodes: {\n total: showStats.epTotal,\n snatched: showStats.epSnatched,\n downloaded: showStats.epDownloaded,\n size: showStats.seriesSize\n },\n tooltip: {\n text,\n title,\n percentage: showStats.epDownloaded * 100 / (showStats.epTotal || 1)\n }\n };\n return show;\n });\n }\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n getShow(context, {\n indexer,\n id,\n detailed,\n episodes\n }) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n const params = {};\n let timeout = 30000;\n\n if (detailed !== undefined) {\n params.detailed = detailed;\n timeout = 60000;\n timeout = 60000;\n }\n\n if (episodes !== undefined) {\n params.episodes = episodes;\n timeout = 60000;\n }\n\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/series/${indexer}${id}`, {\n params,\n timeout\n }).then(res => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW\"], res.data);\n resolve(res.data);\n }).catch(error => {\n reject(error);\n });\n });\n },\n\n /**\n * Get episdoes for a specified show from API and commit it to the store.\n *\n * @param {*} context - The store context.\n * @param {ShowParameteres} parameters - Request parameters.\n * @returns {Promise} The API response.\n */\n getEpisodes({\n commit,\n getters\n }, {\n indexer,\n id,\n season\n }) {\n return new Promise((resolve, reject) => {\n const {\n getShowById\n } = getters;\n const show = getShowById({\n id,\n indexer\n });\n const limit = 1000;\n const params = {\n limit\n };\n\n if (season !== undefined) {\n params.season = season;\n } // Get episodes\n\n\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/series/${indexer}${id}/episodes`, {\n params\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE\"], {\n show,\n episodes: response.data\n });\n resolve();\n }).catch(error => {\n console.log(`Could not retrieve a episodes for show ${indexer}${id}, error: ${error}`);\n reject(error);\n });\n });\n },\n\n /**\n * Get shows from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n getShows(context, shows) {\n const {\n commit,\n dispatch\n } = context; // If no shows are provided get the first 1000\n\n if (!shows) {\n // Loading new shows, commit show loading information to state.\n commit('setLoadingTotal', 0);\n commit('setLoadingCurrent', 0);\n commit('setLoadingDisplay', true);\n const limit = 1000;\n const page = 1;\n const params = {\n limit,\n page\n };\n const pageRequests = []; // Get first page\n\n pageRequests.push(_api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/series', {\n params\n }).then(response => {\n commit('setLoadingTotal', Number(response.headers['x-pagination-count']));\n const totalPages = Number(response.headers['x-pagination-total']);\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOWS\"], response.data);\n commit('updateLoadingCurrent', response.data.length); // Optionally get additional pages\n\n for (let page = 2; page <= totalPages; page++) {\n const newPage = {\n page\n };\n newPage.limit = params.limit;\n pageRequests.push(_api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/series', {\n params: newPage\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOWS\"], response.data);\n commit('updateLoadingCurrent', response.data.length);\n }));\n }\n }).catch(() => {\n console.log('Could not retrieve a list of shows');\n }));\n return Promise.all(pageRequests);\n }\n\n return shows.forEach(show => dispatch('getShow', show));\n },\n\n setShow(context, {\n indexer,\n id,\n data\n }) {\n // Update show, updated show will arrive over a WebSocket message\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch(`series/${indexer}${id}`, data);\n },\n\n updateShow(context, show) {\n // Update local store\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW\"], show);\n },\n\n addSceneException(context, {\n show,\n exception\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_SCENE_EXCEPTION\"], {\n show,\n exception\n });\n },\n\n removeSceneException(context, {\n show,\n exception\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"REMOVE_SHOW_SCENE_EXCEPTION\"], {\n show,\n exception\n });\n },\n\n setCurrentShow(context, {\n indexer,\n id\n }) {\n // Set current show\n const {\n commit\n } = context;\n return commit('currentShow', {\n indexer,\n id\n });\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/shows.js?"); /***/ }), diff --git a/themes/light/assets/js/medusa-runtime.js b/themes/light/assets/js/medusa-runtime.js index f4ea990bbc..8065f9fcf5 100644 --- a/themes/light/assets/js/medusa-runtime.js +++ b/themes/light/assets/js/medusa-runtime.js @@ -524,7 +524,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-truncate-collapsed */ \"./node_modules/vue-truncate-collapsed/dist/vue-truncate-collapsed.es.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! country-language */ \"./node_modules/country-language/index.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(country_language__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-scrollto */ \"./node_modules/vue-scrollto/vue-scrollto.js\");\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n/**\n * Return the first item of `values` that is not `null`, `undefined` or `NaN`.\n * @param {...any} values - Values to check.\n * @returns {any} - The first item that fits the criteria, `undefined` otherwise.\n */\n\nconst resolveToValue = (...values) => {\n return values.find(value => {\n return !Number.isNaN(value) && value !== null && value !== undefined;\n });\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-header',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"AppLink\"],\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"Asset\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"QualityPill\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"StateSwitch\"],\n Truncate: vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n },\n props: {\n /**\n * Page type: show or snatch-selection\n */\n type: {\n type: String,\n default: 'show',\n validator: value => ['show', 'snatch-selection'].includes(value)\n },\n\n /**\n * Show indexer\n */\n showIndexer: {\n type: String\n },\n\n /**\n * Show id\n */\n showId: {\n type: Number\n },\n\n /**\n * Season\n */\n showSeason: {\n type: Number\n },\n\n /**\n * Episode\n */\n showEpisode: {\n type: Number\n },\n\n /**\n * Manual Search Type (snatch-selection)\n */\n manualSearchType: {\n type: String\n }\n },\n\n data() {\n return {\n jumpToSeason: 'jump',\n selectedStatus: 'Change status to:',\n selectedQuality: 'Change quality to:',\n overviewStatus: [{\n id: 'wanted',\n checked: true,\n name: 'Wanted'\n }, {\n id: 'allowed',\n checked: true,\n name: 'Allowed'\n }, {\n id: 'preferred',\n checked: true,\n name: 'Preferred'\n }, {\n id: 'skipped',\n checked: true,\n name: 'Skipped'\n }, {\n id: 'snatched',\n checked: true,\n name: 'Snatched'\n }]\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n shows: state => state.shows.shows,\n indexers: state => state.config.indexers,\n indexerConfig: state => state.config.indexers.indexers,\n displaySpecials: state => state.config.layout.show.specials,\n qualities: state => state.config.consts.qualities.values,\n statuses: state => state.config.consts.statuses,\n search: state => state.config.search,\n configLoaded: state => state.config.layout.fanartBackground !== null\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapGetters\"])({\n show: 'getCurrentShow',\n getOverviewStatus: 'getOverviewStatus',\n getQualityPreset: 'getQualityPreset',\n getStatus: 'getStatus'\n }),\n\n indexer() {\n return this.showIndexer || this.$route.query.indexername;\n },\n\n id() {\n return this.showId || Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return resolveToValue(this.showSeason, Number(this.$route.query.season));\n },\n\n episode() {\n return resolveToValue(this.showEpisode, Number(this.$route.query.episode));\n },\n\n showIndexerUrl() {\n const {\n show,\n indexerConfig\n } = this;\n\n if (!show.indexer) {\n return;\n }\n\n const id = show.id[show.indexer];\n const indexerUrl = indexerConfig[show.indexer].showUrl;\n return `${indexerUrl}${id}`;\n },\n\n activeShowQueueStatuses() {\n const {\n showQueueStatus\n } = this.show;\n\n if (!showQueueStatus) {\n return [];\n }\n\n return showQueueStatus.filter(status => status.active === true);\n },\n\n showGenres() {\n const {\n show,\n dedupeGenres\n } = this;\n const {\n imdbInfo\n } = show;\n const {\n genres\n } = imdbInfo;\n let result = [];\n\n if (genres) {\n result = dedupeGenres(genres.split('|'));\n }\n\n return result;\n },\n\n episodeSummary() {\n const {\n getOverviewStatus,\n show\n } = this;\n const {\n seasons\n } = show;\n const summary = {\n Unaired: 0,\n Skipped: 0,\n Wanted: 0,\n Snatched: 0,\n Preferred: 0,\n Allowed: 0\n };\n seasons.forEach(season => {\n season.episodes.forEach(episode => {\n summary[getOverviewStatus(episode.status, episode.quality, show.config.qualities)] += 1;\n });\n });\n return summary;\n },\n\n changeStatusOptions() {\n const {\n search,\n getStatus,\n statuses\n } = this;\n const {\n general\n } = search;\n\n if (statuses.length === 0) {\n return [];\n } // Get status objects, in this order\n\n\n const defaultOptions = ['wanted', 'skipped', 'ignored', 'downloaded', 'archived'].map(key => getStatus({\n key\n }));\n\n if (general.failedDownloads.enabled) {\n defaultOptions.push(getStatus({\n key: 'failed'\n }));\n }\n\n return defaultOptions;\n },\n\n combinedQualities() {\n const {\n allowed,\n preferred\n } = this.show.config.qualities;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"combineQualities\"])(allowed, preferred);\n },\n\n seasons() {\n const {\n show\n } = this; // Only return an array with seasons (integers)\n\n return show.seasonCount.map(season => season.season);\n }\n\n },\n\n mounted() {\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.$nextTick(() => this.reflowLayout());\n });\n });\n this.$watch('show', function (slug) {\n // eslint-disable-line object-shorthand\n // Show has changed. Meaning we should reflow the layout.\n if (slug) {\n const {\n reflowLayout\n } = this;\n this.$nextTick(() => reflowLayout());\n }\n }, {\n deep: true\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapActions\"])(['setSpecials']),\n combineQualities: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"combineQualities\"],\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n\n changeStatusClicked() {\n const {\n changeStatusOptions,\n changeQualityOptions,\n selectedStatus,\n selectedQuality\n } = this;\n this.$emit('update', {\n newStatus: selectedStatus,\n newQuality: selectedQuality,\n statusOptions: changeStatusOptions,\n qualityOptions: changeQualityOptions\n });\n },\n\n toggleSpecials() {\n const {\n setSpecials\n } = this;\n setSpecials(!this.displaySpecials);\n },\n\n reverse(array) {\n return array ? array.slice().reverse() : [];\n },\n\n dedupeGenres(genres) {\n return genres ? [...new Set(genres.slice(0).map(genre => genre.replace('-', ' ')))] : [];\n },\n\n getCountryISO2ToISO3(country) {\n return Object(country_language__WEBPACK_IMPORTED_MODULE_1__[\"getLanguage\"])(country).iso639_2en;\n },\n\n toggleConfigOption(option) {\n const {\n show\n } = this;\n const {\n config\n } = show;\n this.show.config[option] = !this.show.config[option];\n const data = {\n config: {\n [option]: config[option]\n }\n };\n _api__WEBPACK_IMPORTED_MODULE_4__[\"api\"].patch('series/' + show.id.slug, data).then(_ => {\n this.$snotify.success(`${data.config[option] ? 'enabled' : 'disabled'} show option ${option}`, 'Saved', {\n timeout: 5000\n });\n }).catch(error => {\n this.$snotify.error('Error while trying to save \"' + show.title + '\": ' + error.message || false, 'Error');\n });\n },\n\n reflowLayout() {\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_6__[\"attachImdbTooltip\"])(); // eslint-disable-line no-undef\n }\n\n },\n watch: {\n jumpToSeason(season) {\n // Don't jump until an option is selected\n if (season !== 'jump') {\n // Calculate duration\n let duration = (this.seasons.length - season) * 50;\n duration = Math.max(500, Math.min(duration, 2000)); // Limit to (500ms <= duration <= 2000ms)\n // Calculate offset\n\n let offset = -50; // Navbar\n // Needs extra offset when the sub menu is \"fixed\".\n\n offset -= window.matchMedia('(min-width: 1281px)').matches ? 40 : 0;\n const name = `season-${season}`;\n console.debug(`Jumping to #${name} (${duration}ms)`);\n Object(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__[\"scrollTo\"])(`[name=\"${name}\"]`, duration, {\n container: 'body',\n easing: 'ease-in-out',\n offset\n }); // Update URL hash\n\n window.location.hash = name; // Reset jump\n\n this.jumpToSeason = 'jump';\n }\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-truncate-collapsed */ \"./node_modules/vue-truncate-collapsed/dist/vue-truncate-collapsed.es.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! country-language */ \"./node_modules/country-language/index.js\");\n/* harmony import */ var country_language__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(country_language__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-scrollto */ \"./node_modules/vue-scrollto/vue-scrollto.js\");\n/* harmony import */ var vue_scrollto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _utils_jquery__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/jquery */ \"./src/utils/jquery.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n/**\n * Return the first item of `values` that is not `null`, `undefined` or `NaN`.\n * @param {...any} values - Values to check.\n * @returns {any} - The first item that fits the criteria, `undefined` otherwise.\n */\n\nconst resolveToValue = (...values) => {\n return values.find(value => {\n return !Number.isNaN(value) && value !== null && value !== undefined;\n });\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-header',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"AppLink\"],\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"Asset\"],\n QualityPill: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"QualityPill\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_7__[\"StateSwitch\"],\n Truncate: vue_truncate_collapsed__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n },\n props: {\n /**\n * Page type: show or snatch-selection\n */\n type: {\n type: String,\n default: 'show',\n validator: value => ['show', 'snatch-selection'].includes(value)\n },\n\n /**\n * Show indexer\n */\n showIndexer: {\n type: String\n },\n\n /**\n * Show id\n */\n showId: {\n type: Number\n },\n\n /**\n * Season\n */\n showSeason: {\n type: Number\n },\n\n /**\n * Episode\n */\n showEpisode: {\n type: Number\n },\n\n /**\n * Manual Search Type (snatch-selection)\n */\n manualSearchType: {\n type: String\n }\n },\n\n data() {\n return {\n jumpToSeason: 'jump',\n selectedStatus: 'Change status to:',\n selectedQuality: 'Change quality to:',\n overviewStatus: [{\n id: 'wanted',\n checked: true,\n name: 'Wanted'\n }, {\n id: 'allowed',\n checked: true,\n name: 'Allowed'\n }, {\n id: 'preferred',\n checked: true,\n name: 'Preferred'\n }, {\n id: 'skipped',\n checked: true,\n name: 'Skipped'\n }, {\n id: 'snatched',\n checked: true,\n name: 'Snatched'\n }]\n };\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n shows: state => state.shows.shows,\n indexers: state => state.config.indexers,\n indexerConfig: state => state.config.indexers.indexers,\n displaySpecials: state => state.config.layout.show.specials,\n qualities: state => state.config.consts.qualities.values,\n statuses: state => state.config.consts.statuses,\n search: state => state.config.search,\n configLoaded: state => state.config.layout.fanartBackground !== null\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapGetters\"])({\n show: 'getCurrentShow',\n getEpisode: 'getEpisode',\n getOverviewStatus: 'getOverviewStatus',\n getQualityPreset: 'getQualityPreset',\n getStatus: 'getStatus'\n }),\n\n indexer() {\n return this.showIndexer || this.$route.query.indexername;\n },\n\n id() {\n return this.showId || Number(this.$route.query.seriesid) || undefined;\n },\n\n season() {\n return resolveToValue(this.showSeason, Number(this.$route.query.season));\n },\n\n episode() {\n return resolveToValue(this.showEpisode, Number(this.$route.query.episode));\n },\n\n showIndexerUrl() {\n const {\n show,\n indexerConfig\n } = this;\n\n if (!show.indexer) {\n return;\n }\n\n const id = show.id[show.indexer];\n const indexerUrl = indexerConfig[show.indexer].showUrl;\n return `${indexerUrl}${id}`;\n },\n\n activeShowQueueStatuses() {\n const {\n showQueueStatus\n } = this.show;\n\n if (!showQueueStatus) {\n return [];\n }\n\n return showQueueStatus.filter(status => status.active === true);\n },\n\n showGenres() {\n const {\n show,\n dedupeGenres\n } = this;\n const {\n imdbInfo\n } = show;\n const {\n genres\n } = imdbInfo;\n let result = [];\n\n if (genres) {\n result = dedupeGenres(genres.split('|'));\n }\n\n return result;\n },\n\n episodeSummary() {\n const {\n getOverviewStatus,\n show\n } = this;\n const {\n seasons\n } = show;\n const summary = {\n Unaired: 0,\n Skipped: 0,\n Wanted: 0,\n Snatched: 0,\n Preferred: 0,\n Allowed: 0\n };\n seasons.forEach(season => {\n season.episodes.forEach(episode => {\n summary[getOverviewStatus(episode.status, episode.quality, show.config.qualities)] += 1;\n });\n });\n return summary;\n },\n\n changeStatusOptions() {\n const {\n search,\n getStatus,\n statuses\n } = this;\n const {\n general\n } = search;\n\n if (statuses.length === 0) {\n return [];\n } // Get status objects, in this order\n\n\n const defaultOptions = ['wanted', 'skipped', 'ignored', 'downloaded', 'archived'].map(key => getStatus({\n key\n }));\n\n if (general.failedDownloads.enabled) {\n defaultOptions.push(getStatus({\n key: 'failed'\n }));\n }\n\n return defaultOptions;\n },\n\n combinedQualities() {\n const {\n allowed,\n preferred\n } = this.show.config.qualities;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"combineQualities\"])(allowed, preferred);\n },\n\n seasons() {\n const {\n show\n } = this; // Only return an array with seasons (integers)\n\n return show.seasonCount.map(season => season.season);\n },\n\n episodeTitle() {\n const {\n getEpisode,\n show,\n season,\n episode\n } = this;\n\n if (!(show.id.slug && season && episode)) {\n return '';\n }\n\n const curEpisode = getEpisode({\n showSlug: show.id.slug,\n season,\n episode\n });\n\n if (curEpisode) {\n return curEpisode.title;\n }\n\n return '';\n }\n\n },\n\n mounted() {\n ['load', 'resize'].map(event => {\n return window.addEventListener(event, () => {\n this.$nextTick(() => this.reflowLayout());\n });\n });\n this.$watch('show', function (slug) {\n // eslint-disable-line object-shorthand\n // Show has changed. Meaning we should reflow the layout.\n if (slug) {\n const {\n reflowLayout\n } = this;\n this.$nextTick(() => reflowLayout());\n }\n }, {\n deep: true\n });\n },\n\n methods: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_3__[\"mapActions\"])(['setSpecials']),\n combineQualities: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"combineQualities\"],\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n\n changeStatusClicked() {\n const {\n changeStatusOptions,\n changeQualityOptions,\n selectedStatus,\n selectedQuality\n } = this;\n this.$emit('update', {\n newStatus: selectedStatus,\n newQuality: selectedQuality,\n statusOptions: changeStatusOptions,\n qualityOptions: changeQualityOptions\n });\n },\n\n toggleSpecials() {\n const {\n setSpecials\n } = this;\n setSpecials(!this.displaySpecials);\n },\n\n reverse(array) {\n return array ? array.slice().reverse() : [];\n },\n\n dedupeGenres(genres) {\n return genres ? [...new Set(genres.slice(0).map(genre => genre.replace('-', ' ')))] : [];\n },\n\n getCountryISO2ToISO3(country) {\n return Object(country_language__WEBPACK_IMPORTED_MODULE_1__[\"getLanguage\"])(country).iso639_2en;\n },\n\n toggleConfigOption(option) {\n const {\n show\n } = this;\n const {\n config\n } = show;\n this.show.config[option] = !this.show.config[option];\n const data = {\n config: {\n [option]: config[option]\n }\n };\n _api__WEBPACK_IMPORTED_MODULE_4__[\"api\"].patch('series/' + show.id.slug, data).then(_ => {\n this.$snotify.success(`${data.config[option] ? 'enabled' : 'disabled'} show option ${option}`, 'Saved', {\n timeout: 5000\n });\n }).catch(error => {\n this.$snotify.error('Error while trying to save \"' + show.title + '\": ' + error.message || false, 'Error');\n });\n },\n\n reflowLayout() {\n Object(_utils_jquery__WEBPACK_IMPORTED_MODULE_6__[\"attachImdbTooltip\"])(); // eslint-disable-line no-undef\n }\n\n },\n watch: {\n jumpToSeason(season) {\n // Don't jump until an option is selected\n if (season !== 'jump') {\n // Calculate duration\n let duration = (this.seasons.length - season) * 50;\n duration = Math.max(500, Math.min(duration, 2000)); // Limit to (500ms <= duration <= 2000ms)\n // Calculate offset\n\n let offset = -50; // Navbar\n // Needs extra offset when the sub menu is \"fixed\".\n\n offset -= window.matchMedia('(min-width: 1281px)').matches ? 40 : 0;\n const name = `season-${season}`;\n console.debug(`Jumping to #${name} (${duration}ms)`);\n Object(vue_scrollto__WEBPACK_IMPORTED_MODULE_2__[\"scrollTo\"])(`[name=\"${name}\"]`, duration, {\n container: 'body',\n easing: 'ease-in-out',\n offset\n }); // Update URL hash\n\n window.location.hash = name; // Reset jump\n\n this.jumpToSeason = 'jump';\n }\n }\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -931,7 +931,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.summaryTable[data-v-2465ca06] {\\n overflow: hidden;\\n}\\n.summaryTable tr td[data-v-2465ca06] {\\n word-break: break-word;\\n}\\n.ver-spacer[data-v-2465ca06] {\\n width: 15px;\\n}\\n#show-specials-and-seasons[data-v-2465ca06] {\\n margin-bottom: 15px;\\n}\\nspan.required[data-v-2465ca06] {\\n color: green;\\n}\\nspan.preferred[data-v-2465ca06] {\\n color: rgb(41, 87, 48);\\n}\\nspan.undesired[data-v-2465ca06] {\\n color: orange;\\n}\\nspan.ignored[data-v-2465ca06] {\\n color: red;\\n}\\n.shadow-background[data-v-2465ca06] {\\n padding: 10px;\\n}\\n#col-show-summary[data-v-2465ca06] {\\n display: table;\\n}\\n#col-show-summary[data-v-2465ca06] img.show-image {\\n width: 180px;\\n}\\n.show-poster-container[data-v-2465ca06] {\\n margin-right: 10px;\\n display: table-cell;\\n width: 180px;\\n}\\n.show-info-container[data-v-2465ca06] {\\n overflow: hidden;\\n display: table-cell;\\n}\\n.showLegend[data-v-2465ca06] {\\n padding-right: 6px;\\n padding-bottom: 1px;\\n width: 150px;\\n}\\n.invalid-value[data-v-2465ca06] {\\n color: rgb(255, 0, 0);\\n}\\n@media (min-width: 768px) {\\n.display-specials[data-v-2465ca06],\\n .display-seasons[data-v-2465ca06] {\\n top: -60px;\\n}\\n#show-specials-and-seasons[data-v-2465ca06] {\\n bottom: 5px;\\n right: 15px;\\n position: absolute;\\n}\\n}\\n@media (max-width: 767px) {\\n.show-poster-container[data-v-2465ca06] {\\n display: inline-block;\\n width: 100%;\\n margin: 0 auto;\\n border-style: none;\\n}\\n.show-poster-container[data-v-2465ca06] img {\\n display: block;\\n margin: 0 auto;\\n max-width: 280px !important;\\n}\\n.show-info-container[data-v-2465ca06] {\\n display: block;\\n padding-top: 5px;\\n width: 100%;\\n}\\n}\\n@media (max-width: 991px) and (min-width: 768px) {\\n.show-poster-container[data-v-2465ca06] {\\n float: left;\\n display: inline-block;\\n width: 100%;\\n border-style: none;\\n}\\n.show-info-container[data-v-2465ca06] {\\n display: block;\\n width: 100%;\\n}\\n#col-show-summary[data-v-2465ca06] img.show-image {\\n width: 280px;\\n}\\n}\\n.unaired[data-v-2465ca06] {\\n background-color: rgb(245, 241, 228);\\n}\\n.skipped[data-v-2465ca06] {\\n background-color: rgb(190, 222, 237);\\n}\\n.preferred[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.archived[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.allowed[data-v-2465ca06] {\\n background-color: rgb(255, 218, 138);\\n}\\n.wanted[data-v-2465ca06] {\\n background-color: rgb(255, 176, 176);\\n}\\n.snatched[data-v-2465ca06] {\\n background-color: rgb(235, 193, 234);\\n}\\n.downloaded[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.failed[data-v-2465ca06] {\\n background-color: rgb(255, 153, 153);\\n}\\nspan.unaired[data-v-2465ca06] {\\n color: rgb(88, 75, 32);\\n}\\nspan.skipped[data-v-2465ca06] {\\n color: rgb(29, 80, 104);\\n}\\nspan.preffered[data-v-2465ca06] {\\n color: rgb(41, 87, 48);\\n}\\nspan.allowed[data-v-2465ca06] {\\n color: rgb(118, 81, 0);\\n}\\nspan.wanted[data-v-2465ca06] {\\n color: rgb(137, 0, 0);\\n}\\nspan.snatched[data-v-2465ca06] {\\n color: rgb(101, 33, 100);\\n}\\nspan.unaired b[data-v-2465ca06],\\nspan.skipped b[data-v-2465ca06],\\nspan.preferred b[data-v-2465ca06],\\nspan.allowed b[data-v-2465ca06],\\nspan.wanted b[data-v-2465ca06],\\nspan.snatched b[data-v-2465ca06] {\\n color: rgb(0, 0, 0);\\n font-weight: 800;\\n}\\nspan.global-filter[data-v-2465ca06] {\\n font-style: italic;\\n}\\n.show-status[data-v-2465ca06] {\\n font-size: 11px;\\n text-align: left;\\n display: block;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.summaryTable[data-v-2465ca06] {\\n overflow: hidden;\\n}\\n.summaryTable tr td[data-v-2465ca06] {\\n word-break: break-word;\\n}\\n.ver-spacer[data-v-2465ca06] {\\n width: 15px;\\n}\\n#showtitle[data-v-2465ca06] {\\n float: none;\\n}\\n#show-specials-and-seasons[data-v-2465ca06] {\\n bottom: 5px;\\n right: 15px;\\n position: absolute;\\n}\\n.episode-info span[data-v-2465ca06] {\\n display: block;\\n}\\nspan.required[data-v-2465ca06] {\\n color: green;\\n}\\nspan.preferred[data-v-2465ca06] {\\n color: rgb(41, 87, 48);\\n}\\nspan.undesired[data-v-2465ca06] {\\n color: orange;\\n}\\nspan.ignored[data-v-2465ca06] {\\n color: red;\\n}\\n.shadow-background[data-v-2465ca06] {\\n padding: 10px;\\n}\\n#col-show-summary[data-v-2465ca06] {\\n display: table;\\n}\\n#col-show-summary[data-v-2465ca06] img.show-image {\\n width: 180px;\\n}\\n.show-poster-container[data-v-2465ca06] {\\n margin-right: 10px;\\n display: table-cell;\\n width: 180px;\\n}\\n.show-info-container[data-v-2465ca06] {\\n overflow: hidden;\\n display: table-cell;\\n}\\n.showLegend[data-v-2465ca06] {\\n padding-right: 6px;\\n padding-bottom: 1px;\\n width: 150px;\\n}\\n.invalid-value[data-v-2465ca06] {\\n color: rgb(255, 0, 0);\\n}\\n@media (min-width: 768px) {\\n.display-specials[data-v-2465ca06],\\n .display-seasons[data-v-2465ca06] {\\n top: -60px;\\n}\\n}\\n@media (max-width: 767px) {\\n.show-poster-container[data-v-2465ca06] {\\n display: inline-block;\\n width: 100%;\\n margin: 0 auto;\\n border-style: none;\\n}\\n.show-poster-container[data-v-2465ca06] img {\\n display: block;\\n margin: 0 auto;\\n max-width: 280px !important;\\n}\\n.show-info-container[data-v-2465ca06] {\\n display: block;\\n padding-top: 5px;\\n width: 100%;\\n}\\n#showtitle[data-v-2465ca06] {\\n margin-bottom: 40px;\\n}\\n#show-specials-and-seasons[data-v-2465ca06] {\\n bottom: -40px;\\n left: 15px;\\n}\\n}\\n@media (max-width: 991px) and (min-width: 768px) {\\n.show-poster-container[data-v-2465ca06] {\\n float: left;\\n display: inline-block;\\n width: 100%;\\n border-style: none;\\n}\\n.show-info-container[data-v-2465ca06] {\\n display: block;\\n width: 100%;\\n}\\n#col-show-summary[data-v-2465ca06] img.show-image {\\n width: 280px;\\n}\\n}\\n.unaired[data-v-2465ca06] {\\n background-color: rgb(245, 241, 228);\\n}\\n.skipped[data-v-2465ca06] {\\n background-color: rgb(190, 222, 237);\\n}\\n.preferred[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.archived[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.allowed[data-v-2465ca06] {\\n background-color: rgb(255, 218, 138);\\n}\\n.wanted[data-v-2465ca06] {\\n background-color: rgb(255, 176, 176);\\n}\\n.snatched[data-v-2465ca06] {\\n background-color: rgb(235, 193, 234);\\n}\\n.downloaded[data-v-2465ca06] {\\n background-color: rgb(195, 227, 200);\\n}\\n.failed[data-v-2465ca06] {\\n background-color: rgb(255, 153, 153);\\n}\\nspan.unaired[data-v-2465ca06] {\\n color: rgb(88, 75, 32);\\n}\\nspan.skipped[data-v-2465ca06] {\\n color: rgb(29, 80, 104);\\n}\\nspan.preffered[data-v-2465ca06] {\\n color: rgb(41, 87, 48);\\n}\\nspan.allowed[data-v-2465ca06] {\\n color: rgb(118, 81, 0);\\n}\\nspan.wanted[data-v-2465ca06] {\\n color: rgb(137, 0, 0);\\n}\\nspan.snatched[data-v-2465ca06] {\\n color: rgb(101, 33, 100);\\n}\\nspan.unaired b[data-v-2465ca06],\\nspan.skipped b[data-v-2465ca06],\\nspan.preferred b[data-v-2465ca06],\\nspan.allowed b[data-v-2465ca06],\\nspan.wanted b[data-v-2465ca06],\\nspan.snatched b[data-v-2465ca06] {\\n color: rgb(0, 0, 0);\\n font-weight: 800;\\n}\\nspan.global-filter[data-v-2465ca06] {\\n font-style: italic;\\n}\\n.show-status[data-v-2465ca06] {\\n font-size: 11px;\\n text-align: left;\\n display: block;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1477,7 +1477,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"show-header-container\" },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"col-lg-12\",\n attrs: { id: \"showtitle\", \"data-showname\": _vm.show.title }\n },\n [\n _c(\"div\", [\n _c(\n \"h1\",\n {\n staticClass: \"title\",\n attrs: {\n \"data-indexer-name\": _vm.show.indexer,\n \"data-series-id\": _vm.show.id[_vm.show.indexer],\n id: \"scene_exception_\" + _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _vm.type === \"snatch-selection\"\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\"\\n Manual search for:\"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n ),\n _vm._v(\" / Season \" + _vm._s(_vm.season)),\n _vm.episode !== undefined &&\n _vm.manualSearchType !== \"season\"\n ? [_vm._v(\" Episode \" + _vm._s(_vm.episode))]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.type !== \"snatch-selection\" && _vm.seasons.length >= 1\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _vm.seasons.includes(0)\n ? _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Display Specials: \"\n ),\n _c(\n \"a\",\n {\n staticClass: \"inner\",\n staticStyle: { cursor: \"pointer\" },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.toggleSpecials()\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n _vm.displaySpecials ? \"Hide\" : \"Show\"\n )\n )\n ]\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"h2footer display-seasons clear\" },\n [\n _c(\n \"span\",\n [\n _vm.seasons.length >= 15\n ? _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.jumpToSeason,\n expression: \"jumpToSeason\"\n }\n ],\n staticClass: \"form-control input-sm\",\n staticStyle: { position: \"relative\" },\n attrs: { id: \"seasonJump\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.jumpToSeason = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { value: \"jump\" } },\n [_vm._v(\"Jump to Season\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.seasons, function(\n seasonNumber\n ) {\n return _c(\n \"option\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n domProps: { value: seasonNumber }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : \"Season \" + seasonNumber\n ) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n )\n : _vm.seasons.length >= 1\n ? [\n _vm._v(\n \"\\n Season:\\n \"\n ),\n _vm._l(_vm.reverse(_vm.seasons), function(\n seasonNumber,\n index\n ) {\n return [\n _c(\n \"app-link\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n attrs: {\n href: \"#season-\" + seasonNumber\n },\n nativeOn: {\n click: function($event) {\n $event.preventDefault()\n _vm.jumpToSeason = seasonNumber\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : seasonNumber\n ) +\n \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n index !== _vm.seasons.length - 1\n ? _c(\n \"span\",\n {\n key: \"separator-\" + index,\n staticClass: \"separator\"\n },\n [_vm._v(\"| \")]\n )\n : _vm._e()\n ]\n })\n ]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _vm._l(_vm.activeShowQueueStatuses, function(queueItem) {\n return _c(\"div\", { key: queueItem.action, staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"alert alert-info\" }, [\n _vm._v(\"\\n \" + _vm._s(queueItem.message) + \"\\n \")\n ])\n ])\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"summaryBackground\" }\n },\n [\n _c(\"div\", { staticClass: \"row\", attrs: { id: \"row-show-summary\" } }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { id: \"col-show-summary\" } },\n [\n _c(\"div\", { staticClass: \"show-poster-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"image-flex-container col-md-12\" },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/poster.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"posterThumb\",\n cls: \"show-image shadow\",\n link: true\n }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"ver-spacer\" }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-info-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"pull-right col-lg-3 col-md-3 hidden-sm hidden-xs\"\n },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/banner.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"banner\",\n cls: \"show-banner pull-right shadow\",\n link: true\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"show-rating\" }\n },\n [\n _vm.show.rating.imdb && _vm.show.rating.imdb.rating\n ? _c(\n \"span\",\n {\n staticClass: \"imdbstars\",\n attrs: {\n \"qtip-content\":\n _vm.show.rating.imdb.rating +\n \" / 10 Stars
    \" +\n _vm.show.rating.imdb.votes +\n \" Votes\"\n }\n },\n [\n _c(\"span\", {\n style: {\n width:\n Number(_vm.show.rating.imdb.rating) * 10 +\n \"%\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n !_vm.show.id.imdb\n ? [\n _vm.show.year.start\n ? _c(\"span\", [\n _vm._v(\n \"(\" +\n _vm._s(_vm.show.year.start) +\n \") - \" +\n _vm._s(_vm.show.runtime) +\n \" minutes - \"\n )\n ])\n : _vm._e()\n ]\n : [\n _vm._l(_vm.show.countryCodes, function(country) {\n return _c(\"img\", {\n key: \"flag-\" + country,\n class: [\"country-flag\", \"flag-\" + country],\n staticStyle: {\n \"margin-left\": \"3px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n src: \"images/blank.png\",\n width: \"16\",\n height: \"11\"\n }\n })\n }),\n _vm._v(\" \"),\n _vm.show.imdbInfo.year\n ? _c(\"span\", [\n _vm._v(\n \"\\n (\" +\n _vm._s(_vm.show.imdbInfo.year) +\n \") -\\n \"\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.imdbInfo.runtimes ||\n _vm.show.runtime\n ) +\n \" minutes\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb,\n title:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _vm.show.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[_vm.show.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl,\n title: _vm.showIndexerUrl\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[_vm.show.indexer].name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[_vm.show.indexer].icon\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.xemNumbering &&\n _vm.show.xemNumbering.length > 0\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://thexem.de/search?q=\" +\n _vm.show.title,\n title:\n \"http://thexem.de/search?q=\" +\n _vm.show.title\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[xem]\",\n height: \"16\",\n width: \"16\",\n src: \"images/xem.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.id.tvdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://fanart.tv/series/\" +\n _vm.show.id.tvdb,\n title:\n \"https://fanart.tv/series/\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\"img\", {\n staticClass: \"fanart\",\n attrs: {\n alt: \"[fanart.tv]\",\n height: \"16\",\n width: \"16\",\n src: \"images/fanart.tv.png\"\n }\n })\n ]\n )\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"tags\" }\n },\n [\n _vm.show.genres\n ? _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(\n _vm.dedupeGenres(_vm.show.genres),\n function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://trakt.tv/shows/popular/?genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on trakt.tv\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }\n ),\n 1\n )\n : _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(_vm.showGenres, function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://www.imdb.com/search/title?count=100&title_type=tv_series&genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on IMDB\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }),\n 1\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.configLoaded\n ? _c(\n \"div\",\n {\n ref: \"summary\",\n staticClass: \"col-md-12\",\n attrs: { id: \"summary\" }\n },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-9 col-md-8 col-sm-8 col-xs-12\",\n class: {\n summaryFanArt: _vm.layout.fanartBackground\n },\n attrs: { id: \"show-summary\" }\n },\n [\n _c(\n \"table\",\n { staticClass: \"summaryTable pull-left\" },\n [\n _vm.show.plot\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticStyle: {\n \"padding-bottom\": \"15px\"\n },\n attrs: { colspan: \"2\" }\n },\n [\n _c(\"truncate\", {\n attrs: {\n length: 250,\n clamp: \"show more...\",\n less: \"show less...\",\n text: _vm.show.plot\n },\n on: {\n toggle: function($event) {\n return _vm.$emit(\"reflow\")\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.getQualityPreset({\n value: _vm.combinedQualities\n }) !== undefined\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Quality:\")]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\"quality-pill\", {\n attrs: {\n quality:\n _vm.combinedQualities\n }\n })\n ],\n 1\n )\n ])\n : [\n _vm.combineQualities(\n _vm.show.config.qualities.allowed\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Allowed Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.allowed,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"allowed-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.combineQualities(\n _vm.show.config.qualities\n .preferred\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Preferred Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.preferred,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"preferred-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n _vm._v(\" \"),\n _vm.show.network && _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\n \" on \" +\n _vm._s(_vm.show.network)\n )\n ])\n ])\n : _vm.show.network\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.network))\n ])\n ])\n : _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Show Status: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.status))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Default EP Status: \")]\n ),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config\n .defaultEpisodeStatus\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [_vm._v(\"Location: \")]\n )\n ]\n ),\n _c(\"td\", [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [\n _vm._v(\n _vm._s(_vm.show.config.location)\n )\n ]\n ),\n _vm._v(\n _vm._s(\n _vm.show.config.locationValid\n ? \"\"\n : \" (Missing)\"\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _vm.show.config.aliases.filter(function(\n alias\n ) {\n return alias.season === -1\n }).length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [_vm._v(\"Scene Name:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.aliases\n .filter(function(alias) {\n return alias.season === -1\n })\n .map(function(alias) {\n return alias.title\n })\n .join(\", \")\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.requiredWords\n .length +\n _vm.search.filters.required.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n required:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Required Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .requiredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.requiredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.required\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .requiredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .requiredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.required.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.ignoredWords\n .length +\n _vm.search.filters.ignored.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n ignored:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Ignored Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .ignoredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.ignoredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.ignored\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .ignoredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .ignoredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.ignored.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.preferred.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n preferred:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Preferred Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.preferred.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.undesired.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n undesired:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Undesired Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.undesired.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.whitelist &&\n _vm.show.config.release.whitelist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Wanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.whitelist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.blacklist &&\n _vm.show.config.release.blacklist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Unwanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.blacklist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.airdateOffset !== 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Daily search offset:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.airdateOffset\n ) + \" hours\"\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.locationValid &&\n _vm.show.size > -1\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Size:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.humanFileSize(\n _vm.show.size\n )\n )\n )\n ])\n ])\n : _vm._e()\n ],\n 2\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-3 col-md-4 col-sm-4 col-xs-12 pull-xs-left\",\n attrs: { id: \"show-status\" }\n },\n [\n _c(\n \"table\",\n {\n staticClass:\n \"pull-xs-left pull-md-right pull-sm-right pull-lg-right\"\n },\n [\n _vm.show.language\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Info Language:\")]\n ),\n _c(\"td\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n _vm.getCountryISO2ToISO3(\n _vm.show.language\n ) +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: _vm.show.language,\n title: _vm.show.language,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.config.subtitles.enabled\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Subtitles: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .subtitlesEnabled\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"subtitlesEnabled\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Season Folders: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .seasonFolders ||\n _vm.config.namingForceFolders\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Paused: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.paused\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"paused\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Air-by-Date: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.airByDate\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"airByDate\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Sports: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.sports\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"sports\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Anime: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.anime\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"anime\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"DVD Order: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.dvdOrder\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"dvdOrder\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Scene Numbering: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.scene\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"scene\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n ]\n )\n ]\n )\n ])\n ]\n )\n : _vm._e()\n ])\n ])\n ]\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"episodes-controll-background\" }\n },\n [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"row\",\n attrs: { id: \"row-show-episodes-controls\" }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12\",\n attrs: { id: \"col-show-episodes-controls\" }\n },\n [\n _vm.type === \"show\"\n ? _c(\"div\", { staticClass: \"row key\" }, [\n _c(\n \"div\",\n {\n ref: \"checkboxControls\",\n staticClass: \"col-lg-12\",\n attrs: { id: \"checkboxControls\" }\n },\n [\n _vm.show.seasons\n ? _c(\n \"div\",\n {\n staticClass: \"pull-left top-5\",\n attrs: { id: \"key-padding\" }\n },\n _vm._l(_vm.overviewStatus, function(\n status\n ) {\n return _c(\n \"label\",\n {\n key: status.id,\n attrs: { for: status.id }\n },\n [\n _c(\"span\", { class: status.id }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: status.checked,\n expression: \"status.checked\"\n }\n ],\n attrs: {\n type: \"checkbox\",\n id: status.id\n },\n domProps: {\n checked: Array.isArray(\n status.checked\n )\n ? _vm._i(\n status.checked,\n null\n ) > -1\n : status.checked\n },\n on: {\n change: [\n function($event) {\n var $$a = status.checked,\n $$el = $event.target,\n $$c = $$el.checked\n ? true\n : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(\n status,\n \"checked\",\n $$a.concat([$$v])\n )\n } else {\n $$i > -1 &&\n _vm.$set(\n status,\n \"checked\",\n $$a\n .slice(0, $$i)\n .concat(\n $$a.slice(\n $$i + 1\n )\n )\n )\n }\n } else {\n _vm.$set(\n status,\n \"checked\",\n $$c\n )\n }\n },\n function($event) {\n return _vm.$emit(\n \"update-overview-status\",\n _vm.overviewStatus\n )\n }\n ]\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \": \"\n ),\n _c(\"b\", [\n _vm._v(\n _vm._s(\n _vm.episodeSummary[\n status.name\n ]\n )\n )\n ])\n ])\n ]\n )\n }),\n 0\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"pull-lg-right top-5\" },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedStatus,\n expression: \"selectedStatus\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"statusSelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedStatus = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change status to:\"\n }\n },\n [_vm._v(\"Change status to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(\n _vm.changeStatusOptions,\n function(status) {\n return _c(\n \"option\",\n {\n key: status.key,\n domProps: {\n value: status.value\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \"\\n \"\n )\n ]\n )\n }\n )\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedQuality,\n expression: \"selectedQuality\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"qualitySelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedQuality = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change quality to:\"\n }\n },\n [_vm._v(\"Change quality to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.qualities, function(\n quality\n ) {\n return _c(\n \"option\",\n {\n key: quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-slug\"\n },\n domProps: { value: _vm.show.id.slug }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-id\"\n },\n domProps: {\n value: _vm.show.id[_vm.show.indexer]\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"indexer\" },\n domProps: { value: _vm.show.indexer }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n id: \"changeStatus\",\n value: \"Go\"\n },\n on: { click: _vm.changeStatusClicked }\n })\n ]\n )\n ]\n )\n ])\n : _c(\"div\")\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"show-header-container\" },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"col-lg-12\",\n attrs: { id: \"showtitle\", \"data-showname\": _vm.show.title }\n },\n [\n _c(\"div\", [\n _c(\n \"h1\",\n {\n staticClass: \"title\",\n attrs: {\n \"data-indexer-name\": _vm.show.indexer,\n \"data-series-id\": _vm.show.id[_vm.show.indexer],\n id: \"scene_exception_\" + _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _vm.type === \"snatch-selection\"\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right episode-info\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Manual search for: Season \" +\n _vm._s(_vm.season)\n ),\n _vm.episode !== undefined &&\n _vm.manualSearchType !== \"season\"\n ? [_vm._v(\" Episode \" + _vm._s(_vm.episode))]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.episodeTitle) +\n \"\\n \"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.type !== \"snatch-selection\" && _vm.seasons.length >= 1\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _vm.seasons.includes(0)\n ? _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Display Specials: \"\n ),\n _c(\n \"a\",\n {\n staticClass: \"inner\",\n staticStyle: { cursor: \"pointer\" },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.toggleSpecials()\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n _vm.displaySpecials ? \"Hide\" : \"Show\"\n )\n )\n ]\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"h2footer display-seasons clear\" },\n [\n _c(\n \"span\",\n [\n _vm.seasons.length >= 15\n ? _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.jumpToSeason,\n expression: \"jumpToSeason\"\n }\n ],\n staticClass: \"form-control input-sm\",\n staticStyle: { position: \"relative\" },\n attrs: { id: \"seasonJump\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.jumpToSeason = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { value: \"jump\" } },\n [_vm._v(\"Jump to Season\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.seasons, function(\n seasonNumber\n ) {\n return _c(\n \"option\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n domProps: { value: seasonNumber }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : \"Season \" + seasonNumber\n ) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n )\n : _vm.seasons.length >= 1\n ? [\n _vm._v(\n \"\\n Season:\\n \"\n ),\n _vm._l(_vm.reverse(_vm.seasons), function(\n seasonNumber,\n index\n ) {\n return [\n _c(\n \"app-link\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n attrs: {\n href: \"#season-\" + seasonNumber\n },\n nativeOn: {\n click: function($event) {\n $event.preventDefault()\n _vm.jumpToSeason = seasonNumber\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : seasonNumber\n ) +\n \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n index !== _vm.seasons.length - 1\n ? _c(\n \"span\",\n {\n key: \"separator-\" + index,\n staticClass: \"separator\"\n },\n [_vm._v(\"| \")]\n )\n : _vm._e()\n ]\n })\n ]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _vm._l(_vm.activeShowQueueStatuses, function(queueItem) {\n return _c(\"div\", { key: queueItem.action, staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"alert alert-info\" }, [\n _vm._v(\"\\n \" + _vm._s(queueItem.message) + \"\\n \")\n ])\n ])\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"summaryBackground\" }\n },\n [\n _c(\"div\", { staticClass: \"row\", attrs: { id: \"row-show-summary\" } }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { id: \"col-show-summary\" } },\n [\n _c(\"div\", { staticClass: \"show-poster-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"image-flex-container col-md-12\" },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/poster.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"posterThumb\",\n cls: \"show-image shadow\",\n link: true\n }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"ver-spacer\" }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-info-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"pull-right col-lg-3 col-md-3 hidden-sm hidden-xs\"\n },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/banner.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"banner\",\n cls: \"show-banner pull-right shadow\",\n link: true\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"show-rating\" }\n },\n [\n _vm.show.rating.imdb && _vm.show.rating.imdb.rating\n ? _c(\n \"span\",\n {\n staticClass: \"imdbstars\",\n attrs: {\n \"qtip-content\":\n _vm.show.rating.imdb.rating +\n \" / 10 Stars
    \" +\n _vm.show.rating.imdb.votes +\n \" Votes\"\n }\n },\n [\n _c(\"span\", {\n style: {\n width:\n Number(_vm.show.rating.imdb.rating) * 10 +\n \"%\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n !_vm.show.id.imdb\n ? [\n _vm.show.year.start\n ? _c(\"span\", [\n _vm._v(\n \"(\" +\n _vm._s(_vm.show.year.start) +\n \") - \" +\n _vm._s(_vm.show.runtime) +\n \" minutes - \"\n )\n ])\n : _vm._e()\n ]\n : [\n _vm._l(_vm.show.countryCodes, function(country) {\n return _c(\"img\", {\n key: \"flag-\" + country,\n class: [\"country-flag\", \"flag-\" + country],\n staticStyle: {\n \"margin-left\": \"3px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n src: \"images/blank.png\",\n width: \"16\",\n height: \"11\"\n }\n })\n }),\n _vm._v(\" \"),\n _vm.show.imdbInfo.year\n ? _c(\"span\", [\n _vm._v(\n \"\\n (\" +\n _vm._s(_vm.show.imdbInfo.year) +\n \") -\\n \"\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.imdbInfo.runtimes ||\n _vm.show.runtime\n ) +\n \" minutes\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb,\n title:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _vm.show.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[_vm.show.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl,\n title: _vm.showIndexerUrl\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[_vm.show.indexer].name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[_vm.show.indexer].icon\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.xemNumbering &&\n _vm.show.xemNumbering.length > 0\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://thexem.de/search?q=\" +\n _vm.show.title,\n title:\n \"http://thexem.de/search?q=\" +\n _vm.show.title\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[xem]\",\n height: \"16\",\n width: \"16\",\n src: \"images/xem.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.id.tvdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://fanart.tv/series/\" +\n _vm.show.id.tvdb,\n title:\n \"https://fanart.tv/series/\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\"img\", {\n staticClass: \"fanart\",\n attrs: {\n alt: \"[fanart.tv]\",\n height: \"16\",\n width: \"16\",\n src: \"images/fanart.tv.png\"\n }\n })\n ]\n )\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"tags\" }\n },\n [\n _vm.show.genres\n ? _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(\n _vm.dedupeGenres(_vm.show.genres),\n function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://trakt.tv/shows/popular/?genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on trakt.tv\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }\n ),\n 1\n )\n : _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(_vm.showGenres, function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://www.imdb.com/search/title?count=100&title_type=tv_series&genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on IMDB\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }),\n 1\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.configLoaded\n ? _c(\n \"div\",\n {\n ref: \"summary\",\n staticClass: \"col-md-12\",\n attrs: { id: \"summary\" }\n },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-9 col-md-8 col-sm-8 col-xs-12\",\n class: {\n summaryFanArt: _vm.layout.fanartBackground\n },\n attrs: { id: \"show-summary\" }\n },\n [\n _c(\n \"table\",\n { staticClass: \"summaryTable pull-left\" },\n [\n _vm.show.plot\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticStyle: {\n \"padding-bottom\": \"15px\"\n },\n attrs: { colspan: \"2\" }\n },\n [\n _c(\"truncate\", {\n attrs: {\n length: 250,\n clamp: \"show more...\",\n less: \"show less...\",\n text: _vm.show.plot\n },\n on: {\n toggle: function($event) {\n return _vm.$emit(\"reflow\")\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.getQualityPreset({\n value: _vm.combinedQualities\n }) !== undefined\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Quality:\")]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\"quality-pill\", {\n attrs: {\n quality:\n _vm.combinedQualities\n }\n })\n ],\n 1\n )\n ])\n : [\n _vm.combineQualities(\n _vm.show.config.qualities.allowed\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Allowed Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.allowed,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"allowed-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.combineQualities(\n _vm.show.config.qualities\n .preferred\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Preferred Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.preferred,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"preferred-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n _vm._v(\" \"),\n _vm.show.network && _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\n \" on \" +\n _vm._s(_vm.show.network)\n )\n ])\n ])\n : _vm.show.network\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.network))\n ])\n ])\n : _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Show Status: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.status))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Default EP Status: \")]\n ),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config\n .defaultEpisodeStatus\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [_vm._v(\"Location: \")]\n )\n ]\n ),\n _c(\"td\", [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [\n _vm._v(\n _vm._s(_vm.show.config.location)\n )\n ]\n ),\n _vm._v(\n _vm._s(\n _vm.show.config.locationValid\n ? \"\"\n : \" (Missing)\"\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _vm.show.config.aliases.filter(function(\n alias\n ) {\n return alias.season === -1\n }).length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [_vm._v(\"Scene Name:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.aliases\n .filter(function(alias) {\n return alias.season === -1\n })\n .map(function(alias) {\n return alias.title\n })\n .join(\", \")\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.requiredWords\n .length +\n _vm.search.filters.required.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n required:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Required Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .requiredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.requiredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.required\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .requiredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .requiredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.required.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.ignoredWords\n .length +\n _vm.search.filters.ignored.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n ignored:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Ignored Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .ignoredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.ignoredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.ignored\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .ignoredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .ignoredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.ignored.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.preferred.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n preferred:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Preferred Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.preferred.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.undesired.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n undesired:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Undesired Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.undesired.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.whitelist &&\n _vm.show.config.release.whitelist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Wanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.whitelist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.blacklist &&\n _vm.show.config.release.blacklist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Unwanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.blacklist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.airdateOffset !== 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Daily search offset:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.airdateOffset\n ) + \" hours\"\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.locationValid &&\n _vm.show.size > -1\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Size:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.humanFileSize(\n _vm.show.size\n )\n )\n )\n ])\n ])\n : _vm._e()\n ],\n 2\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-3 col-md-4 col-sm-4 col-xs-12 pull-xs-left\",\n attrs: { id: \"show-status\" }\n },\n [\n _c(\n \"table\",\n {\n staticClass:\n \"pull-xs-left pull-md-right pull-sm-right pull-lg-right\"\n },\n [\n _vm.show.language\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Info Language:\")]\n ),\n _c(\"td\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n _vm.getCountryISO2ToISO3(\n _vm.show.language\n ) +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: _vm.show.language,\n title: _vm.show.language,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.config.subtitles.enabled\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Subtitles: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .subtitlesEnabled\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"subtitlesEnabled\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Season Folders: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .seasonFolders ||\n _vm.config.namingForceFolders\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Paused: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.paused\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"paused\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Air-by-Date: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.airByDate\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"airByDate\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Sports: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.sports\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"sports\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Anime: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.anime\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"anime\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"DVD Order: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.dvdOrder\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"dvdOrder\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Scene Numbering: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.scene\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"scene\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n ]\n )\n ]\n )\n ])\n ]\n )\n : _vm._e()\n ])\n ])\n ]\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"episodes-controll-background\" }\n },\n [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"row\",\n attrs: { id: \"row-show-episodes-controls\" }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12\",\n attrs: { id: \"col-show-episodes-controls\" }\n },\n [\n _vm.type === \"show\"\n ? _c(\"div\", { staticClass: \"row key\" }, [\n _c(\n \"div\",\n {\n ref: \"checkboxControls\",\n staticClass: \"col-lg-12\",\n attrs: { id: \"checkboxControls\" }\n },\n [\n _vm.show.seasons\n ? _c(\n \"div\",\n {\n staticClass: \"pull-left top-5\",\n attrs: { id: \"key-padding\" }\n },\n _vm._l(_vm.overviewStatus, function(\n status\n ) {\n return _c(\n \"label\",\n {\n key: status.id,\n attrs: { for: status.id }\n },\n [\n _c(\"span\", { class: status.id }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: status.checked,\n expression: \"status.checked\"\n }\n ],\n attrs: {\n type: \"checkbox\",\n id: status.id\n },\n domProps: {\n checked: Array.isArray(\n status.checked\n )\n ? _vm._i(\n status.checked,\n null\n ) > -1\n : status.checked\n },\n on: {\n change: [\n function($event) {\n var $$a = status.checked,\n $$el = $event.target,\n $$c = $$el.checked\n ? true\n : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(\n status,\n \"checked\",\n $$a.concat([$$v])\n )\n } else {\n $$i > -1 &&\n _vm.$set(\n status,\n \"checked\",\n $$a\n .slice(0, $$i)\n .concat(\n $$a.slice(\n $$i + 1\n )\n )\n )\n }\n } else {\n _vm.$set(\n status,\n \"checked\",\n $$c\n )\n }\n },\n function($event) {\n return _vm.$emit(\n \"update-overview-status\",\n _vm.overviewStatus\n )\n }\n ]\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \": \"\n ),\n _c(\"b\", [\n _vm._v(\n _vm._s(\n _vm.episodeSummary[\n status.name\n ]\n )\n )\n ])\n ])\n ]\n )\n }),\n 0\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"pull-lg-right top-5\" },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedStatus,\n expression: \"selectedStatus\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"statusSelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedStatus = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change status to:\"\n }\n },\n [_vm._v(\"Change status to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(\n _vm.changeStatusOptions,\n function(status) {\n return _c(\n \"option\",\n {\n key: status.key,\n domProps: {\n value: status.value\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \"\\n \"\n )\n ]\n )\n }\n )\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedQuality,\n expression: \"selectedQuality\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"qualitySelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedQuality = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change quality to:\"\n }\n },\n [_vm._v(\"Change quality to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.qualities, function(\n quality\n ) {\n return _c(\n \"option\",\n {\n key: quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-slug\"\n },\n domProps: { value: _vm.show.id.slug }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-id\"\n },\n domProps: {\n value: _vm.show.id[_vm.show.indexer]\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"indexer\" },\n domProps: { value: _vm.show.indexer }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n id: \"changeStatus\",\n value: \"Go\"\n },\n on: { click: _vm.changeStatusClicked }\n })\n ]\n )\n ]\n )\n ])\n : _c(\"div\")\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -4866,7 +4866,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n/**\n * @typedef {object} ShowIdentifier\n * @property {string} indexer The indexer name (e.g. `tvdb`)\n * @property {number} id The show ID on the indexer (e.g. `12345`)\n */\n\nconst state = {\n shows: [],\n currentShow: {\n indexer: null,\n id: null\n },\n loading: {\n total: null,\n current: null,\n display: false,\n finished: false\n }\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW\"]](state, show) {\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n\n if (!existingShow) {\n console.debug(`Adding ${show.title || show.indexer + String(show.id)} as it wasn't found in the shows array`, show);\n state.shows.push(show);\n return;\n } // Merge new show object over old one\n // this allows detailed queries to update the record\n // without the non-detailed removing the extra data\n\n\n console.debug(`Found ${show.title || show.indexer + String(show.id)} in shows array attempting merge`);\n const newShow = { ...existingShow,\n ...show\n }; // Update state\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.debug(`Merged ${newShow.title || newShow.indexer + String(newShow.id)}`, newShow);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOWS\"]](state, shows) {\n // Quick check on duplicate shows.\n const newShows = shows.filter(newShow => {\n return !state.shows.find(({\n id,\n indexer\n }) => Number(newShow.id[newShow.indexer]) === Number(id[indexer]) && newShow.indexer === indexer);\n });\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state, 'shows', [...state.shows, ...newShows]);\n console.debug(`Added ${shows.length} shows to store`);\n },\n\n currentShow(state, {\n indexer,\n id\n }) {\n state.currentShow.indexer = indexer;\n state.currentShow.id = id;\n },\n\n setLoadingTotal(state, total) {\n state.loading.total = total;\n },\n\n setLoadingCurrent(state, current) {\n state.loading.current = current;\n },\n\n updateLoadingCurrent(state, current) {\n state.loading.current += current;\n },\n\n setLoadingDisplay(state, display) {\n state.loading.display = display;\n },\n\n setLoadingFinished(state, finished) {\n state.loading.finished = finished;\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE\"]](state, {\n show,\n episodes\n }) {\n // Creating a new show object (from the state one) as we want to trigger a store update\n const newShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (!newShow.seasons) {\n newShow.seasons = [];\n } // Recreate an Array with season objects, with each season having an episodes array.\n // This format is used by vue-good-table (displayShow).\n\n\n episodes.forEach(episode => {\n const existingSeason = newShow.seasons.find(season => season.season === episode.season);\n\n if (existingSeason) {\n const foundIndex = existingSeason.episodes.findIndex(element => element.slug === episode.slug);\n\n if (foundIndex === -1) {\n existingSeason.episodes.push(episode);\n } else {\n existingSeason.episodes.splice(foundIndex, 1, episode);\n }\n } else {\n const newSeason = {\n season: episode.season,\n episodes: [],\n html: false,\n mode: 'span',\n label: 1\n };\n newShow.seasons.push(newSeason);\n newSeason.episodes.push(episode);\n }\n }); // Update state\n\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.log(`Storing episodes for show ${newShow.title} seasons: ${[...new Set(episodes.map(episode => episode.season))].join(', ')}`);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_SCENE_EXCEPTION\"]](state, {\n show,\n exception\n }) {\n // Get current show object\n const currentShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (currentShow.config.aliases.find(e => e.title === exception.title && e.season === exception.season)) {\n console.warn(`Can't add exception ${exception.title} with season ${exception.season} to show ${currentShow.title} as it already exists.`);\n return;\n }\n\n currentShow.config.aliases.push(exception);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"REMOVE_SHOW_SCENE_EXCEPTION\"]](state, {\n show,\n exception\n }) {\n // Get current show object\n const currentShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (!currentShow.config.aliases.find(e => e.title === exception.title && e.season === exception.season)) {\n console.warn(`Can't remove exception ${exception.title} with season ${exception.season} to show ${currentShow.title} as it does not exist.`);\n return;\n }\n\n currentShow.config.aliases.splice(currentShow.config.aliases.indexOf(exception), 1);\n }\n\n};\nconst getters = {\n getShowById: state => {\n /**\n * Get a show from the loaded shows state, identified by show ID and indexer name.\n *\n * @param {ShowIdentifier} show Show identifiers.\n * @returns {object|undefined} Show object or undefined if not found.\n */\n const getShowById = ({\n id,\n indexer\n }) => state.shows.find(show => Number(show.id[indexer]) === Number(id));\n\n return getShowById;\n },\n getShowByTitle: state => title => state.shows.find(show => show.title === title),\n getSeason: state => ({\n showSlug,\n season\n }) => {\n const show = state.shows.find(show => show.id.slug === showSlug);\n return show && show.seasons ? show.seasons[season] : undefined;\n },\n getEpisode: state => ({\n showSlug,\n season,\n episode\n }) => {\n const show = state.shows.find(show => show.id.slug === showSlug);\n return show && show.seasons && show.seasons[season] ? show.seasons[season][episode] : undefined;\n },\n getCurrentShow: (state, getters, rootState) => {\n return state.shows.find(show => Number(show.id[state.currentShow.indexer]) === Number(state.currentShow.id)) || rootState.defaults.show;\n },\n showsWithStats: (state, getters, rootState) => {\n if (!state.shows) {\n return [];\n }\n\n return state.shows.map(show => {\n let showStats = rootState.stats.show.stats.find(stat => stat.indexerId === getters.indexerNameToId(show.indexer) && stat.seriesId === show.id[show.indexer]);\n const newLine = '\\u000D';\n let text = 'Unaired';\n let title = '';\n\n if (!showStats) {\n showStats = {\n epDownloaded: 0,\n epSnatched: 0,\n epTotal: 0,\n seriesSize: 0\n };\n }\n\n if (showStats.epTotal >= 1) {\n text = showStats.epDownloaded;\n title = `Downloaded: ${showStats.epDownloaded}`;\n\n if (showStats.epSnatched) {\n text += `+${showStats.epSnatched}`;\n title += `${newLine}Snatched: ${showStats.epSnatched}`;\n }\n\n text += ` / ${showStats.epTotal}`;\n title += `${newLine}Total: ${showStats.epTotal}`;\n }\n\n show.stats = {\n episodes: {\n total: showStats.epTotal,\n snatched: showStats.epSnatched,\n downloaded: showStats.epDownloaded,\n size: showStats.seriesSize\n },\n tooltip: {\n text,\n title,\n percentage: showStats.epDownloaded * 100 / (showStats.epTotal || 1)\n }\n };\n return show;\n });\n }\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n getShow(context, {\n indexer,\n id,\n detailed,\n episodes\n }) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n const params = {};\n let timeout = 30000;\n\n if (detailed !== undefined) {\n params.detailed = detailed;\n timeout = 60000;\n timeout = 60000;\n }\n\n if (episodes !== undefined) {\n params.episodes = episodes;\n timeout = 60000;\n }\n\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/series/${indexer}${id}`, {\n params,\n timeout\n }).then(res => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW\"], res.data);\n resolve(res.data);\n }).catch(error => {\n reject(error);\n });\n });\n },\n\n /**\n * Get episdoes for a specified show from API and commit it to the store.\n *\n * @param {*} context - The store context.\n * @param {ShowParameteres} parameters - Request parameters.\n * @returns {Promise} The API response.\n */\n getEpisodes({\n commit,\n getters\n }, {\n indexer,\n id,\n season\n }) {\n return new Promise((resolve, reject) => {\n const {\n getShowById\n } = getters;\n const show = getShowById({\n id,\n indexer\n });\n const limit = 1000;\n const params = {\n limit\n };\n\n if (season !== undefined) {\n params.season = season;\n } // Get episodes\n\n\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/series/${indexer}${id}/episodes`, {\n params\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE\"], {\n show,\n episodes: response.data\n });\n resolve();\n }).catch(error => {\n console.log(`Could not retrieve a episodes for show ${indexer}${id}, error: ${error}`);\n reject(error);\n });\n });\n },\n\n /**\n * Get shows from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n getShows(context, shows) {\n const {\n commit,\n dispatch\n } = context; // If no shows are provided get the first 1000\n\n if (!shows) {\n // Loading new shows, commit show loading information to state.\n commit('setLoadingTotal', 0);\n commit('setLoadingCurrent', 0);\n commit('setLoadingDisplay', true);\n const limit = 1000;\n const page = 1;\n const params = {\n limit,\n page\n };\n const pageRequests = []; // Get first page\n\n pageRequests.push(_api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/series', {\n params\n }).then(response => {\n commit('setLoadingTotal', Number(response.headers['x-pagination-count']));\n const totalPages = Number(response.headers['x-pagination-total']);\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOWS\"], response.data);\n commit('updateLoadingCurrent', response.data.length); // Optionally get additional pages\n\n for (let page = 2; page <= totalPages; page++) {\n const newPage = {\n page\n };\n newPage.limit = params.limit;\n pageRequests.push(_api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/series', {\n params: newPage\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOWS\"], response.data);\n commit('updateLoadingCurrent', response.data.length);\n }));\n }\n }).catch(() => {\n console.log('Could not retrieve a list of shows');\n }));\n return Promise.all(pageRequests);\n }\n\n return shows.forEach(show => dispatch('getShow', show));\n },\n\n setShow(context, {\n indexer,\n id,\n data\n }) {\n // Update show, updated show will arrive over a WebSocket message\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch(`series/${indexer}${id}`, data);\n },\n\n updateShow(context, show) {\n // Update local store\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW\"], show);\n },\n\n addSceneException(context, {\n show,\n exception\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_SCENE_EXCEPTION\"], {\n show,\n exception\n });\n },\n\n removeSceneException(context, {\n show,\n exception\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"REMOVE_SHOW_SCENE_EXCEPTION\"], {\n show,\n exception\n });\n },\n\n setCurrentShow(context, {\n indexer,\n id\n }) {\n // Set current show\n const {\n commit\n } = context;\n return commit('currentShow', {\n indexer,\n id\n });\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/shows.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\n/**\n * @typedef {object} ShowIdentifier\n * @property {string} indexer The indexer name (e.g. `tvdb`)\n * @property {number} id The show ID on the indexer (e.g. `12345`)\n */\n\nconst state = {\n shows: [],\n currentShow: {\n indexer: null,\n id: null\n },\n loading: {\n total: null,\n current: null,\n display: false,\n finished: false\n }\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW\"]](state, show) {\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n\n if (!existingShow) {\n console.debug(`Adding ${show.title || show.indexer + String(show.id)} as it wasn't found in the shows array`, show);\n state.shows.push(show);\n return;\n } // Merge new show object over old one\n // this allows detailed queries to update the record\n // without the non-detailed removing the extra data\n\n\n console.debug(`Found ${show.title || show.indexer + String(show.id)} in shows array attempting merge`);\n const newShow = { ...existingShow,\n ...show\n }; // Update state\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.debug(`Merged ${newShow.title || newShow.indexer + String(newShow.id)}`, newShow);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOWS\"]](state, shows) {\n // Quick check on duplicate shows.\n const newShows = shows.filter(newShow => {\n return !state.shows.find(({\n id,\n indexer\n }) => Number(newShow.id[newShow.indexer]) === Number(id[indexer]) && newShow.indexer === indexer);\n });\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state, 'shows', [...state.shows, ...newShows]);\n console.debug(`Added ${shows.length} shows to store`);\n },\n\n currentShow(state, {\n indexer,\n id\n }) {\n state.currentShow.indexer = indexer;\n state.currentShow.id = id;\n },\n\n setLoadingTotal(state, total) {\n state.loading.total = total;\n },\n\n setLoadingCurrent(state, current) {\n state.loading.current = current;\n },\n\n updateLoadingCurrent(state, current) {\n state.loading.current += current;\n },\n\n setLoadingDisplay(state, display) {\n state.loading.display = display;\n },\n\n setLoadingFinished(state, finished) {\n state.loading.finished = finished;\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE\"]](state, {\n show,\n episodes\n }) {\n // Creating a new show object (from the state one) as we want to trigger a store update\n const newShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (!newShow.seasons) {\n newShow.seasons = [];\n } // Recreate an Array with season objects, with each season having an episodes array.\n // This format is used by vue-good-table (displayShow).\n\n\n episodes.forEach(episode => {\n const existingSeason = newShow.seasons.find(season => season.season === episode.season);\n\n if (existingSeason) {\n const foundIndex = existingSeason.episodes.findIndex(element => element.slug === episode.slug);\n\n if (foundIndex === -1) {\n existingSeason.episodes.push(episode);\n } else {\n existingSeason.episodes.splice(foundIndex, 1, episode);\n }\n } else {\n const newSeason = {\n season: episode.season,\n episodes: [],\n html: false,\n mode: 'span',\n label: 1\n };\n newShow.seasons.push(newSeason);\n newSeason.episodes.push(episode);\n }\n }); // Update state\n\n const existingShow = state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer]));\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.log(`Storing episodes for show ${newShow.title} seasons: ${[...new Set(episodes.map(episode => episode.season))].join(', ')}`);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_SCENE_EXCEPTION\"]](state, {\n show,\n exception\n }) {\n // Get current show object\n const currentShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (currentShow.config.aliases.find(e => e.title === exception.title && e.season === exception.season)) {\n console.warn(`Can't add exception ${exception.title} with season ${exception.season} to show ${currentShow.title} as it already exists.`);\n return;\n }\n\n currentShow.config.aliases.push(exception);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"REMOVE_SHOW_SCENE_EXCEPTION\"]](state, {\n show,\n exception\n }) {\n // Get current show object\n const currentShow = Object.assign({}, state.shows.find(({\n id,\n indexer\n }) => Number(show.id[show.indexer]) === Number(id[indexer])));\n\n if (!currentShow.config.aliases.find(e => e.title === exception.title && e.season === exception.season)) {\n console.warn(`Can't remove exception ${exception.title} with season ${exception.season} to show ${currentShow.title} as it does not exist.`);\n return;\n }\n\n currentShow.config.aliases.splice(currentShow.config.aliases.indexOf(exception), 1);\n }\n\n};\nconst getters = {\n getShowById: state => {\n /**\n * Get a show from the loaded shows state, identified by show ID and indexer name.\n *\n * @param {ShowIdentifier} show Show identifiers.\n * @returns {object|undefined} Show object or undefined if not found.\n */\n const getShowById = ({\n id,\n indexer\n }) => state.shows.find(show => Number(show.id[indexer]) === Number(id));\n\n return getShowById;\n },\n getShowByTitle: state => title => state.shows.find(show => show.title === title),\n getSeason: state => ({\n showSlug,\n season\n }) => {\n const show = state.shows.find(show => show.id.slug === showSlug);\n return show && show.seasons ? show.seasons[season] : undefined;\n },\n getEpisode: state => ({\n showSlug,\n season,\n episode\n }) => {\n const show = state.shows.find(show => show.id.slug === showSlug);\n return show && show.seasons && show.seasons.find(s => s.season === season) ? show.seasons.find(s => s.season === season).episodes.find(ep => ep.episode === episode) : undefined;\n },\n getCurrentShow: (state, getters, rootState) => {\n return state.shows.find(show => Number(show.id[state.currentShow.indexer]) === Number(state.currentShow.id)) || rootState.defaults.show;\n },\n showsWithStats: (state, getters, rootState) => {\n if (!state.shows) {\n return [];\n }\n\n return state.shows.map(show => {\n let showStats = rootState.stats.show.stats.find(stat => stat.indexerId === getters.indexerNameToId(show.indexer) && stat.seriesId === show.id[show.indexer]);\n const newLine = '\\u000D';\n let text = 'Unaired';\n let title = '';\n\n if (!showStats) {\n showStats = {\n epDownloaded: 0,\n epSnatched: 0,\n epTotal: 0,\n seriesSize: 0\n };\n }\n\n if (showStats.epTotal >= 1) {\n text = showStats.epDownloaded;\n title = `Downloaded: ${showStats.epDownloaded}`;\n\n if (showStats.epSnatched) {\n text += `+${showStats.epSnatched}`;\n title += `${newLine}Snatched: ${showStats.epSnatched}`;\n }\n\n text += ` / ${showStats.epTotal}`;\n title += `${newLine}Total: ${showStats.epTotal}`;\n }\n\n show.stats = {\n episodes: {\n total: showStats.epTotal,\n snatched: showStats.epSnatched,\n downloaded: showStats.epDownloaded,\n size: showStats.seriesSize\n },\n tooltip: {\n text,\n title,\n percentage: showStats.epDownloaded * 100 / (showStats.epTotal || 1)\n }\n };\n return show;\n });\n }\n};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get show from API and commit it to the store.\n *\n * @param {*} context The store context.\n * @param {ShowIdentifier&ShowGetParameters} parameters Request parameters.\n * @returns {Promise} The API response.\n */\n getShow(context, {\n indexer,\n id,\n detailed,\n episodes\n }) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n const params = {};\n let timeout = 30000;\n\n if (detailed !== undefined) {\n params.detailed = detailed;\n timeout = 60000;\n timeout = 60000;\n }\n\n if (episodes !== undefined) {\n params.episodes = episodes;\n timeout = 60000;\n }\n\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/series/${indexer}${id}`, {\n params,\n timeout\n }).then(res => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW\"], res.data);\n resolve(res.data);\n }).catch(error => {\n reject(error);\n });\n });\n },\n\n /**\n * Get episdoes for a specified show from API and commit it to the store.\n *\n * @param {*} context - The store context.\n * @param {ShowParameteres} parameters - Request parameters.\n * @returns {Promise} The API response.\n */\n getEpisodes({\n commit,\n getters\n }, {\n indexer,\n id,\n season\n }) {\n return new Promise((resolve, reject) => {\n const {\n getShowById\n } = getters;\n const show = getShowById({\n id,\n indexer\n });\n const limit = 1000;\n const params = {\n limit\n };\n\n if (season !== undefined) {\n params.season = season;\n } // Get episodes\n\n\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/series/${indexer}${id}/episodes`, {\n params\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_EPISODE\"], {\n show,\n episodes: response.data\n });\n resolve();\n }).catch(error => {\n console.log(`Could not retrieve a episodes for show ${indexer}${id}, error: ${error}`);\n reject(error);\n });\n });\n },\n\n /**\n * Get shows from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {(ShowIdentifier&ShowGetParameters)[]} shows Shows to get. If not provided, gets the first 1k shows.\n * @returns {undefined|Promise} undefined if `shows` was provided or the API response if not.\n */\n getShows(context, shows) {\n const {\n commit,\n dispatch\n } = context; // If no shows are provided get the first 1000\n\n if (!shows) {\n // Loading new shows, commit show loading information to state.\n commit('setLoadingTotal', 0);\n commit('setLoadingCurrent', 0);\n commit('setLoadingDisplay', true);\n const limit = 1000;\n const page = 1;\n const params = {\n limit,\n page\n };\n const pageRequests = []; // Get first page\n\n pageRequests.push(_api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/series', {\n params\n }).then(response => {\n commit('setLoadingTotal', Number(response.headers['x-pagination-count']));\n const totalPages = Number(response.headers['x-pagination-total']);\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOWS\"], response.data);\n commit('updateLoadingCurrent', response.data.length); // Optionally get additional pages\n\n for (let page = 2; page <= totalPages; page++) {\n const newPage = {\n page\n };\n newPage.limit = params.limit;\n pageRequests.push(_api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/series', {\n params: newPage\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOWS\"], response.data);\n commit('updateLoadingCurrent', response.data.length);\n }));\n }\n }).catch(() => {\n console.log('Could not retrieve a list of shows');\n }));\n return Promise.all(pageRequests);\n }\n\n return shows.forEach(show => dispatch('getShow', show));\n },\n\n setShow(context, {\n indexer,\n id,\n data\n }) {\n // Update show, updated show will arrive over a WebSocket message\n return _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].patch(`series/${indexer}${id}`, data);\n },\n\n updateShow(context, show) {\n // Update local store\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW\"], show);\n },\n\n addSceneException(context, {\n show,\n exception\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SHOW_SCENE_EXCEPTION\"], {\n show,\n exception\n });\n },\n\n removeSceneException(context, {\n show,\n exception\n }) {\n const {\n commit\n } = context;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"REMOVE_SHOW_SCENE_EXCEPTION\"], {\n show,\n exception\n });\n },\n\n setCurrentShow(context, {\n indexer,\n id\n }) {\n // Set current show\n const {\n commit\n } = context;\n return commit('currentShow', {\n indexer,\n id\n });\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/shows.js?"); /***/ }), From 820754c5448004cb5baf3765cf1116f41f10d62c Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sun, 21 Jun 2020 20:16:10 +0200 Subject: [PATCH 47/87] Add row style to subtitled history item. show-results: Fix Seeds/Peers --- medusa/server/api/v2/episode_history.py | 4 ++++ themes-default/slim/src/components/show-header.vue | 2 +- themes-default/slim/src/components/show-history.vue | 3 +-- themes-default/slim/src/components/show-results.vue | 8 ++++++++ .../slim/src/components/snatch-selection.vue | 5 +++++ themes-default/slim/src/store/modules/provider.js | 8 ++++++++ themes/dark/assets/js/medusa-runtime.js | 12 ++++++------ themes/light/assets/js/medusa-runtime.js | 12 ++++++------ 8 files changed, 39 insertions(+), 15 deletions(-) diff --git a/medusa/server/api/v2/episode_history.py b/medusa/server/api/v2/episode_history.py index 706590ea50..82d4cf1080 100644 --- a/medusa/server/api/v2/episode_history.py +++ b/medusa/server/api/v2/episode_history.py @@ -94,6 +94,10 @@ def data_generator(): if item['action'] == SUBTITLED: subtitle_language = item['resource'] + provider.update({ + 'id': item['provider'], + 'name': item['provider'] + }) if item['action'] == SUBTITLED: subtitle_language = item['resource'] diff --git a/themes-default/slim/src/components/show-header.vue b/themes-default/slim/src/components/show-header.vue index ca236f7696..b6445c4200 100644 --- a/themes-default/slim/src/components/show-header.vue +++ b/themes-default/slim/src/components/show-header.vue @@ -17,7 +17,7 @@ Manual search for: Season {{ season }} - + {{episodeTitle}}
    diff --git a/themes-default/slim/src/components/show-history.vue b/themes-default/slim/src/components/show-history.vue index 0b4b19698f..964f043165 100644 --- a/themes-default/slim/src/components/show-history.vue +++ b/themes-default/slim/src/components/show-history.vue @@ -32,7 +32,7 @@ - {{props.row.statusName === 'Downloaded' ? (props.row.releaseGroup !== -1 ? props.row.releaseGroup : '') : props.row.provider.name}} + {{['Downloaded', 'Subtitled'].includes(props.row.statusName) ? (props.row.releaseGroup !== -1 ? props.row.releaseGroup : '') : props.row.provider.name}} @@ -51,7 +51,6 @@ import { VueGoodTable } from 'vue-good-table'; import { humanFileSize, episodeToSlug } from '../utils/core'; import QualityPill from './helpers/quality-pill.vue'; - export default { name: 'show-history', components: { diff --git a/themes-default/slim/src/components/show-results.vue b/themes-default/slim/src/components/show-results.vue index 7ef45a04e8..28cd3898f1 100644 --- a/themes-default/slim/src/components/show-results.vue +++ b/themes-default/slim/src/components/show-results.vue @@ -33,6 +33,14 @@ + + {{props.row.seeders !== -1 ? props.row.seeders : '-'}} + + + + {{props.row.leechers !== -1 ? props.row.leechers : '-'}} + + {{props.row.dateAdded ? fuzzyParseDateTime(props.row.dateAdded) : ''}} diff --git a/themes-default/slim/src/components/snatch-selection.vue b/themes-default/slim/src/components/snatch-selection.vue index beca111088..2ff61c50f8 100644 --- a/themes-default/slim/src/components/snatch-selection.vue +++ b/themes-default/slim/src/components/snatch-selection.vue @@ -321,6 +321,11 @@ span.global-undesired { .snatch-selection-template >>> .failed { background-color: rgb(255, 153, 153); } + +.snatch-selection-template >>> .subtitled { + background-color: rgb(190, 222, 237); +} + show-history { margin-bottom: 10px; } diff --git a/themes-default/slim/src/store/modules/provider.js b/themes-default/slim/src/store/modules/provider.js index f661bfd8db..399d361344 100644 --- a/themes-default/slim/src/store/modules/provider.js +++ b/themes-default/slim/src/store/modules/provider.js @@ -35,6 +35,14 @@ const mutations = { */ [ADD_SEARCH_RESULTS](state, searchResults) { for (const searchResult of searchResults) { + if (!state.providers[searchResult.provider.id]) { + state.providers[searchResult.provider.id] = { + name: '', + config: {}, + cache: [] + }; + } + const { cache } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store. diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index 8065f9fcf5..9821d53fff 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -608,7 +608,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n async mounted() {\n const {\n forceSearch,\n getProviders,\n getProviderCacheResults,\n show,\n season,\n episode\n } = this;\n await getProviders();\n const result = await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // TODO: put a modal in between\n\n if (result.providersSearched > 0 && result.totalSearchResults.length === 0) {\n forceSearch();\n }\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n async mounted() {\n const {\n forceSearch,\n getProviders,\n getProviderCacheResults,\n show,\n season,\n episode\n } = this;\n await getProviders();\n const result = await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // TODO: put a modal in between\n\n if (result.providersSearched > 0 && result.totalSearchResults.length === 0) {\n forceSearch();\n }\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -975,7 +975,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\nspan.global-ignored[data-v-0ad4c7fc] {\\n color: red;\\n}\\nspan.show-ignored[data-v-0ad4c7fc] {\\n color: red;\\n font-style: italic;\\n}\\nspan.global-required[data-v-0ad4c7fc] {\\n color: green;\\n}\\nspan.show-required[data-v-0ad4c7fc] {\\n color: green;\\n font-style: italic;\\n}\\nspan.global-undesired[data-v-0ad4c7fc] {\\n color: orange;\\n}\\n\\n/** Use this as table styling for all table layouts */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th:first-child,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-0ad4c7fc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground {\\n clear: both;\\n opacity: 0.9;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground table {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground > table th.vgt-row-header {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground td.col-search {\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\nshow-history[data-v-0ad4c7fc] {\\n margin-bottom: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\nspan.global-ignored[data-v-0ad4c7fc] {\\n color: red;\\n}\\nspan.show-ignored[data-v-0ad4c7fc] {\\n color: red;\\n font-style: italic;\\n}\\nspan.global-required[data-v-0ad4c7fc] {\\n color: green;\\n}\\nspan.show-required[data-v-0ad4c7fc] {\\n color: green;\\n font-style: italic;\\n}\\nspan.global-undesired[data-v-0ad4c7fc] {\\n color: orange;\\n}\\n\\n/** Use this as table styling for all table layouts */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th:first-child,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-0ad4c7fc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground {\\n clear: both;\\n opacity: 0.9;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground table {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground > table th.vgt-row-header {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground td.col-search {\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .subtitled {\\n background-color: rgb(190, 222, 237);\\n}\\nshow-history[data-v-0ad4c7fc] {\\n margin-bottom: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1477,7 +1477,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"show-header-container\" },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"col-lg-12\",\n attrs: { id: \"showtitle\", \"data-showname\": _vm.show.title }\n },\n [\n _c(\"div\", [\n _c(\n \"h1\",\n {\n staticClass: \"title\",\n attrs: {\n \"data-indexer-name\": _vm.show.indexer,\n \"data-series-id\": _vm.show.id[_vm.show.indexer],\n id: \"scene_exception_\" + _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _vm.type === \"snatch-selection\"\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right episode-info\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Manual search for: Season \" +\n _vm._s(_vm.season)\n ),\n _vm.episode !== undefined &&\n _vm.manualSearchType !== \"season\"\n ? [_vm._v(\" Episode \" + _vm._s(_vm.episode))]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.episodeTitle) +\n \"\\n \"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.type !== \"snatch-selection\" && _vm.seasons.length >= 1\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _vm.seasons.includes(0)\n ? _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Display Specials: \"\n ),\n _c(\n \"a\",\n {\n staticClass: \"inner\",\n staticStyle: { cursor: \"pointer\" },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.toggleSpecials()\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n _vm.displaySpecials ? \"Hide\" : \"Show\"\n )\n )\n ]\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"h2footer display-seasons clear\" },\n [\n _c(\n \"span\",\n [\n _vm.seasons.length >= 15\n ? _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.jumpToSeason,\n expression: \"jumpToSeason\"\n }\n ],\n staticClass: \"form-control input-sm\",\n staticStyle: { position: \"relative\" },\n attrs: { id: \"seasonJump\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.jumpToSeason = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { value: \"jump\" } },\n [_vm._v(\"Jump to Season\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.seasons, function(\n seasonNumber\n ) {\n return _c(\n \"option\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n domProps: { value: seasonNumber }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : \"Season \" + seasonNumber\n ) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n )\n : _vm.seasons.length >= 1\n ? [\n _vm._v(\n \"\\n Season:\\n \"\n ),\n _vm._l(_vm.reverse(_vm.seasons), function(\n seasonNumber,\n index\n ) {\n return [\n _c(\n \"app-link\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n attrs: {\n href: \"#season-\" + seasonNumber\n },\n nativeOn: {\n click: function($event) {\n $event.preventDefault()\n _vm.jumpToSeason = seasonNumber\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : seasonNumber\n ) +\n \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n index !== _vm.seasons.length - 1\n ? _c(\n \"span\",\n {\n key: \"separator-\" + index,\n staticClass: \"separator\"\n },\n [_vm._v(\"| \")]\n )\n : _vm._e()\n ]\n })\n ]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _vm._l(_vm.activeShowQueueStatuses, function(queueItem) {\n return _c(\"div\", { key: queueItem.action, staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"alert alert-info\" }, [\n _vm._v(\"\\n \" + _vm._s(queueItem.message) + \"\\n \")\n ])\n ])\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"summaryBackground\" }\n },\n [\n _c(\"div\", { staticClass: \"row\", attrs: { id: \"row-show-summary\" } }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { id: \"col-show-summary\" } },\n [\n _c(\"div\", { staticClass: \"show-poster-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"image-flex-container col-md-12\" },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/poster.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"posterThumb\",\n cls: \"show-image shadow\",\n link: true\n }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"ver-spacer\" }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-info-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"pull-right col-lg-3 col-md-3 hidden-sm hidden-xs\"\n },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/banner.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"banner\",\n cls: \"show-banner pull-right shadow\",\n link: true\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"show-rating\" }\n },\n [\n _vm.show.rating.imdb && _vm.show.rating.imdb.rating\n ? _c(\n \"span\",\n {\n staticClass: \"imdbstars\",\n attrs: {\n \"qtip-content\":\n _vm.show.rating.imdb.rating +\n \" / 10 Stars
    \" +\n _vm.show.rating.imdb.votes +\n \" Votes\"\n }\n },\n [\n _c(\"span\", {\n style: {\n width:\n Number(_vm.show.rating.imdb.rating) * 10 +\n \"%\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n !_vm.show.id.imdb\n ? [\n _vm.show.year.start\n ? _c(\"span\", [\n _vm._v(\n \"(\" +\n _vm._s(_vm.show.year.start) +\n \") - \" +\n _vm._s(_vm.show.runtime) +\n \" minutes - \"\n )\n ])\n : _vm._e()\n ]\n : [\n _vm._l(_vm.show.countryCodes, function(country) {\n return _c(\"img\", {\n key: \"flag-\" + country,\n class: [\"country-flag\", \"flag-\" + country],\n staticStyle: {\n \"margin-left\": \"3px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n src: \"images/blank.png\",\n width: \"16\",\n height: \"11\"\n }\n })\n }),\n _vm._v(\" \"),\n _vm.show.imdbInfo.year\n ? _c(\"span\", [\n _vm._v(\n \"\\n (\" +\n _vm._s(_vm.show.imdbInfo.year) +\n \") -\\n \"\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.imdbInfo.runtimes ||\n _vm.show.runtime\n ) +\n \" minutes\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb,\n title:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _vm.show.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[_vm.show.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl,\n title: _vm.showIndexerUrl\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[_vm.show.indexer].name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[_vm.show.indexer].icon\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.xemNumbering &&\n _vm.show.xemNumbering.length > 0\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://thexem.de/search?q=\" +\n _vm.show.title,\n title:\n \"http://thexem.de/search?q=\" +\n _vm.show.title\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[xem]\",\n height: \"16\",\n width: \"16\",\n src: \"images/xem.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.id.tvdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://fanart.tv/series/\" +\n _vm.show.id.tvdb,\n title:\n \"https://fanart.tv/series/\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\"img\", {\n staticClass: \"fanart\",\n attrs: {\n alt: \"[fanart.tv]\",\n height: \"16\",\n width: \"16\",\n src: \"images/fanart.tv.png\"\n }\n })\n ]\n )\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"tags\" }\n },\n [\n _vm.show.genres\n ? _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(\n _vm.dedupeGenres(_vm.show.genres),\n function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://trakt.tv/shows/popular/?genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on trakt.tv\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }\n ),\n 1\n )\n : _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(_vm.showGenres, function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://www.imdb.com/search/title?count=100&title_type=tv_series&genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on IMDB\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }),\n 1\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.configLoaded\n ? _c(\n \"div\",\n {\n ref: \"summary\",\n staticClass: \"col-md-12\",\n attrs: { id: \"summary\" }\n },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-9 col-md-8 col-sm-8 col-xs-12\",\n class: {\n summaryFanArt: _vm.layout.fanartBackground\n },\n attrs: { id: \"show-summary\" }\n },\n [\n _c(\n \"table\",\n { staticClass: \"summaryTable pull-left\" },\n [\n _vm.show.plot\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticStyle: {\n \"padding-bottom\": \"15px\"\n },\n attrs: { colspan: \"2\" }\n },\n [\n _c(\"truncate\", {\n attrs: {\n length: 250,\n clamp: \"show more...\",\n less: \"show less...\",\n text: _vm.show.plot\n },\n on: {\n toggle: function($event) {\n return _vm.$emit(\"reflow\")\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.getQualityPreset({\n value: _vm.combinedQualities\n }) !== undefined\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Quality:\")]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\"quality-pill\", {\n attrs: {\n quality:\n _vm.combinedQualities\n }\n })\n ],\n 1\n )\n ])\n : [\n _vm.combineQualities(\n _vm.show.config.qualities.allowed\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Allowed Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.allowed,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"allowed-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.combineQualities(\n _vm.show.config.qualities\n .preferred\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Preferred Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.preferred,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"preferred-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n _vm._v(\" \"),\n _vm.show.network && _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\n \" on \" +\n _vm._s(_vm.show.network)\n )\n ])\n ])\n : _vm.show.network\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.network))\n ])\n ])\n : _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Show Status: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.status))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Default EP Status: \")]\n ),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config\n .defaultEpisodeStatus\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [_vm._v(\"Location: \")]\n )\n ]\n ),\n _c(\"td\", [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [\n _vm._v(\n _vm._s(_vm.show.config.location)\n )\n ]\n ),\n _vm._v(\n _vm._s(\n _vm.show.config.locationValid\n ? \"\"\n : \" (Missing)\"\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _vm.show.config.aliases.filter(function(\n alias\n ) {\n return alias.season === -1\n }).length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [_vm._v(\"Scene Name:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.aliases\n .filter(function(alias) {\n return alias.season === -1\n })\n .map(function(alias) {\n return alias.title\n })\n .join(\", \")\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.requiredWords\n .length +\n _vm.search.filters.required.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n required:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Required Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .requiredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.requiredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.required\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .requiredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .requiredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.required.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.ignoredWords\n .length +\n _vm.search.filters.ignored.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n ignored:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Ignored Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .ignoredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.ignoredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.ignored\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .ignoredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .ignoredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.ignored.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.preferred.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n preferred:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Preferred Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.preferred.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.undesired.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n undesired:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Undesired Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.undesired.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.whitelist &&\n _vm.show.config.release.whitelist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Wanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.whitelist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.blacklist &&\n _vm.show.config.release.blacklist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Unwanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.blacklist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.airdateOffset !== 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Daily search offset:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.airdateOffset\n ) + \" hours\"\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.locationValid &&\n _vm.show.size > -1\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Size:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.humanFileSize(\n _vm.show.size\n )\n )\n )\n ])\n ])\n : _vm._e()\n ],\n 2\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-3 col-md-4 col-sm-4 col-xs-12 pull-xs-left\",\n attrs: { id: \"show-status\" }\n },\n [\n _c(\n \"table\",\n {\n staticClass:\n \"pull-xs-left pull-md-right pull-sm-right pull-lg-right\"\n },\n [\n _vm.show.language\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Info Language:\")]\n ),\n _c(\"td\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n _vm.getCountryISO2ToISO3(\n _vm.show.language\n ) +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: _vm.show.language,\n title: _vm.show.language,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.config.subtitles.enabled\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Subtitles: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .subtitlesEnabled\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"subtitlesEnabled\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Season Folders: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .seasonFolders ||\n _vm.config.namingForceFolders\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Paused: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.paused\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"paused\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Air-by-Date: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.airByDate\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"airByDate\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Sports: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.sports\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"sports\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Anime: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.anime\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"anime\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"DVD Order: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.dvdOrder\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"dvdOrder\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Scene Numbering: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.scene\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"scene\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n ]\n )\n ]\n )\n ])\n ]\n )\n : _vm._e()\n ])\n ])\n ]\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"episodes-controll-background\" }\n },\n [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"row\",\n attrs: { id: \"row-show-episodes-controls\" }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12\",\n attrs: { id: \"col-show-episodes-controls\" }\n },\n [\n _vm.type === \"show\"\n ? _c(\"div\", { staticClass: \"row key\" }, [\n _c(\n \"div\",\n {\n ref: \"checkboxControls\",\n staticClass: \"col-lg-12\",\n attrs: { id: \"checkboxControls\" }\n },\n [\n _vm.show.seasons\n ? _c(\n \"div\",\n {\n staticClass: \"pull-left top-5\",\n attrs: { id: \"key-padding\" }\n },\n _vm._l(_vm.overviewStatus, function(\n status\n ) {\n return _c(\n \"label\",\n {\n key: status.id,\n attrs: { for: status.id }\n },\n [\n _c(\"span\", { class: status.id }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: status.checked,\n expression: \"status.checked\"\n }\n ],\n attrs: {\n type: \"checkbox\",\n id: status.id\n },\n domProps: {\n checked: Array.isArray(\n status.checked\n )\n ? _vm._i(\n status.checked,\n null\n ) > -1\n : status.checked\n },\n on: {\n change: [\n function($event) {\n var $$a = status.checked,\n $$el = $event.target,\n $$c = $$el.checked\n ? true\n : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(\n status,\n \"checked\",\n $$a.concat([$$v])\n )\n } else {\n $$i > -1 &&\n _vm.$set(\n status,\n \"checked\",\n $$a\n .slice(0, $$i)\n .concat(\n $$a.slice(\n $$i + 1\n )\n )\n )\n }\n } else {\n _vm.$set(\n status,\n \"checked\",\n $$c\n )\n }\n },\n function($event) {\n return _vm.$emit(\n \"update-overview-status\",\n _vm.overviewStatus\n )\n }\n ]\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \": \"\n ),\n _c(\"b\", [\n _vm._v(\n _vm._s(\n _vm.episodeSummary[\n status.name\n ]\n )\n )\n ])\n ])\n ]\n )\n }),\n 0\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"pull-lg-right top-5\" },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedStatus,\n expression: \"selectedStatus\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"statusSelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedStatus = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change status to:\"\n }\n },\n [_vm._v(\"Change status to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(\n _vm.changeStatusOptions,\n function(status) {\n return _c(\n \"option\",\n {\n key: status.key,\n domProps: {\n value: status.value\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \"\\n \"\n )\n ]\n )\n }\n )\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedQuality,\n expression: \"selectedQuality\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"qualitySelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedQuality = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change quality to:\"\n }\n },\n [_vm._v(\"Change quality to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.qualities, function(\n quality\n ) {\n return _c(\n \"option\",\n {\n key: quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-slug\"\n },\n domProps: { value: _vm.show.id.slug }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-id\"\n },\n domProps: {\n value: _vm.show.id[_vm.show.indexer]\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"indexer\" },\n domProps: { value: _vm.show.indexer }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n id: \"changeStatus\",\n value: \"Go\"\n },\n on: { click: _vm.changeStatusClicked }\n })\n ]\n )\n ]\n )\n ])\n : _c(\"div\")\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"show-header-container\" },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"col-lg-12\",\n attrs: { id: \"showtitle\", \"data-showname\": _vm.show.title }\n },\n [\n _c(\"div\", [\n _c(\n \"h1\",\n {\n staticClass: \"title\",\n attrs: {\n \"data-indexer-name\": _vm.show.indexer,\n \"data-series-id\": _vm.show.id[_vm.show.indexer],\n id: \"scene_exception_\" + _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _vm.type === \"snatch-selection\"\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right episode-info\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Manual search for: Season \" +\n _vm._s(_vm.season)\n ),\n _vm.episode !== undefined &&\n _vm.manualSearchType !== \"season\"\n ? [_vm._v(\" Episode \" + _vm._s(_vm.episode))]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _vm.episodeTitle\n ? _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.episodeTitle) +\n \"\\n \"\n )\n ])\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.type !== \"snatch-selection\" && _vm.seasons.length >= 1\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _vm.seasons.includes(0)\n ? _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Display Specials: \"\n ),\n _c(\n \"a\",\n {\n staticClass: \"inner\",\n staticStyle: { cursor: \"pointer\" },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.toggleSpecials()\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n _vm.displaySpecials ? \"Hide\" : \"Show\"\n )\n )\n ]\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"h2footer display-seasons clear\" },\n [\n _c(\n \"span\",\n [\n _vm.seasons.length >= 15\n ? _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.jumpToSeason,\n expression: \"jumpToSeason\"\n }\n ],\n staticClass: \"form-control input-sm\",\n staticStyle: { position: \"relative\" },\n attrs: { id: \"seasonJump\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.jumpToSeason = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { value: \"jump\" } },\n [_vm._v(\"Jump to Season\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.seasons, function(\n seasonNumber\n ) {\n return _c(\n \"option\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n domProps: { value: seasonNumber }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : \"Season \" + seasonNumber\n ) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n )\n : _vm.seasons.length >= 1\n ? [\n _vm._v(\n \"\\n Season:\\n \"\n ),\n _vm._l(_vm.reverse(_vm.seasons), function(\n seasonNumber,\n index\n ) {\n return [\n _c(\n \"app-link\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n attrs: {\n href: \"#season-\" + seasonNumber\n },\n nativeOn: {\n click: function($event) {\n $event.preventDefault()\n _vm.jumpToSeason = seasonNumber\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : seasonNumber\n ) +\n \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n index !== _vm.seasons.length - 1\n ? _c(\n \"span\",\n {\n key: \"separator-\" + index,\n staticClass: \"separator\"\n },\n [_vm._v(\"| \")]\n )\n : _vm._e()\n ]\n })\n ]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _vm._l(_vm.activeShowQueueStatuses, function(queueItem) {\n return _c(\"div\", { key: queueItem.action, staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"alert alert-info\" }, [\n _vm._v(\"\\n \" + _vm._s(queueItem.message) + \"\\n \")\n ])\n ])\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"summaryBackground\" }\n },\n [\n _c(\"div\", { staticClass: \"row\", attrs: { id: \"row-show-summary\" } }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { id: \"col-show-summary\" } },\n [\n _c(\"div\", { staticClass: \"show-poster-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"image-flex-container col-md-12\" },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/poster.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"posterThumb\",\n cls: \"show-image shadow\",\n link: true\n }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"ver-spacer\" }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-info-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"pull-right col-lg-3 col-md-3 hidden-sm hidden-xs\"\n },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/banner.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"banner\",\n cls: \"show-banner pull-right shadow\",\n link: true\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"show-rating\" }\n },\n [\n _vm.show.rating.imdb && _vm.show.rating.imdb.rating\n ? _c(\n \"span\",\n {\n staticClass: \"imdbstars\",\n attrs: {\n \"qtip-content\":\n _vm.show.rating.imdb.rating +\n \" / 10 Stars
    \" +\n _vm.show.rating.imdb.votes +\n \" Votes\"\n }\n },\n [\n _c(\"span\", {\n style: {\n width:\n Number(_vm.show.rating.imdb.rating) * 10 +\n \"%\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n !_vm.show.id.imdb\n ? [\n _vm.show.year.start\n ? _c(\"span\", [\n _vm._v(\n \"(\" +\n _vm._s(_vm.show.year.start) +\n \") - \" +\n _vm._s(_vm.show.runtime) +\n \" minutes - \"\n )\n ])\n : _vm._e()\n ]\n : [\n _vm._l(_vm.show.countryCodes, function(country) {\n return _c(\"img\", {\n key: \"flag-\" + country,\n class: [\"country-flag\", \"flag-\" + country],\n staticStyle: {\n \"margin-left\": \"3px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n src: \"images/blank.png\",\n width: \"16\",\n height: \"11\"\n }\n })\n }),\n _vm._v(\" \"),\n _vm.show.imdbInfo.year\n ? _c(\"span\", [\n _vm._v(\n \"\\n (\" +\n _vm._s(_vm.show.imdbInfo.year) +\n \") -\\n \"\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.imdbInfo.runtimes ||\n _vm.show.runtime\n ) +\n \" minutes\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb,\n title:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _vm.show.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[_vm.show.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl,\n title: _vm.showIndexerUrl\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[_vm.show.indexer].name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[_vm.show.indexer].icon\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.xemNumbering &&\n _vm.show.xemNumbering.length > 0\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://thexem.de/search?q=\" +\n _vm.show.title,\n title:\n \"http://thexem.de/search?q=\" +\n _vm.show.title\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[xem]\",\n height: \"16\",\n width: \"16\",\n src: \"images/xem.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.id.tvdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://fanart.tv/series/\" +\n _vm.show.id.tvdb,\n title:\n \"https://fanart.tv/series/\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\"img\", {\n staticClass: \"fanart\",\n attrs: {\n alt: \"[fanart.tv]\",\n height: \"16\",\n width: \"16\",\n src: \"images/fanart.tv.png\"\n }\n })\n ]\n )\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"tags\" }\n },\n [\n _vm.show.genres\n ? _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(\n _vm.dedupeGenres(_vm.show.genres),\n function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://trakt.tv/shows/popular/?genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on trakt.tv\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }\n ),\n 1\n )\n : _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(_vm.showGenres, function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://www.imdb.com/search/title?count=100&title_type=tv_series&genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on IMDB\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }),\n 1\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.configLoaded\n ? _c(\n \"div\",\n {\n ref: \"summary\",\n staticClass: \"col-md-12\",\n attrs: { id: \"summary\" }\n },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-9 col-md-8 col-sm-8 col-xs-12\",\n class: {\n summaryFanArt: _vm.layout.fanartBackground\n },\n attrs: { id: \"show-summary\" }\n },\n [\n _c(\n \"table\",\n { staticClass: \"summaryTable pull-left\" },\n [\n _vm.show.plot\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticStyle: {\n \"padding-bottom\": \"15px\"\n },\n attrs: { colspan: \"2\" }\n },\n [\n _c(\"truncate\", {\n attrs: {\n length: 250,\n clamp: \"show more...\",\n less: \"show less...\",\n text: _vm.show.plot\n },\n on: {\n toggle: function($event) {\n return _vm.$emit(\"reflow\")\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.getQualityPreset({\n value: _vm.combinedQualities\n }) !== undefined\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Quality:\")]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\"quality-pill\", {\n attrs: {\n quality:\n _vm.combinedQualities\n }\n })\n ],\n 1\n )\n ])\n : [\n _vm.combineQualities(\n _vm.show.config.qualities.allowed\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Allowed Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.allowed,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"allowed-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.combineQualities(\n _vm.show.config.qualities\n .preferred\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Preferred Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.preferred,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"preferred-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n _vm._v(\" \"),\n _vm.show.network && _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\n \" on \" +\n _vm._s(_vm.show.network)\n )\n ])\n ])\n : _vm.show.network\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.network))\n ])\n ])\n : _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Show Status: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.status))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Default EP Status: \")]\n ),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config\n .defaultEpisodeStatus\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [_vm._v(\"Location: \")]\n )\n ]\n ),\n _c(\"td\", [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [\n _vm._v(\n _vm._s(_vm.show.config.location)\n )\n ]\n ),\n _vm._v(\n _vm._s(\n _vm.show.config.locationValid\n ? \"\"\n : \" (Missing)\"\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _vm.show.config.aliases.filter(function(\n alias\n ) {\n return alias.season === -1\n }).length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [_vm._v(\"Scene Name:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.aliases\n .filter(function(alias) {\n return alias.season === -1\n })\n .map(function(alias) {\n return alias.title\n })\n .join(\", \")\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.requiredWords\n .length +\n _vm.search.filters.required.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n required:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Required Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .requiredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.requiredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.required\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .requiredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .requiredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.required.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.ignoredWords\n .length +\n _vm.search.filters.ignored.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n ignored:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Ignored Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .ignoredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.ignoredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.ignored\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .ignoredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .ignoredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.ignored.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.preferred.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n preferred:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Preferred Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.preferred.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.undesired.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n undesired:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Undesired Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.undesired.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.whitelist &&\n _vm.show.config.release.whitelist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Wanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.whitelist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.blacklist &&\n _vm.show.config.release.blacklist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Unwanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.blacklist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.airdateOffset !== 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Daily search offset:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.airdateOffset\n ) + \" hours\"\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.locationValid &&\n _vm.show.size > -1\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Size:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.humanFileSize(\n _vm.show.size\n )\n )\n )\n ])\n ])\n : _vm._e()\n ],\n 2\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-3 col-md-4 col-sm-4 col-xs-12 pull-xs-left\",\n attrs: { id: \"show-status\" }\n },\n [\n _c(\n \"table\",\n {\n staticClass:\n \"pull-xs-left pull-md-right pull-sm-right pull-lg-right\"\n },\n [\n _vm.show.language\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Info Language:\")]\n ),\n _c(\"td\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n _vm.getCountryISO2ToISO3(\n _vm.show.language\n ) +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: _vm.show.language,\n title: _vm.show.language,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.config.subtitles.enabled\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Subtitles: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .subtitlesEnabled\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"subtitlesEnabled\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Season Folders: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .seasonFolders ||\n _vm.config.namingForceFolders\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Paused: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.paused\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"paused\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Air-by-Date: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.airByDate\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"airByDate\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Sports: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.sports\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"sports\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Anime: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.anime\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"anime\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"DVD Order: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.dvdOrder\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"dvdOrder\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Scene Numbering: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.scene\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"scene\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n ]\n )\n ]\n )\n ])\n ]\n )\n : _vm._e()\n ])\n ])\n ]\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"episodes-controll-background\" }\n },\n [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"row\",\n attrs: { id: \"row-show-episodes-controls\" }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12\",\n attrs: { id: \"col-show-episodes-controls\" }\n },\n [\n _vm.type === \"show\"\n ? _c(\"div\", { staticClass: \"row key\" }, [\n _c(\n \"div\",\n {\n ref: \"checkboxControls\",\n staticClass: \"col-lg-12\",\n attrs: { id: \"checkboxControls\" }\n },\n [\n _vm.show.seasons\n ? _c(\n \"div\",\n {\n staticClass: \"pull-left top-5\",\n attrs: { id: \"key-padding\" }\n },\n _vm._l(_vm.overviewStatus, function(\n status\n ) {\n return _c(\n \"label\",\n {\n key: status.id,\n attrs: { for: status.id }\n },\n [\n _c(\"span\", { class: status.id }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: status.checked,\n expression: \"status.checked\"\n }\n ],\n attrs: {\n type: \"checkbox\",\n id: status.id\n },\n domProps: {\n checked: Array.isArray(\n status.checked\n )\n ? _vm._i(\n status.checked,\n null\n ) > -1\n : status.checked\n },\n on: {\n change: [\n function($event) {\n var $$a = status.checked,\n $$el = $event.target,\n $$c = $$el.checked\n ? true\n : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(\n status,\n \"checked\",\n $$a.concat([$$v])\n )\n } else {\n $$i > -1 &&\n _vm.$set(\n status,\n \"checked\",\n $$a\n .slice(0, $$i)\n .concat(\n $$a.slice(\n $$i + 1\n )\n )\n )\n }\n } else {\n _vm.$set(\n status,\n \"checked\",\n $$c\n )\n }\n },\n function($event) {\n return _vm.$emit(\n \"update-overview-status\",\n _vm.overviewStatus\n )\n }\n ]\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \": \"\n ),\n _c(\"b\", [\n _vm._v(\n _vm._s(\n _vm.episodeSummary[\n status.name\n ]\n )\n )\n ])\n ])\n ]\n )\n }),\n 0\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"pull-lg-right top-5\" },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedStatus,\n expression: \"selectedStatus\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"statusSelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedStatus = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change status to:\"\n }\n },\n [_vm._v(\"Change status to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(\n _vm.changeStatusOptions,\n function(status) {\n return _c(\n \"option\",\n {\n key: status.key,\n domProps: {\n value: status.value\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \"\\n \"\n )\n ]\n )\n }\n )\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedQuality,\n expression: \"selectedQuality\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"qualitySelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedQuality = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change quality to:\"\n }\n },\n [_vm._v(\"Change quality to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.qualities, function(\n quality\n ) {\n return _c(\n \"option\",\n {\n key: quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-slug\"\n },\n domProps: { value: _vm.show.id.slug }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-id\"\n },\n domProps: {\n value: _vm.show.id[_vm.show.indexer]\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"indexer\" },\n domProps: { value: _vm.show.indexer }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n id: \"changeStatus\",\n value: \"Go\"\n },\n on: { click: _vm.changeStatusClicked }\n })\n ]\n )\n ]\n )\n ])\n : _c(\"div\")\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1489,7 +1489,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider/Group\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.statusName !== \"Downloaded\"\n ? _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.statusName === \"Downloaded\"\n ? props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n : props.row.provider.name\n ) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider/Group\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.statusName !== \"Downloaded\"\n ? _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n [\"Downloaded\", \"Subtitled\"].includes(\n props.row.statusName\n )\n ? props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n : props.row.provider.name\n ) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1561,7 +1561,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-results-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\n \"div\",\n { staticClass: \"button-row\" },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Refresh Results\" },\n on: { click: _vm.getProviderResults }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Force Search\" },\n on: { click: _vm.forceSearch }\n }),\n _vm._v(\" \"),\n _vm.loading\n ? [\n _c(\"state-switch\", { attrs: { state: \"loading\" } }),\n _vm._v(\" \"),\n _c(\"span\", [_vm._v(_vm._s(_vm.loadingMessage))])\n ]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show.id.slug,\n expression: \"show.id.slug\"\n }\n ],\n ref: \"vgt-show-results\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.combinedResults,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"pubdate\", type: \"desc\" }\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n styleClass: \"vgt-table condensed\"\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.imageName,\n alt: props.row.provider.name,\n width: \"16\"\n }\n })\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Added\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.dateAdded\n ? _vm.fuzzyParseDateTime(\n props.row.dateAdded\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Published\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.pubdate\n ? _vm.fuzzyParseDateTime(props.row.pubdate)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Updated\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.time\n ? _vm.fuzzyParseDateTime(props.row.time)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Snatch\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src: \"images/download.png\",\n width: \"16\",\n height: \"16\",\n alt: \"snatch\",\n title: \"Download selected episode\",\n \"data-identifier\": props.row.identifier\n },\n on: {\n click: function($event) {\n return _vm.snatchResult($event, props.row)\n }\n }\n })\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-results-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\n \"div\",\n { staticClass: \"button-row\" },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Refresh Results\" },\n on: { click: _vm.getProviderResults }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Force Search\" },\n on: { click: _vm.forceSearch }\n }),\n _vm._v(\" \"),\n _vm.loading\n ? [\n _c(\"state-switch\", { attrs: { state: \"loading\" } }),\n _vm._v(\" \"),\n _c(\"span\", [_vm._v(_vm._s(_vm.loadingMessage))])\n ]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show.id.slug,\n expression: \"show.id.slug\"\n }\n ],\n ref: \"vgt-show-results\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.combinedResults,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"pubdate\", type: \"desc\" }\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n styleClass: \"vgt-table condensed\"\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.imageName,\n alt: props.row.provider.name,\n width: \"16\"\n }\n })\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Seeds\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.seeders !== -1\n ? props.row.seeders\n : \"-\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Peers\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.leechers !== -1\n ? props.row.leechers\n : \"-\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Added\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.dateAdded\n ? _vm.fuzzyParseDateTime(\n props.row.dateAdded\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Published\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.pubdate\n ? _vm.fuzzyParseDateTime(props.row.pubdate)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Updated\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.time\n ? _vm.fuzzyParseDateTime(props.row.time)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Snatch\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src: \"images/download.png\",\n width: \"16\",\n height: \"16\",\n alt: \"snatch\",\n title: \"Download selected episode\",\n \"data-identifier\": props.row.identifier\n },\n on: {\n click: function($event) {\n return _vm.snatchResult($event, props.row)\n }\n }\n })\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -4842,7 +4842,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false;\n const results = []; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n results.push(...response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n\n return results;\n };\n\n const result = {\n providersSearched: 0,\n totalSearchResults: []\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n result.providersSearched += 1;\n const providerResults = await getProviderResults(provider);\n result.totalSearchResults.push(...providerResults);\n }\n\n return result;\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n if (!state.providers[searchResult.provider.id]) {\n state.providers[searchResult.provider.id] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false;\n const results = []; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n results.push(...response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n\n return results;\n };\n\n const result = {\n providersSearched: 0,\n totalSearchResults: []\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n result.providersSearched += 1;\n const providerResults = await getProviderResults(provider);\n result.totalSearchResults.push(...providerResults);\n }\n\n return result;\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.js?"); /***/ }), diff --git a/themes/light/assets/js/medusa-runtime.js b/themes/light/assets/js/medusa-runtime.js index 8065f9fcf5..9821d53fff 100644 --- a/themes/light/assets/js/medusa-runtime.js +++ b/themes/light/assets/js/medusa-runtime.js @@ -608,7 +608,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hel /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n async mounted() {\n const {\n forceSearch,\n getProviders,\n getProviderCacheResults,\n show,\n season,\n episode\n } = this;\n await getProviders();\n const result = await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // TODO: put a modal in between\n\n if (result.providersSearched > 0 && result.totalSearchResults.length === 0) {\n forceSearch();\n }\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-results',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_2__[\"VueGoodTable\"],\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_3__[\"StateSwitch\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Release',\n field: 'release'\n }, {\n label: 'Group',\n field: 'releaseGroup'\n }, {\n label: 'Provider',\n field: 'provider.name'\n }, {\n label: 'Quality',\n field: 'quality'\n }, {\n label: 'Seeds',\n field: 'seeders',\n type: 'number'\n }, {\n label: 'Peers',\n field: 'leechers',\n type: 'number'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n type: 'number'\n }, {\n label: 'Added',\n field: 'dateAdded',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Published',\n field: 'pubdate',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ssXXX',\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss'\n }, {\n label: 'Updated',\n field: 'time',\n type: 'date',\n sortable: true,\n dateInputFormat: 'yyyy-MM-dd\\'T\\'HH:mm:ss',\n dateOutputFormat: 'yyyy/MM/dd HH:mm:ss'\n }, {\n label: 'Snatch',\n field: 'snatch',\n sortable: false\n }],\n loading: false,\n loadingMessage: ''\n };\n },\n\n async mounted() {\n const {\n forceSearch,\n getProviders,\n getProviderCacheResults,\n show,\n season,\n episode\n } = this;\n await getProviders();\n const result = await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n }); // TODO: put a modal in between\n\n if (result.providersSearched > 0 && result.totalSearchResults.length === 0) {\n forceSearch();\n }\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n providers: state => state.provider.providers,\n queueitems: state => state.search.queueitems,\n history: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapGetters\"])({\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n }),\n\n combinedResults() {\n const {\n episode,\n episodeHistory,\n providers,\n season,\n show\n } = this;\n let results = [];\n\n const getLastHistoryStatus = result => {\n for (const historyRow of episodeHistory.sort(item => item.actionDate).reverse()) {\n if (historyRow.resource === result.release && historyRow.size === result.size) {\n return historyRow.statusName.toLocaleLowerCase();\n }\n }\n\n return 'skipped';\n };\n\n for (const provider of Object.values(providers).filter(provider => provider.config.enabled)) {\n if (provider.cache && provider.cache.length > 0) {\n results = [...results, ...provider.cache.filter(searchResult => searchResult.showSlug === show.id.slug && searchResult.season === season && searchResult.episodes.includes(episode)).map(result => {\n return { ...result,\n status: getLastHistoryStatus(result)\n };\n })];\n }\n }\n\n return results;\n },\n\n /**\n * Helper to get the current episode slug.\n * @returns {string} episode slug.\n */\n episodeSlug() {\n const {\n season,\n episode\n } = this;\n return Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode);\n },\n\n /**\n * Helper to check if showSlug and season/episode slug exist.\n * @returns {array} history for episode or empty array.\n */\n episodeHistory() {\n const {\n episodeSlug,\n history,\n show\n } = this;\n\n if (!history[show.id.slug] || !history[show.id.slug][episodeSlug]) {\n return [];\n }\n\n return history[show.id.slug][episodeSlug];\n }\n\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_5__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_1__[\"mapActions\"])({\n getProviders: 'getProviders',\n getProviderCacheResults: 'getProviderCacheResults',\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getProviderResults() {\n const {\n episode,\n getProviderCacheResults,\n season,\n show\n } = this;\n getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n },\n\n forceSearch() {\n // Start a new manual search\n const {\n episode,\n season,\n search\n } = this;\n search([Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)]);\n },\n\n search(episodes) {\n const {\n episode,\n season,\n show\n } = this;\n let data = {};\n\n if (episodes) {\n data = {\n showSlug: show.id.slug,\n episodes,\n options: {}\n };\n }\n\n this.loading = true;\n this.loadingMessage = 'Queue search...';\n api.put('search/manual', data) // eslint-disable-line no-undef\n .then(() => {\n console.info(`Queued search for show: ${show.id.slug} season: ${season}, episode: ${episode}`);\n this.loadingMessage = 'Queued search...';\n }).catch(error => {\n console.error(String(error));\n });\n },\n\n rowStyleClassFn(row) {\n return row.status || 'skipped';\n },\n\n async snatchResult(evt, result) {\n const {\n layout\n } = this;\n evt.target.src = `images/loading16-${layout.themeName}.gif`;\n\n try {\n const response = await Object(_api__WEBPACK_IMPORTED_MODULE_0__[\"apiRoute\"])('home/pickManualSearch', {\n params: {\n provider: result.provider.id,\n identifier: result.identifier\n }\n });\n\n if (response.data.result === 'success') {\n evt.target.src = 'images/save.png';\n } else {\n evt.target.src = 'images/no16.png';\n }\n } catch (error) {\n console.error(String(error));\n evt.target.src = 'images/no16.png';\n }\n }\n\n },\n watch: {\n queueitems: {\n async handler(queue) {\n // Check for manual searches\n const queueForThisEpisode = queue.filter(q => ['MANUAL-SEARCH'].includes(q.name) && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [last] = queueForThisEpisode.slice(-1);\n\n if (last) {\n const searchStatus = last.success === null ? 'running' : 'finished';\n\n if (searchStatus === 'running') {\n this.loading = true;\n this.loadingMessage = 'Started searching providers...';\n } else {\n this.loadingMessage = 'Finished manual search';\n setTimeout(() => {\n this.loading = false;\n this.loadingMessage = '';\n }, 5000);\n }\n } // Check for snach selection\n\n\n const snatchedForThisEpisode = queue.filter(q => q.name === 'SNATCH-RESULT' && q.segment.length && q.segment.find(ep => ep.season === this.season && ep.episode === this.episode));\n const [lastSnatch] = snatchedForThisEpisode.slice(-1);\n\n if (lastSnatch && lastSnatch.success === true) {\n const {\n getProviderCacheResults,\n getShowEpisodeHistory,\n show,\n season,\n episode\n } = this; // // Change the row indication into snatched.\n // for (const row in this.$refs['vgt-show-results'].$refs) {\n // if (!row.includes('row')) {\n // continue;\n // }\n // const rowRef = this.$refs['vgt-show-results'].$refs[row];\n // const snatchButton = rowRef[0].lastChild;\n // const identifier = snatchButton.firstChild.firstChild.getAttribute('data-identifier');\n // if (lastSnatch.searchResult.identifier === identifier) {\n // rowRef[0].setAttribute('class', 'snatched');\n // }\n // }\n // Something changed, let's get a new batch of provider results.\n\n await getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_5__[\"episodeToSlug\"])(season, episode)\n });\n await getProviderCacheResults({\n showSlug: show.id.slug,\n season,\n episode\n });\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -975,7 +975,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\nspan.global-ignored[data-v-0ad4c7fc] {\\n color: red;\\n}\\nspan.show-ignored[data-v-0ad4c7fc] {\\n color: red;\\n font-style: italic;\\n}\\nspan.global-required[data-v-0ad4c7fc] {\\n color: green;\\n}\\nspan.show-required[data-v-0ad4c7fc] {\\n color: green;\\n font-style: italic;\\n}\\nspan.global-undesired[data-v-0ad4c7fc] {\\n color: orange;\\n}\\n\\n/** Use this as table styling for all table layouts */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th:first-child,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-0ad4c7fc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground {\\n clear: both;\\n opacity: 0.9;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground table {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground > table th.vgt-row-header {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground td.col-search {\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\nshow-history[data-v-0ad4c7fc] {\\n margin-bottom: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\nspan.global-ignored[data-v-0ad4c7fc] {\\n color: red;\\n}\\nspan.show-ignored[data-v-0ad4c7fc] {\\n color: red;\\n font-style: italic;\\n}\\nspan.global-required[data-v-0ad4c7fc] {\\n color: green;\\n}\\nspan.show-required[data-v-0ad4c7fc] {\\n color: green;\\n font-style: italic;\\n}\\nspan.global-undesired[data-v-0ad4c7fc] {\\n color: orange;\\n}\\n\\n/** Use this as table styling for all table layouts */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table {\\n width: 100%;\\n margin-right: auto;\\n margin-left: auto;\\n text-align: left;\\n border-spacing: 0;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td {\\n padding: 4px;\\n vertical-align: middle;\\n}\\n\\n/* remove extra border from left edge */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th:first-child,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table td:first-child {\\n border-left: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th {\\n text-align: center;\\n border-collapse: collapse;\\n font-weight: normal;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table span.break-word {\\n word-wrap: break-word;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting.sorting-asc {\\n background-position-x: right;\\n background-position-y: bottom;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th.sorting {\\n background-repeat: no-repeat;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table thead th {\\n padding: 4px;\\n cursor: default;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter {\\n width: 98%;\\n height: auto;\\n -webkit-box-sizing: border-box;\\n -moz-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row,\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.tablesorter-filter-row td {\\n text-align: center;\\n}\\n\\n/* optional disabled input styling */\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table input.tablesorter-filter-row .disabled {\\n display: none;\\n}\\n.tablesorter-header-inner[data-v-0ad4c7fc] {\\n padding: 0 2px;\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot tr {\\n text-align: center;\\n border-collapse: collapse;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tfoot a {\\n text-decoration: none;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table th.vgt-row-header {\\n text-align: left;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table .season-header {\\n display: inline;\\n margin-left: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-table tr.spacer {\\n height: 25px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu {\\n position: absolute;\\n z-index: 1000;\\n float: left;\\n min-width: 160px;\\n padding: 5px 0;\\n margin: 2px 0 0;\\n font-size: 14px;\\n text-align: left;\\n list-style: none;\\n background-clip: padding-box;\\n border-radius: 4px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .vgt-dropdown-menu > li > span {\\n display: block;\\n padding: 3px 20px;\\n clear: both;\\n font-weight: 400;\\n line-height: 1.42857143;\\n white-space: nowrap;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .align-center {\\n display: flex;\\n justify-content: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .indexer-image :not(:last-child) {\\n margin-right: 5px;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .button-row {\\n width: 100%;\\n display: inline-block;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground {\\n clear: both;\\n opacity: 0.9;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground table {\\n table-layout: auto;\\n width: 100%;\\n border-collapse: collapse;\\n border-spacing: 0;\\n text-align: center;\\n border: none;\\n empty-cells: show;\\n color: rgb(0, 0, 0) !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground > table th.vgt-row-header {\\n border: none !important;\\n background-color: transparent !important;\\n color: rgb(255, 255, 255) !important;\\n padding-top: 15px !important;\\n text-align: left !important;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .fanartBackground td.col-search {\\n text-align: center;\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .skipped {\\n background-color: rgb(190, 222, 237);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .snatched {\\n background-color: rgb(235, 193, 234);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .downloaded {\\n background-color: rgb(255, 218, 138);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .failed {\\n background-color: rgb(255, 153, 153);\\n}\\n.snatch-selection-template[data-v-0ad4c7fc] .subtitled {\\n background-color: rgb(190, 222, 237);\\n}\\nshow-history[data-v-0ad4c7fc] {\\n margin-bottom: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/snatch-selection.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1477,7 +1477,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"show-header-container\" },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"col-lg-12\",\n attrs: { id: \"showtitle\", \"data-showname\": _vm.show.title }\n },\n [\n _c(\"div\", [\n _c(\n \"h1\",\n {\n staticClass: \"title\",\n attrs: {\n \"data-indexer-name\": _vm.show.indexer,\n \"data-series-id\": _vm.show.id[_vm.show.indexer],\n id: \"scene_exception_\" + _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _vm.type === \"snatch-selection\"\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right episode-info\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Manual search for: Season \" +\n _vm._s(_vm.season)\n ),\n _vm.episode !== undefined &&\n _vm.manualSearchType !== \"season\"\n ? [_vm._v(\" Episode \" + _vm._s(_vm.episode))]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.episodeTitle) +\n \"\\n \"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.type !== \"snatch-selection\" && _vm.seasons.length >= 1\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _vm.seasons.includes(0)\n ? _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Display Specials: \"\n ),\n _c(\n \"a\",\n {\n staticClass: \"inner\",\n staticStyle: { cursor: \"pointer\" },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.toggleSpecials()\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n _vm.displaySpecials ? \"Hide\" : \"Show\"\n )\n )\n ]\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"h2footer display-seasons clear\" },\n [\n _c(\n \"span\",\n [\n _vm.seasons.length >= 15\n ? _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.jumpToSeason,\n expression: \"jumpToSeason\"\n }\n ],\n staticClass: \"form-control input-sm\",\n staticStyle: { position: \"relative\" },\n attrs: { id: \"seasonJump\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.jumpToSeason = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { value: \"jump\" } },\n [_vm._v(\"Jump to Season\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.seasons, function(\n seasonNumber\n ) {\n return _c(\n \"option\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n domProps: { value: seasonNumber }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : \"Season \" + seasonNumber\n ) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n )\n : _vm.seasons.length >= 1\n ? [\n _vm._v(\n \"\\n Season:\\n \"\n ),\n _vm._l(_vm.reverse(_vm.seasons), function(\n seasonNumber,\n index\n ) {\n return [\n _c(\n \"app-link\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n attrs: {\n href: \"#season-\" + seasonNumber\n },\n nativeOn: {\n click: function($event) {\n $event.preventDefault()\n _vm.jumpToSeason = seasonNumber\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : seasonNumber\n ) +\n \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n index !== _vm.seasons.length - 1\n ? _c(\n \"span\",\n {\n key: \"separator-\" + index,\n staticClass: \"separator\"\n },\n [_vm._v(\"| \")]\n )\n : _vm._e()\n ]\n })\n ]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _vm._l(_vm.activeShowQueueStatuses, function(queueItem) {\n return _c(\"div\", { key: queueItem.action, staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"alert alert-info\" }, [\n _vm._v(\"\\n \" + _vm._s(queueItem.message) + \"\\n \")\n ])\n ])\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"summaryBackground\" }\n },\n [\n _c(\"div\", { staticClass: \"row\", attrs: { id: \"row-show-summary\" } }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { id: \"col-show-summary\" } },\n [\n _c(\"div\", { staticClass: \"show-poster-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"image-flex-container col-md-12\" },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/poster.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"posterThumb\",\n cls: \"show-image shadow\",\n link: true\n }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"ver-spacer\" }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-info-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"pull-right col-lg-3 col-md-3 hidden-sm hidden-xs\"\n },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/banner.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"banner\",\n cls: \"show-banner pull-right shadow\",\n link: true\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"show-rating\" }\n },\n [\n _vm.show.rating.imdb && _vm.show.rating.imdb.rating\n ? _c(\n \"span\",\n {\n staticClass: \"imdbstars\",\n attrs: {\n \"qtip-content\":\n _vm.show.rating.imdb.rating +\n \" / 10 Stars
    \" +\n _vm.show.rating.imdb.votes +\n \" Votes\"\n }\n },\n [\n _c(\"span\", {\n style: {\n width:\n Number(_vm.show.rating.imdb.rating) * 10 +\n \"%\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n !_vm.show.id.imdb\n ? [\n _vm.show.year.start\n ? _c(\"span\", [\n _vm._v(\n \"(\" +\n _vm._s(_vm.show.year.start) +\n \") - \" +\n _vm._s(_vm.show.runtime) +\n \" minutes - \"\n )\n ])\n : _vm._e()\n ]\n : [\n _vm._l(_vm.show.countryCodes, function(country) {\n return _c(\"img\", {\n key: \"flag-\" + country,\n class: [\"country-flag\", \"flag-\" + country],\n staticStyle: {\n \"margin-left\": \"3px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n src: \"images/blank.png\",\n width: \"16\",\n height: \"11\"\n }\n })\n }),\n _vm._v(\" \"),\n _vm.show.imdbInfo.year\n ? _c(\"span\", [\n _vm._v(\n \"\\n (\" +\n _vm._s(_vm.show.imdbInfo.year) +\n \") -\\n \"\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.imdbInfo.runtimes ||\n _vm.show.runtime\n ) +\n \" minutes\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb,\n title:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _vm.show.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[_vm.show.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl,\n title: _vm.showIndexerUrl\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[_vm.show.indexer].name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[_vm.show.indexer].icon\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.xemNumbering &&\n _vm.show.xemNumbering.length > 0\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://thexem.de/search?q=\" +\n _vm.show.title,\n title:\n \"http://thexem.de/search?q=\" +\n _vm.show.title\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[xem]\",\n height: \"16\",\n width: \"16\",\n src: \"images/xem.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.id.tvdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://fanart.tv/series/\" +\n _vm.show.id.tvdb,\n title:\n \"https://fanart.tv/series/\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\"img\", {\n staticClass: \"fanart\",\n attrs: {\n alt: \"[fanart.tv]\",\n height: \"16\",\n width: \"16\",\n src: \"images/fanart.tv.png\"\n }\n })\n ]\n )\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"tags\" }\n },\n [\n _vm.show.genres\n ? _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(\n _vm.dedupeGenres(_vm.show.genres),\n function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://trakt.tv/shows/popular/?genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on trakt.tv\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }\n ),\n 1\n )\n : _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(_vm.showGenres, function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://www.imdb.com/search/title?count=100&title_type=tv_series&genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on IMDB\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }),\n 1\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.configLoaded\n ? _c(\n \"div\",\n {\n ref: \"summary\",\n staticClass: \"col-md-12\",\n attrs: { id: \"summary\" }\n },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-9 col-md-8 col-sm-8 col-xs-12\",\n class: {\n summaryFanArt: _vm.layout.fanartBackground\n },\n attrs: { id: \"show-summary\" }\n },\n [\n _c(\n \"table\",\n { staticClass: \"summaryTable pull-left\" },\n [\n _vm.show.plot\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticStyle: {\n \"padding-bottom\": \"15px\"\n },\n attrs: { colspan: \"2\" }\n },\n [\n _c(\"truncate\", {\n attrs: {\n length: 250,\n clamp: \"show more...\",\n less: \"show less...\",\n text: _vm.show.plot\n },\n on: {\n toggle: function($event) {\n return _vm.$emit(\"reflow\")\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.getQualityPreset({\n value: _vm.combinedQualities\n }) !== undefined\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Quality:\")]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\"quality-pill\", {\n attrs: {\n quality:\n _vm.combinedQualities\n }\n })\n ],\n 1\n )\n ])\n : [\n _vm.combineQualities(\n _vm.show.config.qualities.allowed\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Allowed Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.allowed,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"allowed-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.combineQualities(\n _vm.show.config.qualities\n .preferred\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Preferred Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.preferred,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"preferred-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n _vm._v(\" \"),\n _vm.show.network && _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\n \" on \" +\n _vm._s(_vm.show.network)\n )\n ])\n ])\n : _vm.show.network\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.network))\n ])\n ])\n : _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Show Status: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.status))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Default EP Status: \")]\n ),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config\n .defaultEpisodeStatus\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [_vm._v(\"Location: \")]\n )\n ]\n ),\n _c(\"td\", [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [\n _vm._v(\n _vm._s(_vm.show.config.location)\n )\n ]\n ),\n _vm._v(\n _vm._s(\n _vm.show.config.locationValid\n ? \"\"\n : \" (Missing)\"\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _vm.show.config.aliases.filter(function(\n alias\n ) {\n return alias.season === -1\n }).length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [_vm._v(\"Scene Name:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.aliases\n .filter(function(alias) {\n return alias.season === -1\n })\n .map(function(alias) {\n return alias.title\n })\n .join(\", \")\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.requiredWords\n .length +\n _vm.search.filters.required.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n required:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Required Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .requiredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.requiredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.required\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .requiredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .requiredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.required.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.ignoredWords\n .length +\n _vm.search.filters.ignored.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n ignored:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Ignored Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .ignoredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.ignoredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.ignored\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .ignoredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .ignoredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.ignored.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.preferred.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n preferred:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Preferred Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.preferred.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.undesired.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n undesired:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Undesired Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.undesired.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.whitelist &&\n _vm.show.config.release.whitelist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Wanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.whitelist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.blacklist &&\n _vm.show.config.release.blacklist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Unwanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.blacklist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.airdateOffset !== 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Daily search offset:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.airdateOffset\n ) + \" hours\"\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.locationValid &&\n _vm.show.size > -1\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Size:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.humanFileSize(\n _vm.show.size\n )\n )\n )\n ])\n ])\n : _vm._e()\n ],\n 2\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-3 col-md-4 col-sm-4 col-xs-12 pull-xs-left\",\n attrs: { id: \"show-status\" }\n },\n [\n _c(\n \"table\",\n {\n staticClass:\n \"pull-xs-left pull-md-right pull-sm-right pull-lg-right\"\n },\n [\n _vm.show.language\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Info Language:\")]\n ),\n _c(\"td\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n _vm.getCountryISO2ToISO3(\n _vm.show.language\n ) +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: _vm.show.language,\n title: _vm.show.language,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.config.subtitles.enabled\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Subtitles: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .subtitlesEnabled\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"subtitlesEnabled\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Season Folders: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .seasonFolders ||\n _vm.config.namingForceFolders\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Paused: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.paused\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"paused\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Air-by-Date: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.airByDate\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"airByDate\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Sports: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.sports\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"sports\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Anime: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.anime\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"anime\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"DVD Order: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.dvdOrder\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"dvdOrder\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Scene Numbering: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.scene\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"scene\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n ]\n )\n ]\n )\n ])\n ]\n )\n : _vm._e()\n ])\n ])\n ]\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"episodes-controll-background\" }\n },\n [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"row\",\n attrs: { id: \"row-show-episodes-controls\" }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12\",\n attrs: { id: \"col-show-episodes-controls\" }\n },\n [\n _vm.type === \"show\"\n ? _c(\"div\", { staticClass: \"row key\" }, [\n _c(\n \"div\",\n {\n ref: \"checkboxControls\",\n staticClass: \"col-lg-12\",\n attrs: { id: \"checkboxControls\" }\n },\n [\n _vm.show.seasons\n ? _c(\n \"div\",\n {\n staticClass: \"pull-left top-5\",\n attrs: { id: \"key-padding\" }\n },\n _vm._l(_vm.overviewStatus, function(\n status\n ) {\n return _c(\n \"label\",\n {\n key: status.id,\n attrs: { for: status.id }\n },\n [\n _c(\"span\", { class: status.id }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: status.checked,\n expression: \"status.checked\"\n }\n ],\n attrs: {\n type: \"checkbox\",\n id: status.id\n },\n domProps: {\n checked: Array.isArray(\n status.checked\n )\n ? _vm._i(\n status.checked,\n null\n ) > -1\n : status.checked\n },\n on: {\n change: [\n function($event) {\n var $$a = status.checked,\n $$el = $event.target,\n $$c = $$el.checked\n ? true\n : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(\n status,\n \"checked\",\n $$a.concat([$$v])\n )\n } else {\n $$i > -1 &&\n _vm.$set(\n status,\n \"checked\",\n $$a\n .slice(0, $$i)\n .concat(\n $$a.slice(\n $$i + 1\n )\n )\n )\n }\n } else {\n _vm.$set(\n status,\n \"checked\",\n $$c\n )\n }\n },\n function($event) {\n return _vm.$emit(\n \"update-overview-status\",\n _vm.overviewStatus\n )\n }\n ]\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \": \"\n ),\n _c(\"b\", [\n _vm._v(\n _vm._s(\n _vm.episodeSummary[\n status.name\n ]\n )\n )\n ])\n ])\n ]\n )\n }),\n 0\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"pull-lg-right top-5\" },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedStatus,\n expression: \"selectedStatus\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"statusSelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedStatus = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change status to:\"\n }\n },\n [_vm._v(\"Change status to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(\n _vm.changeStatusOptions,\n function(status) {\n return _c(\n \"option\",\n {\n key: status.key,\n domProps: {\n value: status.value\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \"\\n \"\n )\n ]\n )\n }\n )\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedQuality,\n expression: \"selectedQuality\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"qualitySelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedQuality = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change quality to:\"\n }\n },\n [_vm._v(\"Change quality to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.qualities, function(\n quality\n ) {\n return _c(\n \"option\",\n {\n key: quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-slug\"\n },\n domProps: { value: _vm.show.id.slug }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-id\"\n },\n domProps: {\n value: _vm.show.id[_vm.show.indexer]\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"indexer\" },\n domProps: { value: _vm.show.indexer }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n id: \"changeStatus\",\n value: \"Go\"\n },\n on: { click: _vm.changeStatusClicked }\n })\n ]\n )\n ]\n )\n ])\n : _c(\"div\")\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"show-header-container\" },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"col-lg-12\",\n attrs: { id: \"showtitle\", \"data-showname\": _vm.show.title }\n },\n [\n _c(\"div\", [\n _c(\n \"h1\",\n {\n staticClass: \"title\",\n attrs: {\n \"data-indexer-name\": _vm.show.indexer,\n \"data-series-id\": _vm.show.id[_vm.show.indexer],\n id: \"scene_exception_\" + _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\n \"app-link\",\n {\n staticClass: \"snatchTitle\",\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.indexer +\n \"&seriesid=\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [_vm._v(_vm._s(_vm.show.title))]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _vm.type === \"snatch-selection\"\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right episode-info\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Manual search for: Season \" +\n _vm._s(_vm.season)\n ),\n _vm.episode !== undefined &&\n _vm.manualSearchType !== \"season\"\n ? [_vm._v(\" Episode \" + _vm._s(_vm.episode))]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _vm.episodeTitle\n ? _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.episodeTitle) +\n \"\\n \"\n )\n ])\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.type !== \"snatch-selection\" && _vm.seasons.length >= 1\n ? _c(\n \"div\",\n {\n staticClass: \"pull-right\",\n attrs: { id: \"show-specials-and-seasons\" }\n },\n [\n _vm.seasons.includes(0)\n ? _c(\n \"span\",\n { staticClass: \"h2footer display-specials\" },\n [\n _vm._v(\n \"\\n Display Specials: \"\n ),\n _c(\n \"a\",\n {\n staticClass: \"inner\",\n staticStyle: { cursor: \"pointer\" },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.toggleSpecials()\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n _vm.displaySpecials ? \"Hide\" : \"Show\"\n )\n )\n ]\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"h2footer display-seasons clear\" },\n [\n _c(\n \"span\",\n [\n _vm.seasons.length >= 15\n ? _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.jumpToSeason,\n expression: \"jumpToSeason\"\n }\n ],\n staticClass: \"form-control input-sm\",\n staticStyle: { position: \"relative\" },\n attrs: { id: \"seasonJump\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.jumpToSeason = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { value: \"jump\" } },\n [_vm._v(\"Jump to Season\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.seasons, function(\n seasonNumber\n ) {\n return _c(\n \"option\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n domProps: { value: seasonNumber }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : \"Season \" + seasonNumber\n ) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n )\n : _vm.seasons.length >= 1\n ? [\n _vm._v(\n \"\\n Season:\\n \"\n ),\n _vm._l(_vm.reverse(_vm.seasons), function(\n seasonNumber,\n index\n ) {\n return [\n _c(\n \"app-link\",\n {\n key:\n \"jumpToSeason-\" + seasonNumber,\n attrs: {\n href: \"#season-\" + seasonNumber\n },\n nativeOn: {\n click: function($event) {\n $event.preventDefault()\n _vm.jumpToSeason = seasonNumber\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n seasonNumber === 0\n ? \"Specials\"\n : seasonNumber\n ) +\n \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n index !== _vm.seasons.length - 1\n ? _c(\n \"span\",\n {\n key: \"separator-\" + index,\n staticClass: \"separator\"\n },\n [_vm._v(\"| \")]\n )\n : _vm._e()\n ]\n })\n ]\n : _vm._e()\n ],\n 2\n )\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _vm._l(_vm.activeShowQueueStatuses, function(queueItem) {\n return _c(\"div\", { key: queueItem.action, staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"alert alert-info\" }, [\n _vm._v(\"\\n \" + _vm._s(queueItem.message) + \"\\n \")\n ])\n ])\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"summaryBackground\" }\n },\n [\n _c(\"div\", { staticClass: \"row\", attrs: { id: \"row-show-summary\" } }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { id: \"col-show-summary\" } },\n [\n _c(\"div\", { staticClass: \"show-poster-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"image-flex-container col-md-12\" },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/poster.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"posterThumb\",\n cls: \"show-image shadow\",\n link: true\n }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"ver-spacer\" }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-info-container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"pull-right col-lg-3 col-md-3 hidden-sm hidden-xs\"\n },\n [\n _c(\"asset\", {\n attrs: {\n default: \"images/banner.png\",\n \"show-slug\": _vm.show.id.slug,\n type: \"banner\",\n cls: \"show-banner pull-right shadow\",\n link: true\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"show-rating\" }\n },\n [\n _vm.show.rating.imdb && _vm.show.rating.imdb.rating\n ? _c(\n \"span\",\n {\n staticClass: \"imdbstars\",\n attrs: {\n \"qtip-content\":\n _vm.show.rating.imdb.rating +\n \" / 10 Stars
    \" +\n _vm.show.rating.imdb.votes +\n \" Votes\"\n }\n },\n [\n _c(\"span\", {\n style: {\n width:\n Number(_vm.show.rating.imdb.rating) * 10 +\n \"%\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n !_vm.show.id.imdb\n ? [\n _vm.show.year.start\n ? _c(\"span\", [\n _vm._v(\n \"(\" +\n _vm._s(_vm.show.year.start) +\n \") - \" +\n _vm._s(_vm.show.runtime) +\n \" minutes - \"\n )\n ])\n : _vm._e()\n ]\n : [\n _vm._l(_vm.show.countryCodes, function(country) {\n return _c(\"img\", {\n key: \"flag-\" + country,\n class: [\"country-flag\", \"flag-\" + country],\n staticStyle: {\n \"margin-left\": \"3px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n src: \"images/blank.png\",\n width: \"16\",\n height: \"11\"\n }\n })\n }),\n _vm._v(\" \"),\n _vm.show.imdbInfo.year\n ? _c(\"span\", [\n _vm._v(\n \"\\n (\" +\n _vm._s(_vm.show.imdbInfo.year) +\n \") -\\n \"\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.imdbInfo.runtimes ||\n _vm.show.runtime\n ) +\n \" minutes\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb,\n title:\n \"https://www.imdb.com/title/\" +\n _vm.show.id.imdb\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[imdb]\",\n height: \"16\",\n width: \"16\",\n src: \"images/imdb.png\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _vm.show.id.trakt\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt,\n title:\n \"https://trakt.tv/shows/\" +\n _vm.show.id.trakt\n }\n },\n [\n _c(\"img\", {\n attrs: {\n alt: \"[trakt]\",\n height: \"16\",\n width: \"16\",\n src: \"images/trakt.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showIndexerUrl &&\n _vm.indexerConfig[_vm.show.indexer].icon\n ? _c(\n \"app-link\",\n {\n attrs: {\n href: _vm.showIndexerUrl,\n title: _vm.showIndexerUrl\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt:\n _vm.indexerConfig[_vm.show.indexer].name,\n height: \"16\",\n width: \"16\",\n src:\n \"images/\" +\n _vm.indexerConfig[_vm.show.indexer].icon\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.xemNumbering &&\n _vm.show.xemNumbering.length > 0\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"http://thexem.de/search?q=\" +\n _vm.show.title,\n title:\n \"http://thexem.de/search?q=\" +\n _vm.show.title\n }\n },\n [\n _c(\"img\", {\n staticStyle: {\n \"margin-top\": \"-1px\",\n \"vertical-align\": \"middle\"\n },\n attrs: {\n alt: \"[xem]\",\n height: \"16\",\n width: \"16\",\n src: \"images/xem.png\"\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.id.tvdb\n ? _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://fanart.tv/series/\" +\n _vm.show.id.tvdb,\n title:\n \"https://fanart.tv/series/\" +\n _vm.show.id[_vm.show.indexer]\n }\n },\n [\n _c(\"img\", {\n staticClass: \"fanart\",\n attrs: {\n alt: \"[fanart.tv]\",\n height: \"16\",\n width: \"16\",\n src: \"images/fanart.tv.png\"\n }\n })\n ]\n )\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"pull-left col-lg-9 col-md-9 col-sm-12 col-xs-12\",\n attrs: { id: \"tags\" }\n },\n [\n _vm.show.genres\n ? _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(\n _vm.dedupeGenres(_vm.show.genres),\n function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://trakt.tv/shows/popular/?genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on trakt.tv\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }\n ),\n 1\n )\n : _c(\n \"ul\",\n { staticClass: \"tags\" },\n _vm._l(_vm.showGenres, function(genre) {\n return _c(\n \"app-link\",\n {\n key: genre.toString(),\n attrs: {\n href:\n \"https://www.imdb.com/search/title?count=100&title_type=tv_series&genres=\" +\n genre.toLowerCase().replace(\" \", \"-\"),\n title:\n \"View other popular \" +\n genre +\n \" shows on IMDB\"\n }\n },\n [_c(\"li\", [_vm._v(_vm._s(genre))])]\n )\n }),\n 1\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _vm.configLoaded\n ? _c(\n \"div\",\n {\n ref: \"summary\",\n staticClass: \"col-md-12\",\n attrs: { id: \"summary\" }\n },\n [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-9 col-md-8 col-sm-8 col-xs-12\",\n class: {\n summaryFanArt: _vm.layout.fanartBackground\n },\n attrs: { id: \"show-summary\" }\n },\n [\n _c(\n \"table\",\n { staticClass: \"summaryTable pull-left\" },\n [\n _vm.show.plot\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticStyle: {\n \"padding-bottom\": \"15px\"\n },\n attrs: { colspan: \"2\" }\n },\n [\n _c(\"truncate\", {\n attrs: {\n length: 250,\n clamp: \"show more...\",\n less: \"show less...\",\n text: _vm.show.plot\n },\n on: {\n toggle: function($event) {\n return _vm.$emit(\"reflow\")\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.getQualityPreset({\n value: _vm.combinedQualities\n }) !== undefined\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Quality:\")]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\"quality-pill\", {\n attrs: {\n quality:\n _vm.combinedQualities\n }\n })\n ],\n 1\n )\n ])\n : [\n _vm.combineQualities(\n _vm.show.config.qualities.allowed\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Allowed Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.allowed,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"allowed-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.combineQualities(\n _vm.show.config.qualities\n .preferred\n ) > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\"\n },\n [\n _vm._v(\n \"Preferred Qualities:\"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _vm._l(\n _vm.show.config\n .qualities.preferred,\n function(\n curQuality,\n index\n ) {\n return [\n _vm._v(\n _vm._s(\n index > 0\n ? \", \"\n : \"\"\n )\n ),\n _c(\"quality-pill\", {\n key:\n \"preferred-\" +\n curQuality,\n attrs: {\n quality: curQuality\n }\n })\n ]\n }\n )\n ],\n 2\n )\n ])\n : _vm._e()\n ],\n _vm._v(\" \"),\n _vm.show.network && _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\n \" on \" +\n _vm._s(_vm.show.network)\n )\n ])\n ])\n : _vm.show.network\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.network))\n ])\n ])\n : _vm.show.airs\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Originally Airs: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.airs)),\n !_vm.show.airsFormatValid\n ? _c(\n \"b\",\n {\n staticClass:\n \"invalid-value\"\n },\n [\n _vm._v(\n \" (invalid time format)\"\n )\n ]\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Show Status: \")]\n ),\n _c(\"td\", [\n _vm._v(_vm._s(_vm.show.status))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Default EP Status: \")]\n ),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config\n .defaultEpisodeStatus\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [_vm._v(\"Location: \")]\n )\n ]\n ),\n _c(\"td\", [\n _c(\n \"span\",\n {\n class: {\n \"invalid-value\": !_vm.show\n .config.locationValid\n }\n },\n [\n _vm._v(\n _vm._s(_vm.show.config.location)\n )\n ]\n ),\n _vm._v(\n _vm._s(\n _vm.show.config.locationValid\n ? \"\"\n : \" (Missing)\"\n )\n )\n ])\n ]),\n _vm._v(\" \"),\n _vm.show.config.aliases.filter(function(\n alias\n ) {\n return alias.season === -1\n }).length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [_vm._v(\"Scene Name:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.aliases\n .filter(function(alias) {\n return alias.season === -1\n })\n .map(function(alias) {\n return alias.title\n })\n .join(\", \")\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.requiredWords\n .length +\n _vm.search.filters.required.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n required:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Required Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .requiredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.requiredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.required\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .requiredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .requiredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.required.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.ignoredWords\n .length +\n _vm.search.filters.ignored.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n ignored:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Ignored Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm.show.config.release\n .ignoredWords.length\n ? _c(\n \"span\",\n {\n staticClass: \"break-word\"\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.show.config.release.ignoredWords.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.ignored\n .length > 0\n ? _c(\n \"span\",\n {\n staticClass:\n \"break-word global-filter\"\n },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _vm.show.config\n .release\n .ignoredWords\n .length > 0\n ? [\n _vm.show.config\n .release\n .ignoredWordsExclude\n ? _c(\"span\", [\n _vm._v(\n \" excluded from: \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"+ \"\n )\n ])\n ]\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.search.filters.ignored.join(\n \", \"\n )\n ) +\n \"\\n \"\n )\n ],\n 2\n )\n ],\n 1\n )\n : _vm._e()\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.preferred.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n preferred:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Preferred Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.preferred.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.search.filters.undesired.length > 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n {\n staticClass: \"showLegend\",\n staticStyle: {\n \"vertical-align\": \"top\"\n }\n },\n [\n _c(\n \"span\",\n {\n class: {\n undesired:\n _vm.type ===\n \"snatch-selection\"\n }\n },\n [_vm._v(\"Undesired Words: \")]\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"td\",\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"config/search/#searchfilters\"\n }\n },\n [\n _c(\n \"span\",\n {\n staticClass:\n \"break-word\"\n },\n [\n _vm._v(\n _vm._s(\n _vm.search.filters.undesired.join(\n \", \"\n )\n )\n )\n ]\n )\n ]\n )\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.whitelist &&\n _vm.show.config.release.whitelist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Wanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.whitelist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.release.blacklist &&\n _vm.show.config.release.blacklist.length >\n 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Unwanted Groups:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.release.blacklist.join(\n \", \"\n )\n )\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.airdateOffset !== 0\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Daily search offset:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.show.config.airdateOffset\n ) + \" hours\"\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.config.locationValid &&\n _vm.show.size > -1\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Size:\")]\n ),\n _vm._v(\" \"),\n _c(\"td\", [\n _vm._v(\n _vm._s(\n _vm.humanFileSize(\n _vm.show.size\n )\n )\n )\n ])\n ])\n : _vm._e()\n ],\n 2\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass:\n \"col-lg-3 col-md-4 col-sm-4 col-xs-12 pull-xs-left\",\n attrs: { id: \"show-status\" }\n },\n [\n _c(\n \"table\",\n {\n staticClass:\n \"pull-xs-left pull-md-right pull-sm-right pull-lg-right\"\n },\n [\n _vm.show.language\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Info Language:\")]\n ),\n _c(\"td\", [\n _c(\"img\", {\n attrs: {\n src:\n \"images/subtitles/flags/\" +\n _vm.getCountryISO2ToISO3(\n _vm.show.language\n ) +\n \".png\",\n width: \"16\",\n height: \"11\",\n alt: _vm.show.language,\n title: _vm.show.language,\n onError:\n \"this.onerror=null;this.src='images/flags/unknown.png';\"\n }\n })\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.config.subtitles.enabled\n ? _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Subtitles: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .subtitlesEnabled\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"subtitlesEnabled\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Season Folders: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state:\n _vm.show.config\n .seasonFolders ||\n _vm.config.namingForceFolders\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Paused: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.paused\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"paused\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Air-by-Date: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.airByDate\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"airByDate\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Sports: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.sports\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"sports\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Anime: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.anime\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"anime\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"DVD Order: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.dvdOrder\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"dvdOrder\"\n )\n }\n }\n })\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"tr\", [\n _c(\n \"td\",\n { staticClass: \"showLegend\" },\n [_vm._v(\"Scene Numbering: \")]\n ),\n _c(\n \"td\",\n [\n _c(\"state-switch\", {\n attrs: {\n theme: _vm.layout.themeName,\n state: _vm.show.config.scene\n },\n on: {\n click: function($event) {\n return _vm.toggleConfigOption(\n \"scene\"\n )\n }\n }\n })\n ],\n 1\n )\n ])\n ]\n )\n ]\n )\n ])\n ]\n )\n : _vm._e()\n ])\n ])\n ]\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"shadow shadow-background\",\n attrs: { id: \"episodes-controll-background\" }\n },\n [\n _vm.show\n ? _c(\n \"div\",\n {\n staticClass: \"row\",\n attrs: { id: \"row-show-episodes-controls\" }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"col-md-12\",\n attrs: { id: \"col-show-episodes-controls\" }\n },\n [\n _vm.type === \"show\"\n ? _c(\"div\", { staticClass: \"row key\" }, [\n _c(\n \"div\",\n {\n ref: \"checkboxControls\",\n staticClass: \"col-lg-12\",\n attrs: { id: \"checkboxControls\" }\n },\n [\n _vm.show.seasons\n ? _c(\n \"div\",\n {\n staticClass: \"pull-left top-5\",\n attrs: { id: \"key-padding\" }\n },\n _vm._l(_vm.overviewStatus, function(\n status\n ) {\n return _c(\n \"label\",\n {\n key: status.id,\n attrs: { for: status.id }\n },\n [\n _c(\"span\", { class: status.id }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: status.checked,\n expression: \"status.checked\"\n }\n ],\n attrs: {\n type: \"checkbox\",\n id: status.id\n },\n domProps: {\n checked: Array.isArray(\n status.checked\n )\n ? _vm._i(\n status.checked,\n null\n ) > -1\n : status.checked\n },\n on: {\n change: [\n function($event) {\n var $$a = status.checked,\n $$el = $event.target,\n $$c = $$el.checked\n ? true\n : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(\n status,\n \"checked\",\n $$a.concat([$$v])\n )\n } else {\n $$i > -1 &&\n _vm.$set(\n status,\n \"checked\",\n $$a\n .slice(0, $$i)\n .concat(\n $$a.slice(\n $$i + 1\n )\n )\n )\n }\n } else {\n _vm.$set(\n status,\n \"checked\",\n $$c\n )\n }\n },\n function($event) {\n return _vm.$emit(\n \"update-overview-status\",\n _vm.overviewStatus\n )\n }\n ]\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \": \"\n ),\n _c(\"b\", [\n _vm._v(\n _vm._s(\n _vm.episodeSummary[\n status.name\n ]\n )\n )\n ])\n ])\n ]\n )\n }),\n 0\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"pull-lg-right top-5\" },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedStatus,\n expression: \"selectedStatus\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"statusSelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedStatus = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change status to:\"\n }\n },\n [_vm._v(\"Change status to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(\n _vm.changeStatusOptions,\n function(status) {\n return _c(\n \"option\",\n {\n key: status.key,\n domProps: {\n value: status.value\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(status.name) +\n \"\\n \"\n )\n ]\n )\n }\n )\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedQuality,\n expression: \"selectedQuality\"\n }\n ],\n staticClass:\n \"form-control form-control-inline input-sm-custom input-sm-smallfont\",\n attrs: { id: \"qualitySelect\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call(\n $event.target.options,\n function(o) {\n return o.selected\n }\n )\n .map(function(o) {\n var val =\n \"_value\" in o\n ? o._value\n : o.value\n return val\n })\n _vm.selectedQuality = $event.target\n .multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n {\n domProps: {\n value: \"Change quality to:\"\n }\n },\n [_vm._v(\"Change quality to:\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.qualities, function(\n quality\n ) {\n return _c(\n \"option\",\n {\n key: quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-slug\"\n },\n domProps: { value: _vm.show.id.slug }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"series-id\"\n },\n domProps: {\n value: _vm.show.id[_vm.show.indexer]\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"indexer\" },\n domProps: { value: _vm.show.indexer }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n id: \"changeStatus\",\n value: \"Go\"\n },\n on: { click: _vm.changeStatusClicked }\n })\n ]\n )\n ]\n )\n ])\n : _c(\"div\")\n ]\n )\n ]\n )\n : _vm._e()\n ]\n )\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-header.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1489,7 +1489,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider/Group\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.statusName !== \"Downloaded\"\n ? _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.statusName === \"Downloaded\"\n ? props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n : props.row.provider.name\n ) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider/Group\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.statusName !== \"Downloaded\"\n ? _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n [\"Downloaded\", \"Subtitled\"].includes(\n props.row.statusName\n )\n ? props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n : props.row.provider.name\n ) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1561,7 +1561,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-results-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\n \"div\",\n { staticClass: \"button-row\" },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Refresh Results\" },\n on: { click: _vm.getProviderResults }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Force Search\" },\n on: { click: _vm.forceSearch }\n }),\n _vm._v(\" \"),\n _vm.loading\n ? [\n _c(\"state-switch\", { attrs: { state: \"loading\" } }),\n _vm._v(\" \"),\n _c(\"span\", [_vm._v(_vm._s(_vm.loadingMessage))])\n ]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show.id.slug,\n expression: \"show.id.slug\"\n }\n ],\n ref: \"vgt-show-results\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.combinedResults,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"pubdate\", type: \"desc\" }\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n styleClass: \"vgt-table condensed\"\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.imageName,\n alt: props.row.provider.name,\n width: \"16\"\n }\n })\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Added\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.dateAdded\n ? _vm.fuzzyParseDateTime(\n props.row.dateAdded\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Published\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.pubdate\n ? _vm.fuzzyParseDateTime(props.row.pubdate)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Updated\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.time\n ? _vm.fuzzyParseDateTime(props.row.time)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Snatch\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src: \"images/download.png\",\n width: \"16\",\n height: \"16\",\n alt: \"snatch\",\n title: \"Download selected episode\",\n \"data-identifier\": props.row.identifier\n },\n on: {\n click: function($event) {\n return _vm.snatchResult($event, props.row)\n }\n }\n })\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-results-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\n \"div\",\n { staticClass: \"button-row\" },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Refresh Results\" },\n on: { click: _vm.getProviderResults }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa manualSearchButton top-5 bottom-5\",\n attrs: { type: \"button\", value: \"Force Search\" },\n on: { click: _vm.forceSearch }\n }),\n _vm._v(\" \"),\n _vm.loading\n ? [\n _c(\"state-switch\", { attrs: { state: \"loading\" } }),\n _vm._v(\" \"),\n _c(\"span\", [_vm._v(_vm._s(_vm.loadingMessage))])\n ]\n : _vm._e()\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.show.id.slug,\n expression: \"show.id.slug\"\n }\n ],\n ref: \"vgt-show-results\",\n attrs: {\n columns: _vm.columns,\n rows: _vm.combinedResults,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"pubdate\", type: \"desc\" }\n },\n \"row-style-class\": _vm.rowStyleClassFn,\n styleClass: \"vgt-table condensed\"\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Provider\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _c(\"img\", {\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.imageName,\n alt: props.row.provider.name,\n width: \"16\"\n }\n })\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Seeds\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.seeders !== -1\n ? props.row.seeders\n : \"-\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Peers\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.leechers !== -1\n ? props.row.leechers\n : \"-\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Added\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.dateAdded\n ? _vm.fuzzyParseDateTime(\n props.row.dateAdded\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Published\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.pubdate\n ? _vm.fuzzyParseDateTime(props.row.pubdate)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Updated\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.time\n ? _vm.fuzzyParseDateTime(props.row.time)\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label == \"Snatch\"\n ? _c(\"span\", [\n _c(\"img\", {\n attrs: {\n src: \"images/download.png\",\n width: \"16\",\n height: \"16\",\n alt: \"snatch\",\n title: \"Download selected episode\",\n \"data-identifier\": props.row.identifier\n },\n on: {\n click: function($event) {\n return _vm.snatchResult($event, props.row)\n }\n }\n })\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-results.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -4842,7 +4842,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false;\n const results = []; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n results.push(...response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n\n return results;\n };\n\n const result = {\n providersSearched: 0,\n totalSearchResults: []\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n result.providersSearched += 1;\n const providerResults = await getProviderResults(provider);\n result.totalSearchResults.push(...providerResults);\n }\n\n return result;\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n if (!state.providers[searchResult.provider.id]) {\n state.providers[searchResult.provider.id] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false;\n const results = []; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n results.push(...response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n\n return results;\n };\n\n const result = {\n providersSearched: 0,\n totalSearchResults: []\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n result.providersSearched += 1;\n const providerResults = await getProviderResults(provider);\n result.totalSearchResults.push(...providerResults);\n }\n\n return result;\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.js?"); /***/ }), From 029fe4e6e0075a5ba723a99851d6dd800aafac1b Mon Sep 17 00:00:00 2001 From: P0psicles Date: Sun, 21 Jun 2020 20:27:16 +0200 Subject: [PATCH 48/87] Improve history table for subtitle rows --- themes-default/slim/src/components/show-history.vue | 9 +++++++-- themes/dark/assets/js/medusa-runtime.js | 4 ++-- themes/light/assets/js/medusa-runtime.js | 4 ++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/themes-default/slim/src/components/show-history.vue b/themes-default/slim/src/components/show-history.vue index 964f043165..6dcc44948c 100644 --- a/themes-default/slim/src/components/show-history.vue +++ b/themes-default/slim/src/components/show-history.vue @@ -31,8 +31,13 @@ - - {{['Downloaded', 'Subtitled'].includes(props.row.statusName) ? (props.row.releaseGroup !== -1 ? props.row.releaseGroup : '') : props.row.provider.name}} + + + {{props.row.releaseGroup !== -1 ? props.row.releaseGroup : ''}} + + + {{props.row.provider.name}} + diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index 9821d53fff..e51bdc446f 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -536,7 +536,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider/Group',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider/Group',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1489,7 +1489,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider/Group\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.statusName !== \"Downloaded\"\n ? _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n [\"Downloaded\", \"Subtitled\"].includes(\n props.row.statusName\n )\n ? props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n : props.row.provider.name\n ) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider/Group\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.statusName !== \"Downloaded\"\n ? _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/\" +\n (props.row.statusName === \"Snatched\"\n ? \"providers\"\n : \"subtitles\") +\n \"/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.statusName === \"Downloaded\"\n ? _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.provider.name) +\n \"\\n \"\n )\n ])\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), diff --git a/themes/light/assets/js/medusa-runtime.js b/themes/light/assets/js/medusa-runtime.js index 9821d53fff..e51bdc446f 100644 --- a/themes/light/assets/js/medusa-runtime.js +++ b/themes/light/assets/js/medusa-runtime.js @@ -536,7 +536,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider/Group',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_good_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-good-table */ \"./node_modules/vue-good-table/dist/vue-good-table.esm.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'show-history',\n components: {\n VueGoodTable: vue_good_table__WEBPACK_IMPORTED_MODULE_1__[\"VueGoodTable\"],\n QualityPill: _helpers_quality_pill_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n show: {\n type: Object,\n required: true\n },\n season: {\n type: Number,\n required: true\n },\n episode: {\n type: Number,\n required: false\n },\n searchType: {\n type: String,\n default: 'episode'\n }\n },\n\n data() {\n return {\n columns: [{\n label: 'Date',\n field: 'actionDate',\n dateInputFormat: 'yyyyMMddHHmmss',\n //e.g. 07-09-2017 19:16:25\n dateOutputFormat: 'yyyy-MM-dd HH:mm:ss',\n type: 'date'\n }, {\n label: 'Status',\n field: 'statusName'\n }, {\n label: 'Quality',\n field: 'quality',\n type: 'number'\n }, {\n label: 'Provider/Group',\n field: 'provider.id'\n }, {\n label: 'Release',\n field: 'resource'\n }, {\n label: 'Size',\n field: 'size',\n formatFn: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n type: 'number'\n }],\n loading: false,\n loadingMessage: '',\n history: [],\n hideHistory: true\n };\n },\n\n mounted() {\n const {\n getHistory\n } = this;\n getHistory();\n },\n\n computed: { ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n config: state => state.config,\n layout: state => state.config.layout,\n showHistory: state => state.history.showHistory,\n episodeHistory: state => state.history.episodeHistory\n }),\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])({\n getEpisodeHistory: 'getEpisodeHistory',\n getSeasonHistory: 'getSeasonHistory',\n fuzzyParseDateTime: 'fuzzyParseDateTime'\n })\n },\n methods: {\n humanFileSize: _utils_core__WEBPACK_IMPORTED_MODULE_2__[\"humanFileSize\"],\n ...Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapActions\"])({\n getShowEpisodeHistory: 'getShowEpisodeHistory'\n }),\n\n close() {\n this.$emit('close'); // Destroy the vue listeners, etc\n\n this.$destroy(); // Remove the element from the DOM\n\n this.$el.remove();\n },\n\n getHistory() {\n const {\n getShowEpisodeHistory,\n show,\n episode,\n season,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n // Use apiv2 to get latest episode history\n getShowEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n } // Update the local history array with store data.\n\n\n updateHistory();\n },\n\n updateHistory() {\n const {\n getEpisodeHistory,\n getSeasonHistory,\n show,\n episode,\n season,\n searchType\n } = this;\n\n if (searchType === 'episode') {\n this.history = getEpisodeHistory({\n showSlug: show.id.slug,\n episodeSlug: Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"episodeToSlug\"])(season, episode)\n });\n }\n\n this.history = getSeasonHistory({\n showSlug: show.id.slug\n });\n },\n\n rowStyleClassFn(row) {\n return row.statusName.toLowerCase() || 'skipped';\n }\n\n },\n watch: {\n episodeHistory: {\n handler() {\n const {\n show,\n updateHistory\n } = this;\n\n if (show.id.slug) {\n updateHistory();\n }\n },\n\n deep: true,\n immediate: false\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -1489,7 +1489,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider/Group\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.statusName !== \"Downloaded\"\n ? _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/providers/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\n \"\\n \" +\n _vm._s(\n [\"Downloaded\", \"Subtitled\"].includes(\n props.row.statusName\n )\n ? props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n : props.row.provider.name\n ) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"show-history-wrapper\" }, [\n _c(\n \"div\",\n {\n staticClass: \"row\",\n class: { fanartBackground: _vm.layout.fanartBackground }\n },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12 top-15 horizontal-scroll\" },\n [\n _c(\"div\", { staticClass: \"button-row\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa top-5 bottom-5 pull-right\",\n attrs: { id: \"showhistory\", type: \"button\" },\n on: {\n click: function($event) {\n _vm.hideHistory = !_vm.hideHistory\n }\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.hideHistory ? \"Show History\" : \"Hide History\"\n ) +\n \"\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"vue-good-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value:\n !_vm.hideHistory &&\n _vm.show.id.slug &&\n _vm.history.length > 0,\n expression:\n \"!hideHistory && show.id.slug && history.length > 0\"\n }\n ],\n attrs: {\n columns: _vm.columns,\n rows: _vm.history,\n \"search-options\": {\n enabled: false\n },\n \"sort-options\": {\n enabled: true,\n initialSortBy: { field: \"actionDate\", type: \"desc\" }\n },\n styleClass: \"vgt-table condensed\",\n \"row-style-class\": _vm.rowStyleClassFn\n },\n scopedSlots: _vm._u([\n {\n key: \"table-row\",\n fn: function(props) {\n return [\n props.column.label === \"Date\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.actionDate\n ? _vm.fuzzyParseDateTime(\n props.formattedRow[props.column.field]\n )\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : props.column.label === \"Quality\"\n ? _c(\n \"span\",\n { staticClass: \"align-center\" },\n [\n props.row.quality !== 0\n ? _c(\"quality-pill\", {\n attrs: { quality: props.row.quality }\n })\n : _vm._e()\n ],\n 1\n )\n : props.column.label === \"Provider/Group\"\n ? _c(\"span\", { staticClass: \"align-center\" }, [\n props.row.statusName !== \"Downloaded\"\n ? _c(\"img\", {\n staticStyle: { \"margin-right\": \"5px\" },\n attrs: {\n src:\n \"images/\" +\n (props.row.statusName === \"Snatched\"\n ? \"providers\"\n : \"subtitles\") +\n \"/\" +\n props.row.provider.id +\n \".png\",\n alt: props.row.provider.name,\n width: \"16\",\n height: \"16\"\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n props.row.statusName === \"Downloaded\"\n ? _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(\n props.row.releaseGroup !== -1\n ? props.row.releaseGroup\n : \"\"\n ) +\n \"\\n \"\n )\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.row.provider.name) +\n \"\\n \"\n )\n ])\n ])\n : _c(\"span\", [\n _vm._v(\n \"\\n \" +\n _vm._s(props.formattedRow[props.column.field]) +\n \"\\n \"\n )\n ])\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/show-history.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), From 89b98972df388e2b934bac7c0252eb80b15ef9be Mon Sep 17 00:00:00 2001 From: P0psicles Date: Mon, 22 Jun 2020 19:18:11 +0200 Subject: [PATCH 49/87] Fix displaying xem icon in showHeader. --- medusa/tv/series.py | 1 - themes-default/slim/src/store/modules/provider.js | 4 ++-- themes/dark/assets/js/medusa-runtime.js | 2 +- themes/light/assets/js/medusa-runtime.js | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/medusa/tv/series.py b/medusa/tv/series.py index bd76acbbb2..83a907d709 100644 --- a/medusa/tv/series.py +++ b/medusa/tv/series.py @@ -2156,7 +2156,6 @@ def to_json(self, detailed=False, episodes=False): data['config']['release']['whitelist'] = bw_list.whitelist # Make sure these are at least defined - data['xemNumbering'] = [] data['sceneAbsoluteNumbering'] = [] data['xemAbsoluteNumbering'] = [] data['sceneNumbering'] = [] diff --git a/themes-default/slim/src/store/modules/provider.js b/themes-default/slim/src/store/modules/provider.js index 399d361344..4b1eb0750f 100644 --- a/themes-default/slim/src/store/modules/provider.js +++ b/themes-default/slim/src/store/modules/provider.js @@ -160,8 +160,8 @@ const actions = { /** * Get provider cache results for enabled providers. * - * @param {*} context The store context. - * @param {String} The provider id. + * @param {*} {commit} Destructured commit object. + * @param {Object} searchResult - Search result. * @returns {void}. */ addManualSearchResult({ commit }, searchResult) { diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index e51bdc446f..bee690199f 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -4842,7 +4842,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n if (!state.providers[searchResult.provider.id]) {\n state.providers[searchResult.provider.id] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false;\n const results = []; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n results.push(...response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n\n return results;\n };\n\n const result = {\n providersSearched: 0,\n totalSearchResults: []\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n result.providersSearched += 1;\n const providerResults = await getProviderResults(provider);\n result.totalSearchResults.push(...providerResults);\n }\n\n return result;\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n if (!state.providers[searchResult.provider.id]) {\n state.providers[searchResult.provider.id] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false;\n const results = []; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n results.push(...response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n\n return results;\n };\n\n const result = {\n providersSearched: 0,\n totalSearchResults: []\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n result.providersSearched += 1;\n const providerResults = await getProviderResults(provider);\n result.totalSearchResults.push(...providerResults);\n }\n\n return result;\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} {commit} Destructured commit object.\n * @param {Object} searchResult - Search result.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.js?"); /***/ }), diff --git a/themes/light/assets/js/medusa-runtime.js b/themes/light/assets/js/medusa-runtime.js index e51bdc446f..bee690199f 100644 --- a/themes/light/assets/js/medusa-runtime.js +++ b/themes/light/assets/js/medusa-runtime.js @@ -4842,7 +4842,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mut /***/ (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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n if (!state.providers[searchResult.provider.id]) {\n state.providers[searchResult.provider.id] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false;\n const results = []; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n results.push(...response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n\n return results;\n };\n\n const result = {\n providersSearched: 0,\n totalSearchResults: []\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n result.providersSearched += 1;\n const providerResults = await getProviderResults(provider);\n result.totalSearchResults.push(...providerResults);\n }\n\n return result;\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.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 _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst state = {\n providers: {}\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"]](state, providers) {\n for (const provider of providers) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers, provider.id, { ...state.providers[provider.id],\n ...provider\n });\n }\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n // Check if this provider has already been added.\n if (!state.providers[providerId]) {\n state.providers[providerId] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', [...(state.providers[providerId].cache || []), ...cache]);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"]](state, {\n providerId,\n cache\n }) {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[providerId], 'cache', cache);\n },\n\n /**\n * Add search results which have been retreived through the webSocket.\n * @param {*} state - Vue state\n * @param {Array} searchResults - One or more search results.\n */\n [_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"]](state, searchResults) {\n for (const searchResult of searchResults) {\n if (!state.providers[searchResult.provider.id]) {\n state.providers[searchResult.provider.id] = {\n name: '',\n config: {},\n cache: []\n };\n }\n\n const {\n cache\n } = state.providers[searchResult.provider.id]; // Check if we don't allready have this result in our store.\n // In that case, we update the existing object.\n\n const existingSearchResult = (cache || []).find(result => result.identifier === searchResult.identifier);\n\n if (existingSearchResult) {\n // Because this is an existing result, whe're not overwriting dateAdded field.\n const {\n dateAdded,\n ...rest\n } = searchResult;\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id].cache, cache.indexOf(existingSearchResult), { ...existingSearchResult,\n ...rest\n });\n } else {\n vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(state.providers[searchResult.provider.id], 'cache', [...(cache || []), ...[searchResult]]);\n }\n }\n }\n\n};\nconst getters = {};\n/**\n * An object representing request parameters for getting a show from the API.\n *\n * @typedef {object} ShowGetParameters\n * @property {boolean} detailed Fetch detailed information? (e.g. scene/xem numbering)\n * @property {boolean} episodes Fetch seasons & episodes?\n */\n\nconst actions = {\n /**\n * Get providers.\n *\n * @param {*} context The store context.\n * @returns {Promise} The API response.\n */\n getProviders(context) {\n return new Promise((resolve, reject) => {\n const {\n commit\n } = context;\n _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get('/providers').then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDERS\"], response.data);\n resolve();\n }).catch(error => {\n console.error(`Could not get providers with error: ${error}`);\n reject();\n });\n });\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} context The store context.\n * @param {String} The provider id.\n * @returns {void}.\n */\n async getProviderCacheResults(context, {\n showSlug,\n season,\n episode\n }) {\n const {\n commit,\n state\n } = context;\n const limit = 1000;\n const params = {\n limit,\n showslug: showSlug,\n season\n };\n\n if (episode) {\n params.episode = episode;\n }\n\n const getProviderResults = async provider => {\n let response = null;\n let page = 0;\n let lastPage = false;\n const results = []; // Empty the providers cache\n\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"SET_PROVIDER_CACHE\"], {\n providerId: provider,\n cache: []\n });\n const {\n id: providerId\n } = state.providers[provider];\n page = 0;\n lastPage = false;\n\n while (!lastPage) {\n page += 1;\n params.page = page;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(`/providers/${providerId}/results`, {\n params\n });\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_PROVIDER_CACHE\"], {\n providerId,\n cache: response.data\n });\n results.push(...response.data);\n\n if (response.data.length < limit) {\n lastPage = true;\n }\n } catch (error) {\n console.debug(String(error));\n lastPage = true;\n }\n }\n\n return results;\n };\n\n const result = {\n providersSearched: 0,\n totalSearchResults: []\n };\n\n for (const provider in state.providers) {\n if (!state.providers[provider].config.enabled) {\n continue;\n }\n\n result.providersSearched += 1;\n const providerResults = await getProviderResults(provider);\n result.totalSearchResults.push(...providerResults);\n }\n\n return result;\n },\n\n /**\n * Get provider cache results for enabled providers.\n *\n * @param {*} {commit} Destructured commit object.\n * @param {Object} searchResult - Search result.\n * @returns {void}.\n */\n addManualSearchResult({\n commit\n }, searchResult) {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_2__[\"ADD_SEARCH_RESULTS\"], [searchResult]);\n }\n\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack:///./src/store/modules/provider.js?"); /***/ }), From f7f393c8196931ecf5f0beab70a9feff64403c36 Mon Sep 17 00:00:00 2001 From: P0psicles Date: Mon, 22 Jun 2020 19:49:42 +0200 Subject: [PATCH 50/87] Add column filters to show-history.vue and show-results.vue tables. --- .../slim/src/components/show-history.vue | 35 ++++++++++++---- .../slim/src/components/show-results.vue | 41 ++++++++++++++----- themes/dark/assets/js/medusa-runtime.js | 10 ++--- themes/light/assets/js/medusa-runtime.js | 10 ++--- 4 files changed, 67 insertions(+), 29 deletions(-) diff --git a/themes-default/slim/src/components/show-history.vue b/themes-default/slim/src/components/show-history.vue index 6dcc44948c..f74d3ed44d 100644 --- a/themes-default/slim/src/components/show-history.vue +++ b/themes-default/slim/src/components/show-history.vue @@ -1,7 +1,7 @@