diff --git a/CHANGELOG.md b/CHANGELOG.md index 386d11a0d1..d278c5af4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,22 @@ ## Unreleased #### New Features +- Implemented recommended shows v2. ([5782](https://github.com/pymedusa/Medusa/pull/5782)) + - Added recommended list from anilist.co + - Recommended lists are cached nightly + - Configure which lists to cache + - Improvements to the recommended list UI + - Added plot and genre information when available from the recommended list + - Add shows from recommended lists through one click to the show search, or by id (if a tvdbid, tmdbid or tvmazeid is available) #### Improvements +- adba lib: Reduced startup time for libraries with many anime shows. ([5782](https://github.com/pymedusa/Medusa/pull/5782)) + - anime-list.xml was read for each anime show on startup #### Fixes +- Fixed postprocessing of archives with multiple video files caused a pp of the complete download dir. ([9775](https://github.com/pymedusa/Medusa/pull/9775)) +- Fixed download handler wrongly untrack downloads when connection errors occurred. ([9774](https://github.com/pymedusa/Medusa/pull/9774)) +- Removed anonomized redirect service (derefer.org is down) in favor of "noreferrer noopener" headers ([5782](https://github.com/pymedusa/Medusa/pull/5782)) ---- diff --git a/ext/adba/aniDBfileInfo.py b/ext/adba/aniDBfileInfo.py index 1a31275fac..db4125091e 100644 --- a/ext/adba/aniDBfileInfo.py +++ b/ext/adba/aniDBfileInfo.py @@ -21,9 +21,10 @@ import logging import os import pickle -import requests import sys +import requests import time +import ttl_cache import xml.etree.cElementTree as etree @@ -119,6 +120,7 @@ def read_tvdb_map_xml(file_path=None): return read_xml_into_etree(file_path) +@ttl_cache(180.0) def read_xml_into_etree(filePath): if not filePath: return None diff --git a/ext/readme.md b/ext/readme.md index 7c16bb58d1..ccfc300a74 100644 --- a/ext/readme.md +++ b/ext/readme.md @@ -1,7 +1,7 @@ ## ext Folder | Package | Version / Commit | Used By | Notes / Modules :----: | :-----: | :--------------: | :------ | :-------------- -ext | **`adba`** | pymedusa/[ad9a011](https://github.com/pymedusa/adba/tree/ad9a011b26e24b276baed5435981fee21a93c254) | **`medusa`** | - +ext | **`adba`** | pymedusa/[37b0c74](https://github.com/pymedusa/adba/tree/37b0c74e76b40b3dbde29e71da75a1808eb121de) | **`medusa`** | - ext | `appdirs` | [1.4.3](https://pypi.org/project/appdirs/1.4.3/) | `simpleanidb`, `subliminal` (cli only) | File: `appdirs.py` ext | `attrs` | [18.2.0](https://pypi.org/project/attrs/18.2.0/) | `imdbpie` | Module: `attr` ext | **`babelfish`** | [f403000](https://github.com/Diaoul/babelfish/tree/f403000dd63092cfaaae80be9f309fd85c7f20c9) | **`medusa`**, `guessit`, `knowit`, `subliminal` | - @@ -60,7 +60,7 @@ ext | **`tornado`** | [6.1](https://pypi.org/project/tornado/6.1/) | **`medusa`* ext | **`tornroutes`** | [0.5.1](https://pypi.org/project/tornroutes/0.5.1/) | **`medusa`** | - ext | **`trakt`** | [3.1.0](https://pypi.org/project/trakt/3.1.0/) | **`medusa`** | - ext | `trans` | [2.1.0](https://pypi.org/project/trans/2.1.0/) | `imdbpie` | File: `trans.py` -ext | `ttl-cache` | [1.6](https://pypi.org/project/ttl-cache/1.6/) | **`medusa`** | File: `ttl_cache.py` +ext | `ttl-cache` | [1.6](https://pypi.org/project/ttl-cache/1.6/) | **`medusa`**, `adba` | File: `ttl_cache.py` ext | **`tvdbapiv2`** | pymedusa/[d6d0e9d](https://github.com/pymedusa/tvdbv2/tree/d6d0e9d98071c2d646beb997b336edbb0e98dfb7) | **`medusa`** | - ext | **`urllib3`** | [1.24.1](https://pypi.org/project/urllib3/1.24.1/) | `requests` | - ext | **`validators`** | [0.18.2](https://pypi.org/project/validators/0.18.2/) | **`medusa`** | - diff --git a/medusa/__main__.py b/medusa/__main__.py index 7d82dac6e0..3ff7760f8c 100755 --- a/medusa/__main__.py +++ b/medusa/__main__.py @@ -77,8 +77,9 @@ check_setting_list, check_setting_str, load_provider_setting, save_provider_setting ) -from medusa.databases import cache_db, failed_db, main_db +from medusa.databases import cache_db, failed_db, main_db, recommended_db from medusa.failed_history import trim_history +from medusa.generic_update_queue import GenericQueueScheduler, RecommendedShowUpdateScheduler from medusa.indexers.config import INDEXER_TVDBV2, INDEXER_TVMAZE from medusa.init.filesystem import is_valid_encoding from medusa.providers.generic_provider import GenericProvider @@ -1031,6 +1032,16 @@ def initialize(self, console_logging=True): app.FALLBACK_PLEX_NOTIFICATIONS = check_setting_int(app.CFG, 'General', 'fallback_plex_notifications', 1) app.FALLBACK_PLEX_TIMEOUT = check_setting_int(app.CFG, 'General', 'fallback_plex_timeout', 3) + app.CACHE_RECOMMENDED_SHOWS = check_setting_int(app.CFG, 'Recommended', 'cache_shows', 1) + app.CACHE_RECOMMENDED_TRAKT = check_setting_int(app.CFG, 'Recommended', 'cache_trakt', 1) + app.CACHE_RECOMMENDED_IMDB = check_setting_int(app.CFG, 'Recommended', 'cache_imdb', 1) + app.CACHE_RECOMMENDED_ANIDB = check_setting_int(app.CFG, 'Recommended', 'cache_anidb', 1) + app.CACHE_RECOMMENDED_ANILIST = check_setting_int(app.CFG, 'Recommended', 'cache_anilist', 1) + app.RECOMMENDED_SHOW_UPDATE_HOUR = max( + 0, min(23, check_setting_int(app.CFG, 'Recommended', 'recommended_show_update_hour', app.DEFAULT_RECOMMENDED_SHOW_UPDATE_HOUR)) + ) + app.CACHE_RECOMMENDED_TRAKT_LISTS = check_setting_list(app.CFG, 'Recommended', 'trakt_lists', app.CACHE_RECOMMENDED_TRAKT_LISTS) + # Initialize trakt config path. trakt.core.CONFIG_PATH = os.path.join(app.CACHE_DIR, '.pytrakt.json') trakt.core.load_config() @@ -1179,10 +1190,18 @@ def initialize(self, console_logging=True): cache_db_con = db.DBConnection('cache.db') db.upgradeDatabase(cache_db_con, cache_db.InitialSchema) + # initialize the recommended shows database + recommended_db_con = db.DBConnection('recommended.db') + db.upgradeDatabase(recommended_db_con, recommended_db.InitialSchema) + # Performs a vacuum on cache.db logger.debug(u'Performing a vacuum on the CACHE database') cache_db_con.action('VACUUM') + # Performs a vacuum on recommended.db + logger.debug(u'Performing a vacuum on the RECOMMENDED database') + recommended_db_con.action('VACUUM') + # initialize the failed downloads database failed_db_con = db.DBConnection('failed.db') db.upgradeDatabase(failed_db_con, failed_db.InitialSchema) @@ -1224,6 +1243,18 @@ def initialize(self, console_logging=True): cycleTime=datetime.timedelta(seconds=3), threadName='SHOWQUEUE') + app.generic_queue_scheduler = scheduler.Scheduler( + GenericQueueScheduler(), + cycleTime=datetime.timedelta(seconds=3), + threadName='GENERICQUEUESCHEDULER' + ) + + app.recommended_show_update_scheduler = scheduler.Scheduler( + RecommendedShowUpdateScheduler(), + threadName='RECOMMENDEDSHOWUPDATESCHEDULER', + start_time=datetime.time(hour=app.RECOMMENDED_SHOW_UPDATE_HOUR, + minute=random.randint(0, 59))) + app.show_update_scheduler = scheduler.Scheduler(show_updater.ShowUpdater(), threadName='SHOWUPDATER', start_time=datetime.time(hour=app.SHOWUPDATE_HOUR, @@ -1377,6 +1408,14 @@ def start_threads(): app.backlog_search_scheduler.enable = True app.backlog_search_scheduler.start() + # start the generic queue checker + app.generic_queue_scheduler.enable = True + app.generic_queue_scheduler.start() + + # start the recommended show update scheduler + app.recommended_show_update_scheduler.enable = True + app.recommended_show_update_scheduler.start() + # start the show updater app.show_update_scheduler.enable = True app.show_update_scheduler.start() @@ -1472,6 +1511,7 @@ def halt(): app.show_update_scheduler, app.episode_update_scheduler, app.version_check_scheduler, + app.generic_update_scheduler, app.show_queue_scheduler, app.search_queue_scheduler, app.forced_search_queue_scheduler, @@ -1690,6 +1730,15 @@ def save_config(): new_config['General']['fallback_plex_notifications'] = app.FALLBACK_PLEX_NOTIFICATIONS new_config['General']['fallback_plex_timeout'] = app.FALLBACK_PLEX_TIMEOUT + new_config['Recommended'] = {} + new_config['Recommended']['cache_shows'] = app.CACHE_RECOMMENDED_SHOWS + new_config['Recommended']['cache_trakt'] = app.CACHE_RECOMMENDED_TRAKT + new_config['Recommended']['cache_imdb'] = app.CACHE_RECOMMENDED_IMDB + new_config['Recommended']['cache_anidb'] = app.CACHE_RECOMMENDED_ANIDB + new_config['Recommended']['cache_anilist'] = app.CACHE_RECOMMENDED_ANILIST + new_config['Recommended']['recommended_show_update_hour'] = int(app.RECOMMENDED_SHOW_UPDATE_HOUR) + new_config['Recommended']['trakt_lists'] = app.CACHE_RECOMMENDED_TRAKT_LISTS + new_config['Blackhole'] = {} new_config['Blackhole']['nzb_dir'] = app.NZB_DIR new_config['Blackhole']['torrent_dir'] = app.TORRENT_DIR @@ -2257,7 +2306,7 @@ def restore_db(src_dir, dst_dir): :return: """ try: - files_list = [app.APPLICATION_DB, app.CONFIG_INI, app.FAILED_DB, app.CACHE_DB] + files_list = [app.APPLICATION_DB, app.CONFIG_INI, app.FAILED_DB, app.CACHE_DB, app.RECOMMENDED_DB] for filename in files_list: src_file = os.path.join(src_dir, filename) diff --git a/medusa/app.py b/medusa/app.py index 669bd2076a..d8810707a7 100644 --- a/medusa/app.py +++ b/medusa/app.py @@ -43,6 +43,7 @@ def __init__(self): self.APPLICATION_DB = 'main.db' self.FAILED_DB = 'failed.db' self.CACHE_DB = 'cache.db' + self.RECOMMENDED_DB = 'recommended.db' self.LOG_FILENAME = 'application.log' self.CONFIG_INI = 'config.ini' self.GIT_ORG = 'pymedusa' @@ -101,6 +102,9 @@ def __init__(self): self.backlog_search_scheduler = None self.show_update_scheduler = None self.version_check_scheduler = None + self.generic_queue_scheduler = None + self.recommended_show_update_queue = None + self.recommended_show_update_scheduler = None self.show_queue_scheduler = None self.search_queue_scheduler = None self.forced_search_queue_scheduler = None @@ -281,12 +285,14 @@ def __init__(self): self._UPDATE_FREQUENCY = None self._BACKLOG_FREQUENCY = None self._SHOWUPDATE_HOUR = None + self._RECOMMENDED_SHOW_UPDATE_HOUR = None self.DEFAULT_DOWNLOAD_HANDLER_FREQUENCY = 60 self.DEFAULT_DAILYSEARCH_FREQUENCY = 40 self.DEFAULT_BACKLOG_FREQUENCY = 21 self.DEFAULT_UPDATE_FREQUENCY = 1 self.DEFAULT_SHOWUPDATE_HOUR = random.randint(2, 4) + self.DEFAULT_RECOMMENDED_SHOW_UPDATE_HOUR = random.randint(0, 2) self.MIN_AUTOPOSTPROCESSOR_FREQUENCY = 1 self.MIN_DOWNLOAD_HANDLER_FREQUENCY = 5 @@ -706,6 +712,17 @@ def __init__(self): self.FALLBACK_PLEX_API_URL = 'https://tvdb2.plex.tv' self.TVDB_API_KEY = 'd99c8e7dac2307355af4ab88720a6c32' + # Recommended Shows settings + self.CACHE_RECOMMENDED_SHOWS = True + self.CACHE_RECOMMENDED_TRAKT = True + self.CACHE_RECOMMENDED_IMDB = True + self.CACHE_RECOMMENDED_ANIDB = True + self.CACHE_RECOMMENDED_ANILIST = True + self.CACHE_RECOMMENDED_TRAKT_LISTS = [ + 'trending', 'popular', 'anticipated', 'collected', + 'watched', 'played', 'recommendations', 'newshow', 'newseason' + ] + def _init_scheduler(self, app_prop=None, scheduler=None, enabled=None): from medusa.logger.adapters.style import BraceAdapter log = BraceAdapter(logging.getLogger(__name__)) @@ -986,6 +1003,16 @@ def SHOWUPDATE_HOUR(self, value): """Change SHOWUPDATE_HOUR.""" self.handle_prop('SHOWUPDATE_HOUR', value) + @property + def RECOMMENDED_SHOW_UPDATE_HOUR(self): + """Return app.SHOWUPDATE_HOUR.""" + return self._RECOMMENDED_SHOW_UPDATE_HOUR + + @RECOMMENDED_SHOW_UPDATE_HOUR.setter + def RECOMMENDED_SHOW_UPDATE_HOUR(self, value): + """Change RECOMMENDED_SHOW_UPDATE_HOUR.""" + self.handle_prop('RECOMMENDED_SHOW_UPDATE_HOUR', value) + @property def SUBTITLES_FINDER_FREQUENCY(self): """Return app.SUBTITLES_FINDER_FREQUENCY.""" diff --git a/medusa/clients/torrent/utorrent.py b/medusa/clients/torrent/utorrent.py index c2559f0837..a8c9acba4a 100644 --- a/medusa/clients/torrent/utorrent.py +++ b/medusa/clients/torrent/utorrent.py @@ -90,6 +90,10 @@ def _get_auth(self): log.warning('Unable to authenticate with uTorrent client: {0!r}', error) return None + if self.response is None: + log.warning('Unable to connect to uTorrent client') + return None + if not self.response.status_code == 404: self.auth = re.findall('(.*?) 23: + app._RECOMMENDED_SHOW_UPDATE_HOUR = 0 + elif app._RECOMMENDED_SHOW_UPDATE_HOUR < 0: + app._RECOMMENDED_SHOW_UPDATE_HOUR = 0 + + if app.show_update_scheduler: + app.show_update_scheduler.start_time = datetime.time(hour=app._RECOMMENDED_SHOW_UPDATE_HOUR) + + def change_SUBTITLES_FINDER_FREQUENCY(subtitles_finder_frequency): """ Change frequency of subtitle thread. diff --git a/medusa/databases/recommended_db.py b/medusa/databases/recommended_db.py new file mode 100644 index 0000000000..1c17530424 --- /dev/null +++ b/medusa/databases/recommended_db.py @@ -0,0 +1,60 @@ +# coding=utf-8 +"""Recommended.db cache module.""" +from __future__ import unicode_literals + +import logging + +from medusa import db +from medusa.logger.adapters.style import BraceAdapter + + +log = BraceAdapter(logging.getLogger(__name__)) +log.logger.addHandler(logging.NullHandler()) + + +# Add new migrations at the bottom of the list +# and subclass the previous migration. +class InitialSchema(db.SchemaUpgrade): + """Recommended shows db class.""" + + def test(self): + """Test method.""" + return self.hasTable('db_version') + + def execute(self): + """Create initial tables.""" + queries = [ + ("""CREATE TABLE shows ( + `recommended_show_id` INTEGER PRIMARY KEY AUTOINCREMENT, + `source` INTEGER NOT NULL, + `series_id` INTEGER NOT NULL, + `mapped_indexer` INTEGER, + `mapped_series_id` INTEGER, + `title` TEXT NOT NULL, + `rating` NUMERIC, + `votes` INTEGER, + `is_anime` INTEGER DEFAULT 0, + `image_href` TEXT, + `image_src` TEXT, + `subcat` TEXT, + `added` DATETIME, + `genres` TEXT, + `plot` TEXT + )""",), + ('CREATE TABLE db_version (db_version INTEGER);',), + ('INSERT INTO db_version(db_version) VALUES (1);',), + ] + for query in queries: + if len(query) == 1: + self.connection.action(query[0]) + else: + self.connection.action(query[0], query[1:]) + + def inc_major_version(self): + """Increment major version of the db.""" + major_version, _ = self.connection.version + major_version += 1 + self.connection.action('UPDATE db_version SET db_version = ?;', [major_version]) + log.info('[CACHE-DB] Updated major version to: {}.{}', *self.connection.version) + + return self.connection.version diff --git a/medusa/generic_update_queue.py b/medusa/generic_update_queue.py new file mode 100644 index 0000000000..b549567cc0 --- /dev/null +++ b/medusa/generic_update_queue.py @@ -0,0 +1,235 @@ +# coding=utf-8 +# +# This file is part of Medusa. +# +# Medusa is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Medusa is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Medusa. If not, see . +"""Generic update queue module.""" +from __future__ import unicode_literals + +import logging +from datetime import date, datetime, timedelta + +from medusa import app, ws +from medusa.helper.exceptions import CantUpdateRecommendedShowsException +from medusa.logger.adapters.style import BraceAdapter +from medusa.queues import generic_queue +from medusa.show.recommendations.anidb import AnidbPopular +from medusa.show.recommendations.anilist import AniListPopular +from medusa.show.recommendations.imdb import ImdbPopular +from medusa.show.recommendations.trakt import TraktPopular + +from requests import RequestException + +from simpleanidb import REQUEST_HOT + +log = BraceAdapter(logging.getLogger(__name__)) +log.logger.addHandler(logging.NullHandler()) + + +class GenericQueueActions(object): + """Generic queue action id's.""" + + UPDATE_RECOMMENDED_LIST_TRAKT = 1 + UPDATE_RECOMMENDED_LIST_IMDB = 2 + UPDATE_RECOMMENDED_LIST_ANIDB = 3 + UPDATE_RECOMMENDED_LIST_ANILIST = 4 + UPDATE_RECOMMENDED_LIST_ALL = 10 + + names = { + UPDATE_RECOMMENDED_LIST_TRAKT: 'Update recommended Trakt', + UPDATE_RECOMMENDED_LIST_IMDB: 'Update recommended Imdb', + UPDATE_RECOMMENDED_LIST_ANIDB: 'Update recommended Anidb', + UPDATE_RECOMMENDED_LIST_ANILIST: 'Update recommended AniList', + UPDATE_RECOMMENDED_LIST_ALL: 'Update all recommended lists', + } + + +class GenericQueueScheduler(generic_queue.GenericQueue): + """General purpose queue scheduler.""" + + def __init__(self): + generic_queue.GenericQueue.__init__(self) + self.queue_name = 'GENERICQUEUESCHEDULER' + + def is_action_in_queue(self, action_id): + """Check if the queue_item has already been queued.""" + return len([queue_item for queue_item in self.queue if queue_item.action_id == action_id]) > 0 + + def is_action_active(self, action_id): + """Check if the queue_item is already running.""" + return self.current_item is not None and self.current_item.action_id == action_id + + def add_recommended_show_update(self, action): + """Queue a new recommended show update.""" + if self.is_action_active(action): + raise CantUpdateRecommendedShowsException( + f'{GenericQueueActions.names[action]} is already running' + ) + + if self.is_action_in_queue(action): + raise CantUpdateRecommendedShowsException( + f'{GenericQueueActions.names[action]} is already queued' + ) + + queue_item = RecommendedShowQueueItem(update_action=action) + self.add_item(queue_item) + return queue_item + + +class RecommendedShowUpdateScheduler(object): + """Recommended show update scheduler.""" + + def __init__(self): + """Initialize the class.""" + self.amActive = False + + def run(self, force=False): + """Schedule recommendedShowQueueItems if needed.""" + self.amActive = True + try: + if not app.CACHE_RECOMMENDED_SHOWS: + return + + if app.CACHE_RECOMMENDED_TRAKT: + app.generic_queue_scheduler.action.add_recommended_show_update( + GenericQueueActions.UPDATE_RECOMMENDED_LIST_TRAKT + ) + + if app.CACHE_RECOMMENDED_IMDB: + app.generic_queue_scheduler.action.add_recommended_show_update( + GenericQueueActions.UPDATE_RECOMMENDED_LIST_IMDB + ) + + if app.CACHE_RECOMMENDED_ANIDB: + app.generic_queue_scheduler.action.add_recommended_show_update( + GenericQueueActions.UPDATE_RECOMMENDED_LIST_ANIDB + ) + + if app.CACHE_RECOMMENDED_ANILIST: + app.generic_queue_scheduler.action.add_recommended_show_update( + GenericQueueActions.UPDATE_RECOMMENDED_LIST_ANILIST + ) + + except Exception as error: + log.exception('Recommended show queue item Exception, error: {error}', {'error': error}) + + self.amActive = True + + +class RecommendedShowQueueItem(generic_queue.QueueItem): + """Recommended show update queue item class.""" + + def __init__(self, update_action): + """Initialize the class.""" + update_action_name = GenericQueueActions.names.get(update_action) + generic_queue.QueueItem.__init__(self, name=update_action_name.split('.')[-1], action_id=update_action) + self.recommended_list = update_action + self.started = False + self.success = False + + def run(self): + """Run recommended show update thread.""" + generic_queue.QueueItem.run(self) + self.started = True + + # Push an update to any open Web UIs through the WebSocket + ws.Message('QueueItemUpdate', self.to_json).push() + + try: + # Update recommended shows from trakt, imdb and anidb + # recommended shows are dogpilled into cache/recommended.dbm + + log.info(u'Started caching recommended shows') + + if self.recommended_list in ( + GenericQueueActions.UPDATE_RECOMMENDED_LIST_TRAKT, GenericQueueActions.UPDATE_RECOMMENDED_LIST_ALL + ): + # Only cache the trakt lists that have been enabled. + for trakt_list in app.CACHE_RECOMMENDED_TRAKT_LISTS: + try: + TraktPopular().fetch_popular_shows(trakt_list) + except Exception as error: + log.info(u'Could not get trakt recommended shows for {trakt_list} because of error: {error}', + {'trakt_list': trakt_list, 'error': error}) + log.debug(u'Not bothering getting the other trakt lists') + + if self.recommended_list in ( + GenericQueueActions.UPDATE_RECOMMENDED_LIST_IMDB, GenericQueueActions.UPDATE_RECOMMENDED_LIST_ALL + ): + # Cache imdb shows + try: + ImdbPopular().fetch_popular_shows() + except (RequestException, Exception) as error: + log.info(u'Could not get imdb recommended shows because of error: {error}', {'error': error}) + + if self.recommended_list in ( + GenericQueueActions.UPDATE_RECOMMENDED_LIST_ANIDB, GenericQueueActions.UPDATE_RECOMMENDED_LIST_ALL + ): + # Cache anidb shows + try: + AnidbPopular().fetch_popular_shows(REQUEST_HOT) + except Exception as error: + log.info(u'Could not get anidb recommended shows because of error: {error}', {'error': error}) + + if self.recommended_list in ( + GenericQueueActions.UPDATE_RECOMMENDED_LIST_ANILIST, GenericQueueActions.UPDATE_RECOMMENDED_LIST_ALL + ): + season_dates = ( + date.today() - timedelta(days=90), # Previous season + date.today(), # Current season + date.today() + timedelta(days=90) # Next season + ) + # Cache anilist shows + try: + for season_date in season_dates: + AniListPopular().fetch_popular_shows(season_date.year, get_season(season_date)) + except Exception as error: + log.info(u'Could not get anidb recommended shows because of error: {error}', {'error': error}) + + log.info(u'Finished caching recommended shows') + self.success = True + + except Exception as error: + self.success = False + log.exception('DailySearchQueueItem Exception, error: {error}', {'error': error}) + + self.success = bool(self.success) + # Push an update to any open Web UIs through the WebSocket + ws.Message('QueueItemUpdate', self.to_json).push() + + self.finish() + + +Y = 2000 # dummy leap year to allow input X-02-29 (leap day) +seasons = [ + ('winter', (date(Y, 1, 1), date(Y, 3, 20))), + ('spring', (date(Y, 3, 21), date(Y, 6, 20))), + ('summer', (date(Y, 6, 21), date(Y, 9, 22))), + ('fall', (date(Y, 9, 23), date(Y, 12, 20))), + ('winter', (date(Y, 12, 21), date(Y, 12, 31))) +] + + +def get_season(now): + """ + Calculate a season from a datetime. + + :param now: A datetime or date object. + :return: Season as a string. + """ + if isinstance(now, datetime): + now = now.date() + now = now.replace(year=Y) + return next(season for season, (start, end) in seasons + if start <= now <= end) diff --git a/medusa/helper/exceptions.py b/medusa/helper/exceptions.py index f2d1f65c61..213e223ef7 100644 --- a/medusa/helper/exceptions.py +++ b/medusa/helper/exceptions.py @@ -136,5 +136,9 @@ class AnidbAdbaConnectionException(Exception): """ +class CantUpdateRecommendedShowsException(Exception): + """The recommended show update could not be started.""" + + class DownloadClientConnectionException(Exception): """Connection exception raised while trying to communicate with the client api.""" diff --git a/medusa/helpers/externals.py b/medusa/helpers/externals.py index 9aa32f3308..d23c33dc2a 100644 --- a/medusa/helpers/externals.py +++ b/medusa/helpers/externals.py @@ -9,7 +9,7 @@ from medusa.indexers.api import indexerApi from medusa.indexers.config import indexerConfig from medusa.indexers.exceptions import IndexerException, IndexerShowAlreadyInLibrary, IndexerUnavailable -from medusa.indexers.utils import mappings +from medusa.indexers.utils import mappings, reverse_mappings from medusa.logger.adapters.style import BraceAdapter from requests.exceptions import RequestException @@ -121,6 +121,7 @@ def check_existing_shows(indexed_show, indexer): mappings = {indexer: indexerConfig[indexer]['mapped_to'] for indexer in indexerConfig} other_indexers = [mapped_indexer for mapped_indexer in mappings if mapped_indexer != indexer] + # This will query other indexer api's. new_show_externals = get_externals(indexer=indexer, indexed_show=indexed_show) # Iterate through all shows in library, and see if one of our externals matches it's indexer_id @@ -161,6 +162,26 @@ def check_existing_shows(indexed_show, indexer): indexerApi(indexer).name)) +def save_externals_to_db(indexer, series_id, externals): + """Save the indexers external id's to the db.""" + sql_l = [] + + for external in externals: + if external in reverse_mappings and externals[external] and reverse_mappings[external] != indexer: + sql_l.append(['INSERT OR IGNORE ' + 'INTO indexer_mapping (indexer_id, indexer, mindexer_id, mindexer) ' + 'VALUES (?,?,?,?)', + [series_id, + indexer, + externals[external], + int(reverse_mappings[external]) + ]]) + + if sql_l: + main_db_con = db.DBConnection() + main_db_con.mass_action(sql_l) + + def load_externals_from_db(indexer=None, indexer_id=None): """Load and recreate the indexers external id's. @@ -189,3 +210,22 @@ def load_externals_from_db(indexer=None, indexer_id=None): log.error(u'Indexer not supported in current mappings: {id!r}', {'id': error}) return externals + + +def show_in_library(indexer=None, indexer_id=None): + """ + Use the load_externals_from_db method and compare it with the app.showList (library) for existing shows. + + :param indexer: Optional pass indexer id, else use the current shows indexer. + :type indexer: int + :param indexer_id: Optional pass indexer id, else use the current shows indexer. + :type indexer_id: int + + :return: The show object from library if found. + """ + externals = load_externals_from_db(indexer, indexer_id) + if externals: + for show in app.showList: + for indexer, series_id in viewitems(externals): + if reverse_mappings[indexer] == show.indexer and series_id == show.series_id: + return show diff --git a/medusa/indexers/config.py b/medusa/indexers/config.py index 09001d9a99..2be2d6b05c 100644 --- a/medusa/indexers/config.py +++ b/medusa/indexers/config.py @@ -34,9 +34,15 @@ EXTERNAL_IMDB = 10 EXTERNAL_ANIDB = 11 EXTERNAL_TRAKT = 12 - -EXTERNAL_MAPPINGS = {EXTERNAL_IMDB: 'imdb_id', EXTERNAL_ANIDB: 'anidb_id', - INDEXER_TVRAGE: 'tvrage_id', EXTERNAL_TRAKT: 'trakt_id'} +EXTERNAL_ANILIST = 13 + +EXTERNAL_MAPPINGS = { + EXTERNAL_IMDB: 'imdb_id', + EXTERNAL_ANIDB: 'anidb_id', + INDEXER_TVRAGE: 'tvrage_id', + EXTERNAL_TRAKT: 'trakt_id', + EXTERNAL_ANILIST: 'anilist_id' +} # trakt indexer name vs Medusa indexer TRAKT_INDEXERS = {'tvdb': INDEXER_TVDBV2, 'tmdb': INDEXER_TMDB, 'imdb': EXTERNAL_IMDB, 'trakt': EXTERNAL_TRAKT} diff --git a/medusa/indexers/tmdb/api.py b/medusa/indexers/tmdb/api.py index 827f15fc57..68677fb172 100644 --- a/medusa/indexers/tmdb/api.py +++ b/medusa/indexers/tmdb/api.py @@ -655,7 +655,7 @@ def get_id_by_external(self, **kwargs): :returns: A dict with externals, including the tvmaze id. """ try: - wanted_externals = ['tvdb_id', 'imdb_id', 'tvrage_id'] + wanted_externals = ['tvdb_id', 'imdb_id', 'tvrage_id', 'imdb_id'] for external_id in wanted_externals: if kwargs.get(external_id): result = self.tmdb.Find(kwargs.get(external_id)).info(**{'external_source': external_id}) diff --git a/medusa/server/api/v2/config.py b/medusa/server/api/v2/config.py index c59b8ac40b..b90a7fcece 100644 --- a/medusa/server/api/v2/config.py +++ b/medusa/server/api/v2/config.py @@ -45,6 +45,7 @@ iter_nested_items, set_nested_value, ) +from medusa.show.recommendations.trakt import TraktPopular from six import iteritems, itervalues, text_type from six.moves import map @@ -108,6 +109,7 @@ class ConfigHandler(BaseRequestHandler): 'indexerDefaultLanguage': StringField(app, 'INDEXER_DEFAULT_LANGUAGE'), 'showUpdateHour': IntegerField(app, 'SHOWUPDATE_HOUR'), + 'recommendedShowUpdateHour': IntegerField(app, 'RECOMMENDED_SHOW_UPDATE_HOUR'), 'indexerTimeout': IntegerField(app, 'INDEXER_TIMEOUT'), 'indexerDefault': IntegerField(app, 'INDEXER_DEFAULT'), 'plexFallBack.enable': BooleanField(app, 'FALLBACK_PLEX_ENABLE'), @@ -184,6 +186,13 @@ class ConfigHandler(BaseRequestHandler): 'providers.prowlarr.url': StringField(app, 'PROWLARR_URL'), 'providers.prowlarr.apikey': StringField(app, 'PROWLARR_APIKEY'), + 'recommended.cache.shows': BooleanField(app, 'CACHE_RECOMMENDED_SHOWS'), + 'recommended.cache.trakt': BooleanField(app, 'CACHE_RECOMMENDED_TRAKT'), + 'recommended.cache.imdb': BooleanField(app, 'CACHE_RECOMMENDED_IMDB'), + 'recommended.cache.anidb': BooleanField(app, 'CACHE_RECOMMENDED_ANIDB'), + 'recommended.cache.anilist': BooleanField(app, 'CACHE_RECOMMENDED_ANILIST'), + 'recommended.trakt.selectedLists': ListField(app, 'CACHE_RECOMMENDED_TRAKT_LISTS'), + # Sections 'clients.torrents.authType': StringField(app, 'TORRENT_AUTH_TYPE'), 'clients.torrents.dir': StringField(app, 'TORRENT_DIR'), @@ -652,6 +661,9 @@ def data_main(): section_data['indexerDefaultLanguage'] = app.INDEXER_DEFAULT_LANGUAGE section_data['showUpdateHour'] = int_default(app.SHOWUPDATE_HOUR, app.DEFAULT_SHOWUPDATE_HOUR) + section_data['recommendedShowUpdateHour'] = int_default( + app.RECOMMENDED_SHOW_UPDATE_HOUR, app.DEFAULT_RECOMMENDED_SHOW_UPDATE_HOUR + ) section_data['indexerTimeout'] = int_default(app.INDEXER_TIMEOUT, 20) section_data['indexerDefault'] = app.INDEXER_DEFAULT @@ -660,6 +672,15 @@ def data_main(): section_data['plexFallBack']['notifications'] = bool(app.FALLBACK_PLEX_NOTIFICATIONS) section_data['plexFallBack']['timeout'] = int(app.FALLBACK_PLEX_TIMEOUT) + section_data['recommended'] = {'cache': {}, 'trakt': {}} + section_data['recommended']['cache']['shows'] = bool(app.CACHE_RECOMMENDED_SHOWS) + section_data['recommended']['cache']['trakt'] = bool(app.CACHE_RECOMMENDED_TRAKT) + section_data['recommended']['cache']['imdb'] = bool(app.CACHE_RECOMMENDED_IMDB) + section_data['recommended']['cache']['anidb'] = bool(app.CACHE_RECOMMENDED_ANIDB) + section_data['recommended']['cache']['anilist'] = bool(app.CACHE_RECOMMENDED_ANILIST) + section_data['recommended']['trakt']['selectedLists'] = app.CACHE_RECOMMENDED_TRAKT_LISTS + section_data['recommended']['trakt']['availableLists'] = TraktPopular.CATEGORIES + section_data['versionNotify'] = bool(app.VERSION_NOTIFY) section_data['autoUpdate'] = bool(app.AUTO_UPDATE) section_data['updateFrequency'] = int_default(app.UPDATE_FREQUENCY, app.DEFAULT_UPDATE_FREQUENCY) diff --git a/medusa/server/api/v2/recommended.py b/medusa/server/api/v2/recommended.py new file mode 100644 index 0000000000..6652a62311 --- /dev/null +++ b/medusa/server/api/v2/recommended.py @@ -0,0 +1,92 @@ +# coding=utf-8 +"""Request handler for series and episodes.""" +from __future__ import unicode_literals + +import logging + +from medusa import app +from medusa.generic_update_queue import GenericQueueActions +from medusa.helper.exceptions import CantUpdateRecommendedShowsException +from medusa.indexers.config import EXTERNAL_ANIDB, EXTERNAL_ANILIST, EXTERNAL_IMDB, EXTERNAL_TRAKT +from medusa.logger.adapters.style import BraceAdapter +from medusa.server.api.v2.base import ( + BaseRequestHandler +) +from medusa.show.recommendations.recommended import get_categories, get_recommended_shows +from medusa.show.recommendations.trakt import TraktPopular + +log = BraceAdapter(logging.getLogger(__name__)) +log.logger.addHandler(logging.NullHandler()) + + +class RecommendedHandler(BaseRequestHandler): + """Series request handler.""" + + #: resource name + name = 'recommended' + + identifier = ('identifier', r'\w+') + #: path param + path_param = ('path_param', r'\w+') + allowed_methods = ('GET',) + + IDENTIFIER_TO_LIST = { + 'imdb': EXTERNAL_IMDB, + 'anidb': EXTERNAL_ANIDB, + 'trakt': EXTERNAL_TRAKT, + 'anilist': EXTERNAL_ANILIST + } + + def get(self, identifier, path_param=None): + """Query available recommended show lists.""" + if identifier and not RecommendedHandler.IDENTIFIER_TO_LIST.get(identifier): + return self._bad_request("Invalid recommended list identifier '{0}'".format(identifier)) + + data = {'shows': [], 'trakt': {'removedFromMedusa': []}} + + shows = get_recommended_shows(source=RecommendedHandler.IDENTIFIER_TO_LIST.get(identifier)) + + if shows: + data['shows'] = [show.to_json() for show in shows] + + try: + data['trakt']['removedFromMedusa'] = TraktPopular().get_removed_from_medusa() + except Exception: + data['trakt']['removedFromMedusa'] = [] + log.warning('Could not get the `removed from medusa` list') + + data['trakt']['blacklistEnabled'] = app.TRAKT_BLACKLIST_NAME != '' + data['categories'] = get_categories() + + return self._ok(data) + + def post(self, identifier, path_param=None): + """Force the start of a recommended show queue item.""" + if identifier and not RecommendedHandler.IDENTIFIER_TO_LIST.get(identifier): + return self._bad_request("Invalid recommended list identifier '{0}'".format(identifier)) + + try: + if identifier == 'trakt': + app.generic_queue_scheduler.action.add_recommended_show_update( + GenericQueueActions.UPDATE_RECOMMENDED_LIST_TRAKT + ) + + if identifier == 'imdb': + app.generic_queue_scheduler.action.add_recommended_show_update( + GenericQueueActions.UPDATE_RECOMMENDED_LIST_IMDB + ) + + if identifier == 'anidb': + app.generic_queue_scheduler.action.add_recommended_show_update( + GenericQueueActions.UPDATE_RECOMMENDED_LIST_ANIDB + ) + + if identifier == 'anilist': + app.generic_queue_scheduler.action.add_recommended_show_update( + GenericQueueActions.UPDATE_RECOMMENDED_LIST_ANILIST + ) + + except CantUpdateRecommendedShowsException as error: + return self._conflict(str(error)) + + return self._accepted(f'Started fetching new recommended shows from source {identifier}') diff --git a/medusa/server/core.py b/medusa/server/core.py index d8007368ea..07590027cc 100644 --- a/medusa/server/core.py +++ b/medusa/server/core.py @@ -29,6 +29,7 @@ from medusa.server.api.v2.log import LogHandler from medusa.server.api.v2.postprocess import PostProcessHandler from medusa.server.api.v2.providers import ProvidersHandler +from medusa.server.api.v2.recommended import RecommendedHandler from medusa.server.api.v2.schedule import ScheduleHandler from medusa.server.api.v2.search import SearchHandler from medusa.server.api.v2.series import SeriesHandler @@ -141,6 +142,9 @@ def get_apiv2_handlers(base): # /api/v2/authenticate AuthHandler.create_app_handler(base), + # /api/v2/recommeded + RecommendedHandler.create_app_handler(base), + # Always keep this last! NotFoundHandler.create_app_handler(base) ] diff --git a/medusa/server/web/config/backup_restore.py b/medusa/server/web/config/backup_restore.py index 9d1a171218..4d7c20a89a 100644 --- a/medusa/server/web/config/backup_restore.py +++ b/medusa/server/web/config/backup_restore.py @@ -33,7 +33,8 @@ def backup(backupDir=None): if backupDir: source = [os.path.join(app.DATA_DIR, app.APPLICATION_DB), app.CONFIG_FILE, os.path.join(app.DATA_DIR, app.FAILED_DB), - os.path.join(app.DATA_DIR, app.CACHE_DB)] + os.path.join(app.DATA_DIR, app.CACHE_DB), + os.path.join(app.DATA_DIR, app.RECOMMENDED_DB)] target = os.path.join(backupDir, 'medusa-{date}.zip'.format(date=time.strftime('%Y%m%d%H%M%S'))) for (path, dirs, files) in os.walk(app.CACHE_DIR, topdown=True): diff --git a/medusa/server/web/home/add_recommended.py b/medusa/server/web/home/add_recommended.py index e249c07b9f..87a9c601b5 100644 --- a/medusa/server/web/home/add_recommended.py +++ b/medusa/server/web/home/add_recommended.py @@ -38,4 +38,4 @@ def index(self): [Converted to VueRouter] """ t = PageTemplate(rh=self, filename='index.mako') - return t.render(controller='addShows', action='index') + return t.render(controller='addShows', action='recommendedShows') diff --git a/medusa/server/web/home/add_shows.py b/medusa/server/web/home/add_shows.py index 6dbf1244ce..77f61fac29 100644 --- a/medusa/server/web/home/add_shows.py +++ b/medusa/server/web/home/add_shows.py @@ -15,15 +15,12 @@ from medusa.logger.adapters.style import BraceAdapter from medusa.server.web.core import PageTemplate from medusa.server.web.home.handler import Home -from medusa.show.recommendations.anidb import AnidbPopular from medusa.show.recommendations.imdb import ImdbPopular from medusa.show.recommendations.trakt import TraktPopular from medusa.tv.series import Series, SeriesIdentifier from requests import RequestException -from simpleanidb import REQUEST_HOT - from six import text_type from tornroutes import route @@ -159,23 +156,23 @@ def popularShows(self): enable_anime_options=True, blacklist=[], whitelist=[], controller='addShows', action='recommendedShows', realpage='popularShows') - def popularAnime(self, list_type=REQUEST_HOT): + def popularAnime(self): """ - Fetches list recommeded shows from anidb.info. + Render template for route /home/addShows/recommended. + + [Converted to VueRouter] """ - t = PageTemplate(rh=self, filename='addShows_recommended.mako') - recommended_shows = None - error = None + t = PageTemplate(rh=self, filename='index.mako') + return t.render(controller='addShows', action='recommendedShows') - try: - recommended_shows = AnidbPopular().fetch_popular_shows(list_type) - except Exception as e: - error = e + def recommended(self): + """ + Render template for route /home/addShows/recommended. - return t.render(title='Popular Anime Shows', header='Popular Anime Shows', - recommended_shows=recommended_shows, exception=error, groups=[], - enable_anime_options=True, blacklist=[], whitelist=[], - controller='addShows', action='recommendedShows', realpage='popularAnime') + [Converted to VueRouter] + """ + t = PageTemplate(rh=self, filename='index.mako') + return t.render(controller='addShows', action='recommendedShows') def addShowToBlacklist(self, seriesid): # URL parameters diff --git a/medusa/show/recommendations/anidb.py b/medusa/show/recommendations/anidb.py index 61cd1aaa83..0c8d2a00e6 100644 --- a/medusa/show/recommendations/anidb.py +++ b/medusa/show/recommendations/anidb.py @@ -4,15 +4,14 @@ import logging import traceback -from builtins import object from os.path import join from medusa import app from medusa.cache import recommended_series_cache -from medusa.indexers.config import INDEXER_TVDBV2 +from medusa.indexers.config import EXTERNAL_ANIDB from medusa.logger.adapters.style import BraceAdapter -from medusa.session.core import MedusaSession from medusa.show.recommendations.recommended import ( + BasePopular, MissingTvdbMapping, RecommendedShow, cached_aid_to_tvdb, @@ -27,20 +26,24 @@ log.logger.addHandler(logging.NullHandler()) -class AnidbPopular(object): # pylint: disable=too-few-public-methods +class AnidbPopular(BasePopular): # pylint: disable=too-few-public-methods + + TITLE = 'Anidb Popular' + CACHE_SUBFOLDER = __name__.split('.')[-1] if '.' in __name__ else __name__ + def __init__(self): """Class retrieves a specified recommended show list from Trakt. List of returned shows is mapped to a RecommendedShow object """ - self.cache_subfolder = __name__.split('.')[-1] if '.' in __name__ else __name__ - self.session = MedusaSession() - self.recommender = 'Anidb Popular' + super(AnidbPopular, self).__init__() + self.cache_subfolder = AnidbPopular.CACHE_SUBFOLDER + self.recommender = AnidbPopular.TITLE + self.source = EXTERNAL_ANIDB self.base_url = 'https://anidb.net/perl-bin/animedb.pl?show=anime&aid={aid}' - self.default_img_src = 'poster.png' @recommended_series_cache.cache_on_arguments(namespace='anidb', function_key_generator=create_key_from_series) - def _create_recommended_show(self, storage_key, series): + def _create_recommended_show(self, series): """Create the RecommendedShow object from the returned showobj.""" try: tvdb_id = cached_aid_to_tvdb(series.aid) @@ -48,32 +51,25 @@ def _create_recommended_show(self, storage_key, series): log.warning("Couldn't map AniDB id {0} to a TVDB id", series.aids) return None - # If the anime can't be mapped to a tvdb_id, return none, and move on to the next. - if not tvdb_id: - return tvdb_id - rec_show = RecommendedShow( self, series.aid, - series.title, - INDEXER_TVDBV2, - tvdb_id, + str(series.title), **{'rating': series.rating_permanent, 'votes': series.count_permanent, 'image_href': self.base_url.format(aid=series.aid), - 'ids': {'tvdb': tvdb_id, - 'aid': series.aid - } - } + 'ids': { + 'tvdb_id': tvdb_id, + 'anidb_id': series.aid + }, + 'is_anime': True, + 'subcat': 'hot'} ) # Check cache or get and save image use_default = self.default_img_src if not series.picture.url else None rec_show.cache_image(series.picture.url, default=use_default) - # By default pre-configure the show option anime = True - rec_show.is_anime = True - return rec_show def fetch_popular_shows(self, list_type=REQUEST_HOT): @@ -88,9 +84,9 @@ def fetch_popular_shows(self, list_type=REQUEST_HOT): for show in series: try: - recommended_show = self._create_recommended_show(storage_key=show.aid, - series=show) + recommended_show = self._create_recommended_show(series=show) if recommended_show: + recommended_show.save_to_db() result.append(recommended_show) except MissingTvdbMapping: log.info('Could not parse AniDB show {0}, missing tvdb mapping', show.title) diff --git a/medusa/show/recommendations/anilist.py b/medusa/show/recommendations/anilist.py new file mode 100644 index 0000000000..113db83aed --- /dev/null +++ b/medusa/show/recommendations/anilist.py @@ -0,0 +1,102 @@ +# coding=utf-8 +"""Anilist recommended show class.""" +from __future__ import unicode_literals + +import logging +import traceback + +from medusa.cache import recommended_series_cache +from medusa.indexers.config import EXTERNAL_ANILIST +from medusa.logger.adapters.style import BraceAdapter +from medusa.session.core import MedusaSession +from medusa.show.recommendations.recommended import ( + BasePopular, + RecommendedShow, + create_key_from_series +) + + +log = BraceAdapter(logging.getLogger(__name__)) +log.logger.addHandler(logging.NullHandler()) + + +class AniListPopular(BasePopular): # pylint: disable=too-few-public-methods + """Anilist popular class.""" + + BASE_URL = 'https://graphql.anilist.co' + TITLE = 'AniList' + CACHE_SUBFOLDER = __name__.split('.')[-1] if '.' in __name__ else __name__ + + def __init__(self): + """Class retrieves a specified recommended show list from Anilist. + + List of returned shows is mapped to a RecommendedShow object + """ + super(AniListPopular, self).__init__() + self.cache_subfolder = AniListPopular.CACHE_SUBFOLDER + self.recommender = AniListPopular.TITLE + self.source = EXTERNAL_ANILIST + self.base_url = AniListPopular.BASE_URL + self.session = MedusaSession() + + @recommended_series_cache.cache_on_arguments(namespace='anilist', function_key_generator=create_key_from_series) + def _create_recommended_show(self, show): + """Create the RecommendedShow object from the returned showobj.""" + rec_show = RecommendedShow( + self, + show['id'], + show['title']['userPreferred'], + **{ + 'rating': show['averageScore'] / 10 if show['averageScore'] else 0, + 'votes': show['popularity'], + 'image_href': f"https://anilist.co/anime/{show['id']}", + 'ids': { + 'anilist_id': show['id'] + }, + 'is_anime': True, + 'subcat': f"{show['startDate']['year']}_{show['season'].lower()}", + 'genres': [genre.lower() for genre in show['genres']], + 'plot': show['description'] + } + ) + + # Check cache or get and save image + use_default = self.default_img_src if not show['coverImage']['large'] else None + rec_show.cache_image(show['coverImage']['large'], default=use_default) + + return rec_show + + def fetch_popular_shows(self, year, season): + """Get popular show information from IMDB.""" + result = [] + + query = 'query($page:Int = 1 $id:Int $type:MediaType $isAdult:Boolean = false $search:String $format:[MediaFormat]$status:MediaStatus $countryOfOrigin:CountryCode $source:MediaSource $season:MediaSeason $seasonYear:Int $year:String $onList:Boolean $yearLesser:FuzzyDateInt $yearGreater:FuzzyDateInt $episodeLesser:Int $episodeGreater:Int $durationLesser:Int $durationGreater:Int $chapterLesser:Int $chapterGreater:Int $volumeLesser:Int $volumeGreater:Int $licensedBy:[String]$genres:[String]$excludedGenres:[String]$tags:[String]$excludedTags:[String]$minimumTagRank:Int $sort:[MediaSort]=[POPULARITY_DESC,SCORE_DESC]){Page(page:$page,perPage:20){pageInfo{total perPage currentPage lastPage hasNextPage}media(id:$id type:$type season:$season format_in:$format status:$status countryOfOrigin:$countryOfOrigin source:$source search:$search onList:$onList seasonYear:$seasonYear startDate_like:$year startDate_lesser:$yearLesser startDate_greater:$yearGreater episodes_lesser:$episodeLesser episodes_greater:$episodeGreater duration_lesser:$durationLesser duration_greater:$durationGreater chapters_lesser:$chapterLesser chapters_greater:$chapterGreater volumes_lesser:$volumeLesser volumes_greater:$volumeGreater licensedBy_in:$licensedBy genre_in:$genres genre_not_in:$excludedGenres tag_in:$tags tag_not_in:$excludedTags minimumTagRank:$minimumTagRank sort:$sort isAdult:$isAdult){id title{userPreferred}coverImage{extraLarge large color}startDate{year month day}endDate{year month day}bannerImage season description type format status(version:2)episodes duration chapters volumes genres isAdult averageScore popularity nextAiringEpisode{airingAt timeUntilAiring episode}mediaListEntry{id status}studios(isMain:true){edges{isMain node{id name}}}}}}' + variables = { + 'page': 1, + 'type': 'ANIME', + 'seasonYear': year, + 'season': season.upper(), + 'sort': 'SCORE_DESC', + 'format': ['TV'] + } + + try: + response = self.session.post(self.base_url, json={'query': query, 'variables': variables}) + results = response.json()['data'] + except Exception as error: + log.warning('Unable to get Anilist shows: {0!r}', error) + return [] + + if not results.get('Page') or not results['Page'].get('media'): + return [] + + for show in results['Page']['media']: + try: + recommended_show = self._create_recommended_show(show) + if recommended_show: + recommended_show.save_to_db() + result.append(recommended_show) + except Exception: + log.warning('Could not parse AniDB show, with exception: {0}', traceback.format_exc()) + + return result diff --git a/medusa/show/recommendations/imdb.py b/medusa/show/recommendations/imdb.py index af6c3b704d..708ab3c14e 100644 --- a/medusa/show/recommendations/imdb.py +++ b/medusa/show/recommendations/imdb.py @@ -1,20 +1,19 @@ # coding=utf-8 - +"""Anidb recommended show class.""" from __future__ import unicode_literals import logging import os import posixpath import re -from builtins import object -from medusa import helpers from medusa.cache import recommended_series_cache from medusa.imdb import Imdb -from medusa.indexers.config import INDEXER_TVDBV2 +from medusa.indexers.api import indexerApi +from medusa.indexers.config import EXTERNAL_IMDB, INDEXER_TMDB from medusa.logger.adapters.style import BraceAdapter -from medusa.session.core import MedusaSession from medusa.show.recommendations.recommended import ( + BasePopular, RecommendedShow, cached_get_imdb_series_details, create_key_from_series, @@ -26,34 +25,42 @@ log.logger.addHandler(logging.NullHandler()) -class ImdbPopular(object): +class ImdbPopular(BasePopular): """Gets a list of most popular TV series from imdb.""" + TITLE = 'IMDB Popular' + CACHE_SUBFOLDER = __name__.split('.')[-1] if '.' in __name__ else __name__ + def __init__(self): """Initialize class.""" - self.cache_subfolder = __name__.split('.')[-1] if '.' in __name__ else __name__ - self.session = MedusaSession() + super(ImdbPopular, self).__init__() + self.cache_subfolder = ImdbPopular.CACHE_SUBFOLDER self.imdb_api = Imdb(session=self.session) - self.recommender = 'IMDB Popular' - self.default_img_src = 'poster.png' + self.recommender = ImdbPopular.TITLE + self.source = EXTERNAL_IMDB @recommended_series_cache.cache_on_arguments(namespace='imdb', function_key_generator=create_key_from_series) - def _create_recommended_show(self, storage_key, series): + def _create_recommended_show(self, series): """Create the RecommendedShow object from the returned showobj.""" - tvdb_id = helpers.get_tvdb_from_id(series.get('imdb_tt'), 'IMDB') + externals = {'imdb_id': series.get('imdb_tt')} - if not tvdb_id: - return None + # Get tmdb id using a call to tmdb api. + t = indexerApi(INDEXER_TMDB).indexer(**indexerApi(INDEXER_TMDB).api_params.copy()) + externals.update(t.get_id_by_external(**externals)) rec_show = RecommendedShow( self, series.get('imdb_tt'), series.get('name'), - INDEXER_TVDBV2, - int(tvdb_id), - **{'rating': series.get('rating'), - 'votes': series.get('votes'), - 'image_href': series.get('imdb_url')} + **{ + 'rating': series.get('rating'), + 'votes': series.get('votes'), + 'image_href': series.get('imdb_url'), + 'ids': externals, + 'subcat': 'popular', + 'genres': [genre.lower() for genre in series.get('genres')], + 'plot': series.get('outline') + } ) if series.get('image_url'): @@ -63,16 +70,20 @@ def _create_recommended_show(self, storage_key, series): def fetch_popular_shows(self): """Get popular show information from IMDB.""" - popular_shows = [] - imdb_result = self.imdb_api.get_popular_shows() - + result = [] for imdb_show in imdb_result['ranks']: series = {} + show_details = None imdb_id = series['imdb_tt'] = imdb_show['id'].strip('/').split('/')[-1] if imdb_id: - show_details = cached_get_imdb_series_details(imdb_id) + try: + show_details = cached_get_imdb_series_details(imdb_id) + except RequestException as error: + log.warning('Could not get show details for {imdb_id} with error: {error!r}', + {'imdb_id': imdb_id, 'error': error}) + if show_details: try: series['year'] = imdb_show.get('year') @@ -85,6 +96,7 @@ def fetch_popular_shows(self): series['votes'] = show_details['ratings'].get('ratingCount', 0) series['outline'] = show_details['plot'].get('outline', {}).get('text') series['rating'] = show_details['ratings'].get('rating', 0) + series['genres'] = show_details['genres'].get('genres') except Exception as error: log.warning('Could not parse show {imdb_id} with error: {error!r}', {'imdb_id': imdb_id, 'error': error}) @@ -92,21 +104,17 @@ def fetch_popular_shows(self): continue if all([series['year'], series['name'], series['imdb_tt']]): - popular_shows.append(series) - - result = [] - for series in popular_shows: - try: - recommended_show = self._create_recommended_show(storage_key=series['imdb_tt'], - series=series) - if recommended_show: - result.append(recommended_show) - except RequestException: - log.warning( - u'Could not connect to indexers to check if you already have' - u' this show in your library: {show} ({year})', - {'show': series['name'], 'year': series['name']} - ) + try: + recommended_show = self._create_recommended_show(series) + if recommended_show: + recommended_show.save_to_db() + result.append(recommended_show) + except RequestException: + log.warning( + u'Could not connect to indexers to check if you already have' + u' this show in your library: {show} ({year})', + {'show': series['name'], 'year': series['name']} + ) return result diff --git a/medusa/show/recommendations/recommended.py b/medusa/show/recommendations/recommended.py index b23320391e..f3e2e51660 100644 --- a/medusa/show/recommendations/recommended.py +++ b/medusa/show/recommendations/recommended.py @@ -20,23 +20,22 @@ import logging import os import posixpath -from builtins import object +from collections import defaultdict +from datetime import datetime from os.path import join -from medusa import ( - app, - helpers, -) +from medusa import app, db, helpers from medusa.cache import recommended_series_cache from medusa.helpers import ensure_list +from medusa.helpers.externals import load_externals_from_db, save_externals_to_db, show_in_library from medusa.imdb import Imdb -from medusa.indexers.utils import indexer_id_to_name, indexer_name_mapping +from medusa.indexers.config import EXTERNAL_ANIDB, EXTERNAL_ANILIST, EXTERNAL_IMDB, EXTERNAL_TRAKT from medusa.logger.adapters.style import BraceAdapter from medusa.session.core import MedusaSession from simpleanidb import Anidb -from six import PY2, ensure_text, text_type +from six import PY2, ensure_text log = BraceAdapter(logging.getLogger(__name__)) log.logger.addHandler(logging.NullHandler()) @@ -83,38 +82,49 @@ class MissingTvdbMapping(Exception): """Exception used when a show can't be mapped to a tvdb indexer id.""" -class RecommendedShow(object): +class BasePopular(object): + """BasePopular class.""" + + def __init__(self, recommender=None, source=None, cache_subfoler=None): + """Recommended show base class (AnidbPopular, TraktPopular, etc).""" + self.session = MedusaSession() + self.recommender = recommender + self.source = source + self.cache_subfolder = 'recommended' + self.default_img_src = 'poster.png' + self.mapped_indexer = None + self.mapped_series_id = None + self.mapped_indexer_name = None + + +class RecommendedShow(BasePopular): """Base class for show recommendations.""" - def __init__(self, rec_show_prov, series_id, title, mapped_indexer, mapped_series_id, **show_attr): + def __init__(self, rec_show_prov, series_id, title, **show_attr): """Create a show recommendation. :param rec_show_prov: Recommended shows provider. Used to keep track of the provider, which facilitated the recommended shows list. :param series_id: as provided by the list provider :param title: of the show as displayed in the recommended show page - :param indexer: used to map the show to - :param indexer_id: a mapped indexer_id for indexer :param rating: of the show in percent :param votes: number of votes :param image_href: the href when clicked on the show image (poster) :param image_src: the local url to the "cached" image (poster) :param default_img_src: a default image when no poster available + :param """ - self.recommender = rec_show_prov.recommender + super(RecommendedShow, self).__init__(rec_show_prov, rec_show_prov.source) self.cache_subfolder = rec_show_prov.cache_subfolder or 'recommended' self.default_img_src = getattr(rec_show_prov, 'default_img_src', '') self.series_id = series_id self.title = title - self.mapped_indexer = int(mapped_indexer) - self.mapped_indexer_name = indexer_id_to_name(mapped_indexer) - try: - self.mapped_series_id = int(mapped_series_id) - except ValueError: - raise MissingTvdbMapping('Could not parse the indexer_id [{0}]'.format(mapped_series_id)) - self.rating = show_attr.get('rating') or 0 + # The slug to the show in the library if already added. + self.library_slug = None + + self.rating = float(show_attr.get('rating') or 0) self.votes = show_attr.get('votes') if self.votes and not isinstance(self.votes, int): @@ -127,21 +137,15 @@ def __init__(self, rec_show_prov, series_id, title, mapped_indexer, mapped_serie self.image_href = show_attr.get('image_href') self.image_src = show_attr.get('image_src') self.ids = show_attr.get('ids', {}) - self.is_anime = False - - # Check if the show is currently already in the db - indexers = {mapped_indexer: mapped_series_id} - indexers.update({indexer_name_mapping[indexer_name]: indexers_series_id - for indexer_name, indexers_series_id - in self.ids.items() if indexer_name in indexer_name_mapping}) - - self.show_in_list = False - for show in app.showList: - if show.indexer in indexers and show.series_id == indexers[show.indexer]: - self.show_in_list = True - self.mapped_indexer = show.indexer - self.mapped_indexer_name = show.identifier.indexer.slug - self.series_id = show.series_id + self.is_anime = show_attr.get('is_anime', False) + self.subcat = show_attr.get('subcat') + self.genres = show_attr.get('genres', []) + self.plot = show_attr.get('plot', '') + + self.show_in_list = None + show_obj = show_in_library(self.source, self.series_id) + if show_obj: + self.show_in_list = show_obj.identifier.slug self.session = session @@ -195,6 +199,153 @@ def __str__(self): """Return a string repr of the recommended list.""" return 'Recommended show {0} from recommended list: {1}'.format(self.title, self.recommender) + def save_to_db(self): + """Insert or update the recommended show to db.""" + recommended_db_con = db.DBConnection('recommended.db') + # Add to db + + existing_show = recommended_db_con.select( + 'SELECT recommended_show_id from shows WHERE source = ? AND series_id = ?', + [self.source, self.series_id] + ) + if not existing_show: + recommended_db_con.action( + 'INSERT INTO shows ' + ' (source, series_id, mapped_indexer, ' + ' mapped_series_id, title, rating, ' + ' votes, is_anime, image_href, ' + ' image_src, subcat, added, genres, plot) ' + 'VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)', + [self.source, self.series_id, self.mapped_indexer, self.mapped_series_id, self.title, self.rating, self.votes, + int(self.is_anime), self.image_href, self.image_src, self.subcat, datetime.now(), ','.join(self.genres), self.plot] + ) + else: + query = """UPDATE shows SET title = ?, rating = ?, votes = ?, + is_anime = ?, image_href = ?, image_src = ?, subcat = ?, genres = ?, plot = ? + WHERE recommended_show_id = ?""" + params_set = [ + self.title, self.rating, self.votes, int(self.is_anime), + self.image_href, self.image_src, self.subcat, ','.join(self.genres), self.plot + ] + params_where = [existing_show[0]['recommended_show_id']] + + if self.mapped_indexer and self.mapped_series_id: + query = query.format(mapped_indexer_and_id=', mapped_indexer = ?, mapped_series_id = ?') + params_set += [self.mapped_indexer, self.mapped_series_id] + else: + query = query.format(mapped_indexer_and_id='') + + recommended_db_con.action(query, params_set + params_where) + # If there are any external id's, save them to main/indexer_mappings + if self.ids: + save_externals_to_db(self.source, self.series_id, self.ids) + + def to_json(self): + """Return JSON representation.""" + data = {} + data['source'] = self.source + data['cacheSubfolder'] = self.cache_subfolder + data['seriesId'] = self.series_id + data['title'] = self.title + data['mappedIndexer'] = self.mapped_indexer + data['mappedIndexerName'] = self.mapped_indexer_name + data['mappedSeriesId'] = self.mapped_series_id + data['rating'] = self.rating + data['votes'] = self.votes + data['imageHref'] = self.image_href + data['imageSrc'] = self.image_src + data['externals'] = self.ids + data['isAnime'] = self.is_anime + data['showInLibrary'] = self.show_in_list + data['trakt'] = { + 'blacklisted': False + }, + data['subcat'] = self.subcat + data['genres'] = self.genres + data['plot'] = self.plot + + return data + + +def get_recommended_shows(source=None, series_id=None): + """ + Retrieve recommended shows from the db cache/recommended table. + + All shows are transformed to Recommended objects. + :param source: The Indexer or External source ID + :returns: A list of Rcommended objects. + """ + recommended_db_con = db.DBConnection('recommended.db') + query = 'SELECT * FROM shows {where}' + where = [] + params = [] + + # Query filter options + if source: + where.append('source = ?') + params.append(source) + + if series_id: + where.append('series_id = ?') + params.append(series_id) + + shows = recommended_db_con.select( + query.format(where='' if not where else ' WHERE ' + ' AND '.join(where)), params + ) + + recommended_shows = [] + from medusa.show.recommendations.anidb import AnidbPopular + from medusa.show.recommendations.imdb import ImdbPopular + from medusa.show.recommendations.trakt import TraktPopular + from medusa.show.recommendations.anilist import AniListPopular + + mapped_source = { + EXTERNAL_TRAKT: TraktPopular, + EXTERNAL_ANIDB: AnidbPopular, + EXTERNAL_IMDB: ImdbPopular, + EXTERNAL_ANILIST: AniListPopular + } + + for show in shows: + # Get the external id's + externals = load_externals_from_db(show['source'], show['series_id']) + + recommended_shows.append( + RecommendedShow( + BasePopular( + recommender=mapped_source.get(show['source']).TITLE, + source=show['source'], + cache_subfoler=mapped_source.get(show['source']).CACHE_SUBFOLDER + ), + show['series_id'], + show['title'], + **{ + 'rating': show['rating'], + 'votes': show['votes'], + 'image_href': show['image_href'], + 'image_src': show['image_src'], + 'ids': externals, + 'subcat': show['subcat'], + 'mapped_indexer': show['mapped_indexer'], + 'mapped_series_id': show['mapped_series_id'], + 'genres': [genre for genre in show['genres'].split(',') if genre], + 'plot': show['plot'] + } + ) + ) + return recommended_shows + + +def get_categories(): + """Compile a structure with the sources and their available sub-categories.""" + recommended_db_con = db.DBConnection('recommended.db') + results = recommended_db_con.select('SELECT source, subcat FROM shows GROUP BY source, subcat') + categories = defaultdict(list) + for result in results: + categories[result['source']].append(result['subcat']) + + return categories + @LazyApi.load_anidb_api @recommended_series_cache.cache_on_arguments() @@ -226,15 +377,15 @@ def cached_get_imdb_series_details(imdb_id): Use dogpile cache to return a cached id if available. """ - return LazyApi.imdb_api.get_title(imdb_id) + title_detailed = LazyApi.imdb_api.get_title(imdb_id) + title_detailed['genres'] = LazyApi.imdb_api.get_title_genres(imdb_id) + return title_detailed def create_key_from_series(namespace, fn, **kw): """Create a key made of indexer name and show ID.""" def generate_key(*args, **kw): - show_key = namespace + '_' + text_type(args[1]) - if PY2: - return show_key.encode('utf-8') + show_key = f'{namespace}_{args[1]}' return show_key return generate_key diff --git a/medusa/show/recommendations/trakt.py b/medusa/show/recommendations/trakt.py index 2a68a25ba1..688d6fca55 100644 --- a/medusa/show/recommendations/trakt.py +++ b/medusa/show/recommendations/trakt.py @@ -5,7 +5,6 @@ import logging import os -from builtins import object from medusa import app from medusa.cache import recommended_series_cache @@ -13,14 +12,17 @@ from medusa.helper.exceptions import MultipleShowObjectsException from medusa.helpers.trakt import get_trakt_show_collection, get_trakt_user from medusa.indexers.api import indexerApi -from medusa.indexers.config import INDEXER_TVDBV2 +from medusa.indexers.config import EXTERNAL_TRAKT, INDEXER_TVDBV2, TRAKT_INDEXERS from medusa.logger.adapters.style import BraceAdapter from medusa.show.recommendations import ExpiringList from medusa.show.recommendations.recommended import ( + BasePopular, RecommendedShow, create_key_from_series, ) +from six import iteritems + from trakt import sync from tvdbapiv2.exceptions import ApiException @@ -33,34 +35,44 @@ missing_posters = ExpiringList(cache_timeout=3600 * 24 * 3) # Cache 3 days -class TraktPopular(object): +class TraktPopular(BasePopular): """This class retrieves a speficed recommended show list from Trakt. The list of returned shows is mapped to a RecommendedShow object """ + TITLE = 'Trakt Popular' + CACHE_SUBFOLDER = __name__.split('.')[-1] if '.' in __name__ else __name__ + CATEGORIES = [ + 'trending', 'popular', 'anticipated', 'collected', + 'watched', 'played', 'recommendations', 'newshow', 'newseason' + ] + def __init__(self): """Initialize the trakt recommended list object.""" - self.cache_subfolder = __name__.split('.')[-1] if '.' in __name__ else __name__ - self.recommender = 'Trakt Popular' + super(TraktPopular, self).__init__() + self.cache_subfolder = TraktPopular.CACHE_SUBFOLDER + self.source = EXTERNAL_TRAKT + self.recommender = TraktPopular.TITLE self.default_img_src = 'trakt-default.png' self.tvdb_api_v2 = indexerApi(INDEXER_TVDBV2).indexer() @recommended_series_cache.cache_on_arguments(namespace='trakt', function_key_generator=create_key_from_series) - def _create_recommended_show(self, storage_key, show): + def _create_recommended_show(self, show, subcat=None): """Create the RecommendedShow object from the returned showobj.""" rec_show = RecommendedShow( self, - show.tvdb, + show.trakt, show.title, - INDEXER_TVDBV2, # indexer - show.tvdb, **{'rating': show.ratings['rating'], 'votes': try_int(show.ratings['votes'], '0'), 'image_href': 'http://www.trakt.tv/shows/{0}'.format(show.ids['ids']['slug']), # Adds like: {'tmdb': 62126, 'tvdb': 304219, 'trakt': 79382, 'imdb': 'tt3322314', # 'tvrage': None, 'slug': 'marvel-s-luke-cage'} - 'ids': show.ids['ids'] + 'ids': {f'{k}_id': v for k, v in iteritems(show.ids['ids']) if TRAKT_INDEXERS.get(k)}, + 'subcat': subcat, + 'genres': [genre.lower() for genre in show.genres], + 'plot': show.overview } ) @@ -97,6 +109,17 @@ def _create_recommended_show(self, storage_key, show): return rec_show + def get_removed_from_medusa(self): + """ + Return an array of shows (tvdb id's) that are still located in the trakt `watched` and `show collection` collections. + + But that are not in medusa's library. + Library is compared based on the tvdb id's. + """ + library_shows = sync.get_watched('shows', extended='noseasons') + sync.get_collection('shows', extended='full') + medusa_shows = [show.externals.get('tvdb_id', show.series_id) for show in app.showList if show.series_id] + return [lshow.tvdb for lshow in library_shows if lshow.tvdb not in medusa_shows] + def fetch_popular_shows(self, trakt_list=None): """Get a list of popular shows from different Trakt lists based on a provided trakt_list. @@ -105,14 +128,12 @@ def fetch_popular_shows(self, trakt_list=None): :return: A list of RecommendedShow objects, an empty list of none returned :throw: ``Exception`` if an Exception is thrown not handled by the libtrats exceptions """ - trending_shows = [] - removed_from_medusa = [] + recommended_shows = [] try: not_liked_show = '' - library_shows = sync.get_watched('shows', extended='noseasons') + sync.get_collection('shows', extended='full') - medusa_shows = [show.indexerid for show in app.showList if show.indexerid] - removed_from_medusa = [lshow.tvdb for lshow in library_shows if lshow.tvdb not in medusa_shows] + + removed_from_medusa = self.get_removed_from_medusa() if app.TRAKT_BLACKLIST_NAME: trakt_user = get_trakt_user() @@ -140,22 +161,23 @@ def fetch_popular_shows(self, trakt_list=None): in (s.tvdb for s in not_liked_show if s.media_type == 'shows')): continue - trending_shows.append(self._create_recommended_show( - storage_key=show.trakt, - show=show - )) + recommended_show = self._create_recommended_show(show, subcat=trakt_list) + if recommended_show: + recommended_show.save_to_db() + recommended_shows.append(recommended_show) except MultipleShowObjectsException: continue - # Update the dogpile index. This will allow us to retrieve all stored dogpile shows from the dbm. + # # Update the dogpile index. This will allow us to retrieve all stored dogpile shows from the dbm. + # update_recommended_series_cache_index('trakt', [binary_type(s.series_id) for s in trending_shows]) blacklist = app.TRAKT_BLACKLIST_NAME not in '' except Exception as error: log.exception('Could not connect to Trakt service: {0}', error) raise - return blacklist, trending_shows, removed_from_medusa + return blacklist, recommended_shows, removed_from_medusa def check_cache_for_poster(self, tvdb_id): """Verify if we already have a poster downloaded for this show.""" diff --git a/medusa/tv/series.py b/medusa/tv/series.py index ee39b7a12b..6a8c46ba2d 100644 --- a/medusa/tv/series.py +++ b/medusa/tv/series.py @@ -68,6 +68,7 @@ from medusa.imdb import Imdb from medusa.indexers.api import indexerApi from medusa.indexers.config import ( + EXTERNAL_MAPPINGS, INDEXER_TVRAGE, STATUS_MAP, indexerConfig @@ -1976,6 +1977,32 @@ def add_scene_numbering(self): .format(title=self.name) ) + def update_mapped_id_cache(self): + """Search the show in the recommended show cache. And update the mapped_indexer and mapped_series_id fields.""" + if self.externals: + cache_db_con = db.DBConnection('cache.db') + query = 'SELECT recommended_id from recommended {where}' + + rev_external_mappings = {v: k for k, v in viewitems(EXTERNAL_MAPPINGS)} + # Adding just in case the recommended show provider is also an indexer. Like for example maybe IMDB + rev_external_mappings.update({self.indexer_name + '_id': self.indexer}) + + for indexer, series_id in viewitems(self.externals): + if not rev_external_mappings.get(indexer): + continue + where = ['source = ? AND series_id = ?'] + params = [reverse_mappings[indexer], series_id] + + recommended_show = cache_db_con.select( + query.format(where=' WHERE ' + ' AND '.join(where)), params + ) + + if recommended_show: + query = 'UPDATE recommended SET mapped_indexer = ?, mapped_series_id = ? WHERE recommended_id = ?' + params = [self.indexer, self.series_id, recommended_show[0]['recommended_id']] + cache_db_con.action(query, params) + return True + def refresh_dir(self): """Refresh show using its location. diff --git a/medusa/updater/version_checker.py b/medusa/updater/version_checker.py index 267d0201e0..d52ba25dcd 100644 --- a/medusa/updater/version_checker.py +++ b/medusa/updater/version_checker.py @@ -116,7 +116,8 @@ def _backup(backupDir=None): os.path.join(app.DATA_DIR, app.APPLICATION_DB), app.CONFIG_FILE, os.path.join(app.DATA_DIR, app.FAILED_DB), - os.path.join(app.DATA_DIR, app.CACHE_DB) + os.path.join(app.DATA_DIR, app.CACHE_DB), + os.path.join(app.DATA_DIR, app.RECOMMENDED_DB) ] target = os.path.join(backupDir, app.BACKUP_FILENAME.format(timestamp=time.strftime('%Y%m%d%H%M%S'))) diff --git a/requirements.txt b/requirements.txt index 8241e532f3..a5ddfc6736 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -adba @ https://codeload.github.com/pymedusa/adba/tar.gz/ad9a011b26e24b276baed5435981fee21a93c254 +adba @ https://codeload.github.com/pymedusa/adba/tar.gz/37b0c74e76b40b3dbde29e71da75a1808eb121de babelfish @ https://codeload.github.com/Diaoul/babelfish/tar.gz/f403000dd63092cfaaae80be9f309fd85c7f20c9 beautifulsoup4==4.9.3 bencode.py==4.0.0 diff --git a/setup.cfg b/setup.cfg index bf8c31d117..58a323210c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -170,6 +170,7 @@ flake8-ignore = medusa/show/history.py D100 D101 D102 D200 D202 D204 D205 D400 D401 medusa/show/recommendations/__init__.py D104 medusa/show/recommendations/anidb.py D100 D101 D400 + medusa/show/recommendations/anilist.py D100 D101 D400 E501 medusa/show/recommendations/imdb.py D100 medusa/show/recommendations/recommended.py D100 D204 D400 medusa/show/recommendations/trakt.py D100 diff --git a/tests/apiv2/test_config.py b/tests/apiv2/test_config.py index 868fce5a34..590fc6f253 100644 --- a/tests/apiv2/test_config.py +++ b/tests/apiv2/test_config.py @@ -15,6 +15,7 @@ from medusa.network_timezones import app_timezone from medusa.sbdatetime import date_presets, time_presets from medusa.schedulers.utils import all_schedulers +from medusa.show.recommendations.trakt import TraktPopular from tests.apiv2.conftest import TEST_API_KEY @@ -87,6 +88,10 @@ def config_main(monkeypatch, app_config): section_data['indexerDefaultLanguage'] = app.INDEXER_DEFAULT_LANGUAGE section_data['showUpdateHour'] = int_default(app.SHOWUPDATE_HOUR, app.DEFAULT_SHOWUPDATE_HOUR) + section_data['recommendedShowUpdateHour'] = int_default( + app.RECOMMENDED_SHOW_UPDATE_HOUR, app.DEFAULT_RECOMMENDED_SHOW_UPDATE_HOUR + ) + section_data['indexerTimeout'] = int_default(app.INDEXER_TIMEOUT, 20) section_data['indexerDefault'] = app.INDEXER_DEFAULT @@ -95,6 +100,15 @@ def config_main(monkeypatch, app_config): section_data['plexFallBack']['notifications'] = bool(app.FALLBACK_PLEX_NOTIFICATIONS) section_data['plexFallBack']['timeout'] = int(app.FALLBACK_PLEX_TIMEOUT) + section_data['recommended'] = {'cache': {}, 'trakt': {}} + section_data['recommended']['cache']['shows'] = bool(app.CACHE_RECOMMENDED_SHOWS) + section_data['recommended']['cache']['trakt'] = bool(app.CACHE_RECOMMENDED_TRAKT) + section_data['recommended']['cache']['imdb'] = bool(app.CACHE_RECOMMENDED_IMDB) + section_data['recommended']['cache']['anidb'] = bool(app.CACHE_RECOMMENDED_ANIDB) + section_data['recommended']['cache']['anilist'] = bool(app.CACHE_RECOMMENDED_ANILIST) + section_data['recommended']['trakt']['selectedLists'] = app.CACHE_RECOMMENDED_TRAKT_LISTS + section_data['recommended']['trakt']['availableLists'] = TraktPopular.CATEGORIES + section_data['versionNotify'] = bool(app.VERSION_NOTIFY) section_data['autoUpdate'] = bool(app.AUTO_UPDATE) section_data['updateFrequency'] = int_default(app.UPDATE_FREQUENCY, app.DEFAULT_UPDATE_FREQUENCY) diff --git a/themes-default/slim/package.json b/themes-default/slim/package.json index 7d17cde413..cdb7e5f632 100644 --- a/themes-default/slim/package.json +++ b/themes-default/slim/package.json @@ -32,6 +32,7 @@ }, "dependencies": { "@fortawesome/fontawesome-svg-core": "1.2.35", + "@fortawesome/free-regular-svg-icons": "5.15.3", "@fortawesome/free-solid-svg-icons": "5.15.3", "@fortawesome/vue-fontawesome": "2.0.2", "axios": "0.21.1", @@ -49,6 +50,7 @@ "stylelint-scss": "3.20.1", "tablesorter": "2.31.3", "v-tooltip": "2.1.3", + "vanilla-lazyload": "12.0.0", "vue": "2.6.12", "vue-async-computed": "3.9.0", "vue-cookies": "1.7.4", @@ -57,6 +59,7 @@ "vue-images-loaded": "1.1.2", "vue-js-modal": "2.0.0-rc.6", "vue-js-toggle-button": "1.3.3", + "vue-lazyload": "1.3.3", "vue-meta": "2.4.0", "vue-multiselect": "2.1.6", "vue-native-websocket": "2.0.14", diff --git a/themes-default/slim/src/components/config-general.vue b/themes-default/slim/src/components/config-general.vue index 5cb418b47c..1356aecb17 100644 --- a/themes-default/slim/src/components/config-general.vue +++ b/themes-default/slim/src/components/config-general.vue @@ -67,6 +67,30 @@ +
+
+

Recommended shows

+

Options for controlling the caching of recommended shows.

+
+
+
+ +

Enabling recommended shows, will cache recommended shows on a daily interval.

+
+ +
+
+
+

Indexer

@@ -620,6 +644,7 @@ import { ConfigToggleSlider, CustomLogs, LanguageSelect, + SelectTraktLists, SortedSelectList, StateSwitch } from './helpers'; @@ -644,6 +669,7 @@ export default { Multiselect, SortedSelectList, VPopover, + SelectTraktLists, StateSwitch, ToggleButton, RootDirs @@ -856,6 +882,7 @@ export default { randomShowSlug, recentShows, themeName, + recommended, ...filteredConfig } = general; const { local, ...filteredLayout } = layout; @@ -873,6 +900,12 @@ export default { size: general.logs.size, subliminalLog: general.logs.subliminalLog, privacyLevel: general.logs.privacyLevel + } }, + ...{ recommended: { + cache: general.recommended.cache, + trakt: { + selectedLists: general.recommended.trakt.selectedLists + } } } } }; diff --git a/themes-default/slim/src/components/config-notifications.vue b/themes-default/slim/src/components/config-notifications.vue index ef6c37316a..2d2a0b787b 100644 --- a/themes-default/slim/src/components/config-notifications.vue +++ b/themes-default/slim/src/components/config-notifications.vue @@ -1081,7 +1081,6 @@ export default { }); } }, - beforeMount() { // Wait for the next tick, so the component is rendered this.$nextTick(() => { diff --git a/themes-default/slim/src/components/helpers/app-link.vue b/themes-default/slim/src/components/helpers/app-link.vue index 28243b39f7..d9c16c5bc2 100644 --- a/themes-default/slim/src/components/helpers/app-link.vue +++ b/themes-default/slim/src/components/helpers/app-link.vue @@ -76,6 +76,10 @@ export default { } return this.computedHref.startsWith('#'); }, + /** + * Not used for now as derefer.org is down and there are no suitable replacements. + * @returns {string} - de-refer service'd url. + */ anonymisedHref() { const { anonRedirect } = this.general; const href = this.computedHref; @@ -98,7 +102,7 @@ export default { return route; }, linkProperties() { - const { to, isIRC, isAbsolute, isExternal, isHashPath, anonymisedHref, matchingVueRoute } = this; + const { to, isIRC, isAbsolute, isExternal, isHashPath, matchingVueRoute } = this; const base = this.computedBase; const href = this.computedHref; @@ -146,18 +150,12 @@ export default { } return location.href.replace(location.hash, '') + href; } - if (isIRC) { - return href; - } - if (isAbsolute) { - if (isExternal) { - return anonymisedHref; - } + if (isIRC || isAbsolute) { return href; } return new URL(href, base).href; })(), - rel: isAbsolute && isExternal ? 'noreferrer' : undefined + rel: isAbsolute && isExternal ? 'noreferrer noopener' : undefined }; } } diff --git a/themes-default/slim/src/components/helpers/asset.vue b/themes-default/slim/src/components/helpers/asset.vue index 39300554ed..81091081bb 100644 --- a/themes-default/slim/src/components/helpers/asset.vue +++ b/themes-default/slim/src/components/helpers/asset.vue @@ -2,11 +2,11 @@
- +
- + @@ -24,9 +24,7 @@ export default { LazyImage }, props: { - showSlug: { - type: String - }, + showSlug: String, type: { type: String, required: true @@ -39,13 +37,10 @@ export default { type: Boolean, default: false }, - cls: { - type: String - }, - imgWidth: { - type: Number - }, - lazy: Boolean + cls: String, + imgWidth: Number, + lazy: Boolean, + imgStyle: String }, data() { return { @@ -79,6 +74,18 @@ export default { } return newClass; + }, + newStyle() { + const { imgWidth, imgStyle } = this; + let tempStyle = ''; + if (imgStyle) { + tempStyle = imgStyle; + } + + if (imgWidth) { + tempStyle += `;width=${imgWidth}px`; + } + return tempStyle; } } }; diff --git a/themes-default/slim/src/components/helpers/index.js b/themes-default/slim/src/components/helpers/index.js index 7475d1ebde..22c799ae1d 100644 --- a/themes-default/slim/src/components/helpers/index.js +++ b/themes-default/slim/src/components/helpers/index.js @@ -24,7 +24,9 @@ export { default as QualityPill } from './quality-pill.vue'; export { default as ScrollButtons } from './scroll-buttons.vue'; export { default as Search } from './search.vue'; export { default as SelectList } from './select-list.vue'; +export { default as SelectTraktLists } from './select-trakt-lists.vue'; export { default as ShowSelector } from './show-selector.vue'; export { default as SortedSelectList } from './sorted-select-list.vue'; export { default as StateSwitch } from './state-switch.vue'; export { default as TestProvider } from './test-provider.vue'; +export { default as TraktAuthentication } from './trakt-authentication.vue'; diff --git a/themes-default/slim/src/components/helpers/lazy-image.vue b/themes-default/slim/src/components/helpers/lazy-image.vue index 64d69d1d08..1adde3d6eb 100644 --- a/themes-default/slim/src/components/helpers/lazy-image.vue +++ b/themes-default/slim/src/components/helpers/lazy-image.vue @@ -14,7 +14,11 @@ import lozad from 'lozad'; export default { name: 'lazy-image', props: { - height: { + lazyWidth: { + type: Number, + default: null + }, + lazyHeight: { type: Number, default: null }, @@ -33,10 +37,6 @@ export default { lazyCls: { type: String, default: '' - }, - width: { - type: Number, - default: null } }, data() { @@ -57,9 +57,10 @@ export default { }, style() { const style = {}; + const { lazyWidth } = this; - if (this.width) { - style.width = `${this.width}px`; + if (lazyWidth) { + style.width = `${lazyWidth}px`; } // If the image is still loading and an @@ -75,7 +76,6 @@ export default { // to the aspect ratio. style.paddingTop = `${this.aspectRatio}%`; } - return style; } }, diff --git a/themes-default/slim/src/components/helpers/select-trakt-lists.vue b/themes-default/slim/src/components/helpers/select-trakt-lists.vue new file mode 100644 index 0000000000..bec980b783 --- /dev/null +++ b/themes-default/slim/src/components/helpers/select-trakt-lists.vue @@ -0,0 +1,74 @@ + + + diff --git a/themes-default/slim/src/components/helpers/trakt-authentication.vue b/themes-default/slim/src/components/helpers/trakt-authentication.vue new file mode 100644 index 0000000000..73154e990c --- /dev/null +++ b/themes-default/slim/src/components/helpers/trakt-authentication.vue @@ -0,0 +1,226 @@ + + + diff --git a/themes-default/slim/src/components/index.js b/themes-default/slim/src/components/index.js index 6d9d1f0d05..e793f5da43 100644 --- a/themes-default/slim/src/components/index.js +++ b/themes-default/slim/src/components/index.js @@ -27,6 +27,8 @@ export { default as manageSearches } from './manage-searches.vue'; export { default as ManualPostProcess } from './manual-post-process.vue'; export { default as NewShow } from './new-show.vue'; export { default as NewShowsExisting } from './new-shows-existing.vue'; +export { default as Recommended } from './recommended.vue'; +export { default as RecommendedPoster } from './recommended-poster.vue'; export { default as Restart } from './restart.vue'; export { default as RootDirs } from './root-dirs.vue'; export { default as Schedule } from './schedule.vue'; diff --git a/themes-default/slim/src/components/manage-searches.vue b/themes-default/slim/src/components/manage-searches.vue index df56db5938..302f0fd009 100644 --- a/themes-default/slim/src/components/manage-searches.vue +++ b/themes-default/slim/src/components/manage-searches.vue @@ -78,6 +78,23 @@
+
+
+

Force refresh recommended list:

+ + Note! Syncing shows with a recommended list may take a while. + The action will be queued. For example staring a sync with Trakt and directly after Imdb. + You will won't see results for Imdb after the sync of Trakt has fully completed. + + +
+
+

Search Queue:

@@ -250,7 +267,24 @@ export default { }, forceDownloadHandler() { api.post('system/operation', { type: 'FORCEADH' }); + }, + async searchRecommendedShows(source) { + try { + await api.post(`recommended/${source}`); + this.$snotify.success( + 'Started search for new recommended shows', + `Searching ${source}` + ); + } catch (error) { + if (error.response.status === 409) { + this.$snotify.error( + error.response.data.error, + 'Error' + ); + } + } } + }, mounted() { // Initially load the exception types last updates on page load. @@ -270,4 +304,14 @@ export default { }; diff --git a/themes-default/slim/src/components/new-shows-existing.vue b/themes-default/slim/src/components/new-shows-existing.vue index 15840cfea9..0e61553184 100644 --- a/themes-default/slim/src/components/new-shows-existing.vue +++ b/themes-default/slim/src/components/new-shows-existing.vue @@ -129,9 +129,6 @@ export default { }, data() { return { - // @FIXME: Python conversions (fix when config is loaded before routes) - // indexers: ${json.dumps(indexers)}, - isLoading: false, requestTimeout: 3 * 60 * 1000, errorMessage: '', @@ -163,7 +160,6 @@ export default { }, computed: { ...mapState({ - config: state => state.config.general, // Used by `inc_addShowOptions.mako` indexers: state => state.config.indexers, indexerDefault: state => state.config.general.indexerDefault, queueitems: state => state.shows.queueitems diff --git a/themes-default/slim/src/components/recommended-poster.vue b/themes-default/slim/src/components/recommended-poster.vue new file mode 100644 index 0000000000..dd52f10403 --- /dev/null +++ b/themes-default/slim/src/components/recommended-poster.vue @@ -0,0 +1,321 @@ + + + + + diff --git a/themes-default/slim/src/components/recommended.vue b/themes-default/slim/src/components/recommended.vue new file mode 100644 index 0000000000..fc9721e61c --- /dev/null +++ b/themes-default/slim/src/components/recommended.vue @@ -0,0 +1,411 @@ + + + + + diff --git a/themes-default/slim/src/global-vue-shim.js b/themes-default/slim/src/global-vue-shim.js index 24fc4c46ab..1778ef5c20 100644 --- a/themes-default/slim/src/global-vue-shim.js +++ b/themes-default/slim/src/global-vue-shim.js @@ -8,8 +8,9 @@ import VModal from 'vue-js-modal'; import { VTooltip } from 'v-tooltip'; import { library } from '@fortawesome/fontawesome-svg-core'; import { faAlignJustify, faImages } from '@fortawesome/free-solid-svg-icons'; +import { faTimesCircle } from '@fortawesome/free-regular-svg-icons'; -library.add([faAlignJustify, faImages]); +library.add([faAlignJustify, faImages, faTimesCircle]); import { App, diff --git a/themes-default/slim/src/index.js b/themes-default/slim/src/index.js index 7149e37e4c..3bf8056089 100644 --- a/themes-default/slim/src/index.js +++ b/themes-default/slim/src/index.js @@ -12,6 +12,7 @@ import Vuex from 'vuex'; import { ToggleButton } from 'vue-js-toggle-button'; import axios from 'axios'; import debounce from 'lodash/debounce'; +import isotope from 'vueisotope'; import store from './store'; import router from './router'; import { apiRoute, apiv1, api, webRoot, apiKey } from './api'; @@ -49,6 +50,7 @@ if (window) { // Push x-template components to this array to register them globally window.components = []; + window.components.push(isotope); } const UTIL = { diff --git a/themes-default/slim/src/router/routes.js b/themes-default/slim/src/router/routes.js index aa333e0621..4b49bf1087 100644 --- a/themes-default/slim/src/router/routes.js +++ b/themes-default/slim/src/router/routes.js @@ -255,6 +255,7 @@ const addShowRoutes = [ topMenu: 'home', converted: true }, + props: route => ({ ...route.params }), component: () => import('../components/new-show.vue') }, { @@ -304,7 +305,7 @@ const addRecommendedRoute = { topMenu: 'home', converted: true }, - component: () => import('../components/add-recommended.vue') + component: () => import('../components/recommended.vue') }; /** @type {import('.').Route} */ diff --git a/themes-default/slim/src/store/index.js b/themes-default/slim/src/store/index.js index a94fa21c56..92125b3f9c 100644 --- a/themes-default/slim/src/store/index.js +++ b/themes-default/slim/src/store/index.js @@ -8,6 +8,7 @@ import { history, notifications, provider, + recommended, schedule, shows, socket, @@ -33,6 +34,7 @@ const store = new Store({ history, notifications, provider, + recommended, schedule, shows, socket, diff --git a/themes-default/slim/src/store/modules/config/general.js b/themes-default/slim/src/store/modules/config/general.js index af2e51d31c..5c511b64e5 100644 --- a/themes-default/slim/src/store/modules/config/general.js +++ b/themes-default/slim/src/store/modules/config/general.js @@ -53,6 +53,19 @@ const state = { notifications: null, timeout: null }, + recommended: { + cache: { + shows: null, + trakt: null, + imdb: null, + anidb: null, + anilist: null + }, + trakt: { + selectedLists: [], + availableLists: [] + } + }, versionNotify: null, autoUpdate: null, updateFrequency: null, @@ -130,6 +143,9 @@ const mutations = { state.recentShows.unshift(show); // Add the new show object to the start of the array. state.recentShows = state.recentShows.slice(0, 5); // Cut the array of at 5 items. + }, + updateTraktSelectedLists(state, selectedLists) { + state.recommended.trakt.selectedLists = selectedLists; } }; @@ -204,6 +220,12 @@ const actions = { section: 'main', config: { logs: { custom: reducedLogs } } }); }); + }, + setTraktSelectedLists({ commit }, selectedLists) { + return api.patch('config/main', { recommended: { trakt: { selectedLists } } }) + .then(() => { + return commit('updateTraktSelectedLists', selectedLists); + }); } }; diff --git a/themes-default/slim/src/store/modules/config/indexers.js b/themes-default/slim/src/store/modules/config/indexers.js index 1743682ac4..ee5cf03cdc 100644 --- a/themes-default/slim/src/store/modules/config/indexers.js +++ b/themes-default/slim/src/store/modules/config/indexers.js @@ -6,7 +6,8 @@ const state = { statusMap: {}, traktIndexers: {}, validLanguages: [], - langabbvToId: {} + langabbvToId: {}, + recommendedLists: {} }, indexers: { tvdb: { diff --git a/themes-default/slim/src/store/modules/index.js b/themes-default/slim/src/store/modules/index.js index 5564d8636e..66b58e5a61 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 defaults } from './defaults'; export { default as history } from './history'; export { default as notifications } from './notifications'; export { default as provider } from './provider'; +export { default as recommended } from './recommended'; export { default as shows } from './shows'; export { default as schedule } from './schedule'; export { default as socket } from './socket'; diff --git a/themes-default/slim/src/store/modules/recommended.js b/themes-default/slim/src/store/modules/recommended.js new file mode 100644 index 0000000000..3d0e8029ff --- /dev/null +++ b/themes-default/slim/src/store/modules/recommended.js @@ -0,0 +1,85 @@ +import Vue from 'vue'; +import { api } from '../../api'; +import { ADD_RECOMMENDED_SHOW, SET_RECOMMENDED_SHOWS } from '../mutation-types'; + +const IMDB = 10; +const ANIDB = 11; +const TRAKT = 12; +const ANILIST = 13; + +const state = { + shows: [], + trakt: { + removedFromMedusa: [], + blacklistEnabled: false, + availableLists: [] + }, + categories: {}, + externals: { + IMDB, + ANIDB, + TRAKT, + ANILIST + } +}; + +const mutations = { + [ADD_RECOMMENDED_SHOW](state, show) { + const existingShow = state.shows.find(({ seriesId, source }) => Number(show.seriesId[show.source]) === Number(seriesId[source])); + + if (!existingShow) { + console.debug(`Adding ${show.title || show.source + String(show.seriesId)} as it wasn't found in the shows array`, show); + state.shows.push(show); + return; + } + + // Merge new recommended show object over old one + // this allows detailed queries to update the record + // without the non-detailed removing the extra data + console.debug(`Found ${show.title || show.source + String(show.seriesId)} in shows array attempting merge`); + const newShow = { + ...existingShow, + ...show + }; + + // Update state + Vue.set(state.shows, state.shows.indexOf(existingShow), newShow); + console.debug(`Merged ${newShow.title || newShow.source + String(newShow.seriesId)}`, newShow); + }, + [SET_RECOMMENDED_SHOWS](state, data) { + state.trakt.removedFromMedusa = data.trakt.removedFromMedusa; + state.trakt.blacklistEnabled = data.trakt.blacklistEnabled; + state.trakt.availableLists = data.trakt.availableLists; + state.categories = data.categories; + state.shows = data.shows; + } +}; + +const getters = {}; + +const actions = { + /** + * Get recommended shows from API and commit them to the store. + * + * @param {*} context - The store context. + * @param {String} identifier - Identifier for the recommended shows list. + * @Param {String} params - Filter params, for getting a specific recommended list type. + * @returns {(undefined|Promise)} undefined if `shows` was provided or the API response if not. + */ + getRecommendedShows({ commit }, identifier, params) { + params = {}; + + identifier = identifier ? identifier : ''; + return api.get(`/recommended/${identifier}`, { params }) + .then(response => { + commit(SET_RECOMMENDED_SHOWS, response.data); + }); + } +}; + +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 f9bd801227..1b084314b7 100644 --- a/themes-default/slim/src/store/mutation-types.js +++ b/themes-default/slim/src/store/mutation-types.js @@ -20,6 +20,8 @@ const ADD_SHOW_CONFIG = '📺 Show config updated in store'; const ADD_SHOWS = '📺 Multiple Shows added to store in bulk'; const ADD_SHOW_EPISODE = '📺 Shows season with episodes added to store'; const ADD_STATS = 'ℹ️ Statistics added to store'; +const ADD_RECOMMENDED_SHOW = '📺 Recommended Show added to store'; +const SET_RECOMMENDED_SHOWS = '📺 Recommended Shows added to store'; const SET_STATS = 'SET_STATS'; const SET_MAX_DOWNLOAD_COUNT = 'SET_MAX_DOWNLOAD_COUNT'; const ADD_SHOW_SCENE_EXCEPTION = '📺 Add a scene exception'; @@ -59,10 +61,12 @@ export { ADD_HISTORY, ADD_HISTORY_ROW, ADD_SHOW, + ADD_STATS, ADD_SHOW_CONFIG, + ADD_RECOMMENDED_SHOW, + SET_RECOMMENDED_SHOWS, ADD_SHOWS, ADD_SHOW_EPISODE, - ADD_STATS, ADD_REMOTE_BRANCHES, SET_STATS, SET_MAX_DOWNLOAD_COUNT, diff --git a/themes-default/slim/static/css/dark.css b/themes-default/slim/static/css/dark.css index 8529dc1b95..bedaf1cce4 100644 --- a/themes-default/slim/static/css/dark.css +++ b/themes-default/slim/static/css/dark.css @@ -290,11 +290,8 @@ home_recommendedShows.mako ========================================================================== */ .recommended-container { - margin: 12px; - width: 188px; background-color: rgb(51, 51, 51); border: 1px solid rgb(17, 17, 17); - border-radius: 6px; } /* ======================================================================= diff --git a/themes-default/slim/static/css/style.css b/themes-default/slim/static/css/style.css index 0d57feff5d..6c4cd47235 100644 --- a/themes-default/slim/static/css/style.css +++ b/themes-default/slim/static/css/style.css @@ -667,6 +667,8 @@ div.xem { max-width: 100%; overflow: hidden; border: 1px solid rgb(136, 136, 136); + border-top-left-radius: 5px; + border-top-right-radius: 5px; } .background-image img { @@ -934,6 +936,15 @@ div.buttontext p { home_newShow.mako ========================================================================== */ +.addshowoptions { + margin-bottom: 2px; +} + +.addshowoptions button { + float: right; + margin: 0 4px 2px 2px; +} + #addShowForm, #recommendedShowsForm { max-width: 800px; @@ -943,6 +954,21 @@ home_newShow.mako font-size: 13px; } +.show-rating, +.show-votes { + margin-left: 4px; + float: left; +} + +.show-votes > i { + font-size: 11px !important; +} + +select.rec-show-select { + font-size: 12px; + margin: 2px 2px 2px 4px; +} + #addShowForm > div { width: 100% !important; } @@ -1076,6 +1102,7 @@ home_recommendedShows.mako .recommended-container p { padding-top: 2px; + margin: 0; } .recommended-container p img { @@ -1094,7 +1121,7 @@ div.recommended-image { filter: grayscale(100%); } -.show-in-list div#check-overlay { +.show-in-list .check-overlay { opacity: 0.8; background-image: url("../images/green-check.png"); background-repeat: no-repeat; @@ -1112,7 +1139,6 @@ div.recommended-image { white-space: nowrap; font-size: 12px; overflow: hidden; - margin: 0; text-decoration: none; color: rgb(255, 255, 255); } @@ -1120,7 +1146,7 @@ div.recommended-image { .recommended-container { left: -4px; position: relative; - margin: 12px; + margin: 5px; width: 188px; background-color: rgb(223, 218, 207); border: 1px solid rgb(17, 17, 17); @@ -1135,13 +1161,14 @@ div.recommended-image { border-bottom: 1px solid rgb(17, 17, 17); } -.recommended-container .anidb-url { +.recommended-container .recommended-show-url { float: right; padding-right: 4px; } -.anidb-inline { +.recommended-show-link-inline { height: 16px; + padding-bottom: 1px; } .recommended-container .default-poster { @@ -4313,6 +4340,17 @@ CSS helper classes display: block; } +/** Bootstrap fix to get rows without padding **/ +.row-no-padding { + margin-left: 0; + margin-right: 0; + + [class*="col-"] { + padding-left: 0 !important; + padding-right: 0 !important; + } +} + /* Style multiselect components */ .multiselect, .multiselect__tags, diff --git a/themes-default/slim/test/__fixtures__/common.json b/themes-default/slim/test/__fixtures__/common.json index 839aac4995..5dd1c9e841 100644 --- a/themes-default/slim/test/__fixtures__/common.json +++ b/themes-default/slim/test/__fixtures__/common.json @@ -71,6 +71,39 @@ "notifications": true, "timeout": 3 }, + "recommended": { + "cache": { + "shows": true, + "trakt": true, + "imdb": true, + "anidb": true, + "anilist": true + }, + "trakt": { + "selectedLists": [ + "trending", + "popular", + "anticipated", + "collected", + "watched", + "played", + "recommendations", + "newshow", + "newseason" + ], + "availableLists": [ + "trending", + "popular", + "anticipated", + "collected", + "watched", + "played", + "recommendations", + "newshow", + "newseason" + ] + } + }, "versionNotify": true, "autoUpdate": false, "updateFrequency": 1, diff --git a/themes-default/slim/test/specs/__snapshots__/app-link.spec.js.snap b/themes-default/slim/test/specs/__snapshots__/app-link.spec.js.snap index 364365bbed..bfda1bf4c8 100644 --- a/themes-default/slim/test/specs/__snapshots__/app-link.spec.js.snap +++ b/themes-default/slim/test/specs/__snapshots__/app-link.spec.js.snap @@ -8,20 +8,11 @@ exports[`AppLink.test.js renders "false-link" anchor 1`] = ` /> `; -exports[`AppLink.test.js renders anonymised external link 1`] = ` - -`; - exports[`AppLink.test.js renders external link 1`] = ` `; diff --git a/themes-default/slim/test/specs/__snapshots__/config-general.spec.js.snap b/themes-default/slim/test/specs/__snapshots__/config-general.spec.js.snap index b25edd719a..5384419c6b 100644 --- a/themes-default/slim/test/specs/__snapshots__/config-general.spec.js.snap +++ b/themes-default/slim/test/specs/__snapshots__/config-general.spec.js.snap @@ -256,6 +256,78 @@ exports[`ConfigGeneral.test.js renders 1`] = `
+
+
+

+ Recommended shows +

+ +

+ Options for controlling the caching of recommended shows. +

+
+ +
+
+ +

+ Enabling recommended shows, will cache recommended shows on a daily interval. +

+
+ + + + + + + + + + + + +
+
+
+
diff --git a/themes-default/slim/test/specs/app-link.spec.js b/themes-default/slim/test/specs/app-link.spec.js index 7e9a5c281f..934d15241d 100644 --- a/themes-default/slim/test/specs/app-link.spec.js +++ b/themes-default/slim/test/specs/app-link.spec.js @@ -48,10 +48,10 @@ describe('AppLink.test.js', () => { expect(wrapper.element).toMatchSnapshot(); expect(wrapper.attributes().href).toEqual('https://google.com'); expect(wrapper.attributes().target).toEqual('_blank'); - expect(wrapper.attributes().rel).toEqual('noreferrer'); + expect(wrapper.attributes().rel).toEqual('noreferrer noopener'); }); - it('renders anonymised external link', () => { + it.skip('renders anonymised external link', () => { const wrapper = mount(AppLink, { localVue, store, diff --git a/themes-default/slim/views/addShows_addExistingShow.mako b/themes-default/slim/views/addShows_addExistingShow.mako deleted file mode 100644 index 9c7fe5ee21..0000000000 --- a/themes-default/slim/views/addShows_addExistingShow.mako +++ /dev/null @@ -1,306 +0,0 @@ -<%inherit file="/layouts/main.mako"/> -<%! - import json - - from medusa import app - from medusa.indexers.api import indexerApi - from medusa.indexers.config import indexerConfig - - from six import iteritems, text_type as str -%> -<%block name="scripts"> - - - -<%block name="content"> -

{{ $route.meta.header }}

-
-
-
  • Add Existing Show
-
-
-
-
    -
  • Manage Directories
  • -
  • Customize Options
  • -
-
- -
-
- <%include file="/inc_addShowOptions.mako"/> -
-
-
-

Medusa can add existing shows, using the current options, by using locally stored NFO/XML metadata to eliminate user interaction. - If you would rather have Medusa prompt you to customize each show, then use the checkbox below.

-

-
-

Displaying folders within these directories which aren't already added to Medusa:

-
    -
  • - - -
  • -
-
- - - loading folders... - - - - - - - - - - - - - - - - - - - - -
DirectoryShow Name (tvshow.nfo)Indexer
- - - - - {{curDir.metadata.seriesName}} - ? - - -
-
-
- -
-
-
-
- diff --git a/themes-default/slim/views/addShows_newShow.mako b/themes-default/slim/views/addShows_newShow.mako deleted file mode 100644 index 45ae0e41a3..0000000000 --- a/themes-default/slim/views/addShows_newShow.mako +++ /dev/null @@ -1,632 +0,0 @@ -<%inherit file="/layouts/main.mako"/> -<%! - import json - - from medusa import app - from medusa.indexers.api import indexerApi - from medusa.indexers.config import indexerConfig - - from six import iteritems, text_type -%> -<%block name="scripts"> -<% - valid_indexers = { - '0': { - 'name': 'All Indexers' - } - } - valid_indexers.update({ - text_type(indexer): { - 'name': config['name'], - 'showUrl': config['show_url'], - 'icon': config['icon'], - 'identifier': config['identifier'] - } - for indexer, config in iteritems(indexerConfig) - if config.get('enabled', None) - }) -%> - - -<%block name="content"> - -

{{ $route.meta.header }}

-
-
-
  • Add New Show
-
-
Adding show {{showPathPreposition}}
-
-
-
- Find a show on selected indexer(s) -
- Show retrieved from existing metadata: - - - {{ providedInfo.showName }} - -
- Show indexer: - {{ indexers[providedInfo.indexerId].name }} - -
- - {{ providedInfo.showName }} - -
-
-
-
-
- -
- -
- - * -
- -
- -
- -
- -
- -
-

- * This will only affect the language of the retrieved metadata file contents and episode filenames.
- This DOES NOT allow Medusa to download non-english TV episodes! -

-
- -
-
- - Searching {{ currentSearch.query }} - on {{ currentSearch.indexerName }} - in {{ currentSearch.languageName }}... -
-
-
- Search Results: - - - - - - - - - - - - - - - - - - - -
Show NamePremiereNetworkIndexer
- - - - - - - {{ result.showName }} - - {{ result.premiereDate }}{{ result.network }} - {{ result.indexerName }} - -
-
- No results found, try a different search. -
-
-
-
-
-
-
-
- Pick the parent folder -
- Pre-chosen Destination Folder: {{ providedInfo.showDir }}
-
-
- -
-
-
- Customize options -
- -
-
-
-
-
- - -

({{ otherShows.length }} more {{ otherShows.length > 1 ? 'shows' : 'show' }} left)

-

(last show)

-
-
-
-
- diff --git a/themes-default/slim/views/addShows_recommended.mako b/themes-default/slim/views/addShows_recommended.mako deleted file mode 100644 index 73e5482803..0000000000 --- a/themes-default/slim/views/addShows_recommended.mako +++ /dev/null @@ -1,170 +0,0 @@ -<%inherit file="/layouts/main.mako"/> -<%block name="scripts"> -% if enable_anime_options: - -% endif - - -<%block name="content"> -
-
-

{{ $route.meta.header }}

-
-
- - - - - diff --git a/themes-default/slim/views/addShows_trendingShows.mako b/themes-default/slim/views/addShows_trendingShows.mako deleted file mode 100644 index b9f09135f0..0000000000 --- a/themes-default/slim/views/addShows_trendingShows.mako +++ /dev/null @@ -1,110 +0,0 @@ -<%inherit file="/layouts/main.mako"/> -<%! - from medusa import app -%> -<%block name="scripts"> -% if enable_anime_options: - -% endif - - -<%block name="content"> -
-
-

${header}

-
-
- - - -
- -% if traktList: - -% endif - diff --git a/themes-default/slim/views/config_providers.mako b/themes-default/slim/views/config_providers.mako deleted file mode 100644 index e8978de881..0000000000 --- a/themes-default/slim/views/config_providers.mako +++ /dev/null @@ -1,1735 +0,0 @@ -<%inherit file="/layouts/main.mako"/> -<%! - from medusa import app - from medusa.providers import sorted_provider_list - from medusa.providers.generic_provider import GenericProvider - from medusa.providers.torrent.torznab.torznab import TorznabProvider -%> -<%block name="scripts"> - - -<%block name="content"> -

{{ $route.meta.header }}

-
-
-
-
-
    -
  • Provider Priorities
  • -
  • Provider Options
  • - % if app.USE_NZBS: -
  • Configure Custom Newznab Providers
  • - % endif - % if app.USE_TORRENTS: -
  • Configure Custom Torrent Providers
  • -
  • Configure Jackett Providers
  • - % endif -
-
-
-

Provider Priorities

-

Check off and drag the providers into the order you want them to be used.

-

At least one provider is required but two are recommended.

- % if not app.USE_NZBS or not app.USE_TORRENTS: -
NZB/Torrent providers can be toggled in Search Settings
- % else: -
- % endif -
-

* Provider does not support backlog searches at this time.

-

! Provider is NOT WORKING.

-
-
-
-
    - % for cur_provider in sorted_provider_list(): - <% - ## These will show the '!' not saying they are broken - if cur_provider.provider_type == GenericProvider.NZB and not app.USE_NZBS: - continue - elif cur_provider.provider_type == GenericProvider.TORRENT and not app.USE_TORRENTS: - continue - curName = cur_provider.get_id() - if hasattr(cur_provider, 'custom_url'): - curURL = cur_provider.custom_url or cur_provider.url - else: - curURL = cur_provider.url - %> -
  • - - ${cur_provider.name} - ${cur_provider.name} - ${('*', '')[bool(cur_provider.supports_backlog)]} - ${('!', '')[bool(cur_provider.get_id() not in app.BROKEN_PROVIDERS)]} - - - - - -
  • - % endfor -
- -

-
-
-
-
-

Provider Options

-

Configure individual provider settings here.

-

Check with provider's website on how to obtain an API key if needed.

-
-
-
- -
- - % for cur_newznab_provider in [cur_provider for cur_provider in app.newznabProviderList]: -
- % if cur_newznab_provider.default and cur_newznab_provider.needs_auth: -
- -
-
- -
- % endif - % if hasattr(cur_newznab_provider, 'enable_daily'): -
- -
- % endif - % if hasattr(cur_newznab_provider, 'enable_manualsearch'): -
- -
- % endif - % if hasattr(cur_newznab_provider, 'enable_backlog'): -
- -
- % endif - % if hasattr(cur_newznab_provider, 'search_mode'): -
- - - -
- % endif - % if hasattr(cur_newznab_provider, 'search_fallback'): -
- -
- % endif - % if hasattr(cur_newznab_provider, 'enable_search_delay'): -
- -
- % endif - % if hasattr(cur_newznab_provider, 'search_delay'): -
- - -
- % endif -
- % endfor - % for cur_nzb_provider in [cur_provider for cur_provider in sorted_provider_list() if cur_provider.provider_type == GenericProvider.NZB and cur_provider not in app.newznabProviderList]: -
- % if hasattr(cur_nzb_provider, 'username'): -
- -
- % endif - % if hasattr(cur_nzb_provider, 'api_key'): -
- -
- % endif - % if hasattr(cur_nzb_provider, 'enable_daily'): -
- -
- % endif - % if hasattr(cur_nzb_provider, 'enable_manualsearch'): -
- -
- % endif - % if hasattr(cur_nzb_provider, 'enable_backlog'): -
- -
- % endif - % if hasattr(cur_nzb_provider, 'search_mode'): -
- - - -
- % endif - % if hasattr(cur_nzb_provider, 'search_fallback'): -
- -
- % endif - % if hasattr(cur_nzb_provider, 'enable_search_delay'): -
- -
- % endif - % if hasattr(cur_nzb_provider, 'search_delay'): -
- - -
- % endif -
- % endfor - % for cur_torrent_provider in [cur_provider for cur_provider in sorted_provider_list() if cur_provider.provider_type == GenericProvider.TORRENT]: -
- % if hasattr(cur_torrent_provider, 'custom_url'): -
- - -
- % endif - % if hasattr(cur_torrent_provider, 'api_key') and not isinstance(cur_torrent_provider, TorznabProvider): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'digest'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'hash'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'username'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'password'): -
- -
- % endif - - % if cur_torrent_provider.enable_cookies or cur_torrent_provider in app.torrentRssProviderList: -
- - -
- % endif - % if hasattr(cur_torrent_provider, 'passkey'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'pin'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'ratio'): -
- - -
- % endif - % if hasattr(cur_torrent_provider, 'minseed'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'minleech'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'confirmed'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'ranked'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'engrelease'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'onlyspasearch'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'sorting'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'freeleech'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'enable_daily'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'enable_manualsearch'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'enable_backlog'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'search_mode'): -
- - - -
- % endif - % if hasattr(cur_torrent_provider, 'search_fallback'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'cat') and cur_torrent_provider.get_id() == 'tntvillage': -
- -
- % endif - % if hasattr(cur_torrent_provider, 'subtitle') and cur_torrent_provider.get_id() == 'tntvillage': -
- -
- % endif - % if hasattr(cur_torrent_provider, 'enable_search_delay'): -
- -
- % endif - % if hasattr(cur_torrent_provider, 'search_delay'): -
- - -
- % endif -
- % endfor - -
-
-
- % if app.USE_NZBS: -
-
-

Configure Custom Newznab Providers

-

Add and setup or remove custom Newznab providers.

-
-
-
- -
-
-
- -
-
- -
-
- - -
- -
- - -
- -
-
-
- % endif - % if app.USE_TORRENTS: -
-
-

Configure Custom Torrent Providers

-

Add and setup or remove custom RSS providers.

-
-
-
- -
-
-
- -
-
- -
-
- - -
-
- - -
-
- - -
- -
-
-
-
-
-

Configure Jackett Providers

-

Add and setup or remove Jackett providers.

-
-
-
- -
-
-
- -
-
- -
-
- -
- - -
- - -
- -
-
-
- % endif -
-
-
-
- diff --git a/themes-default/slim/views/history.mako b/themes-default/slim/views/history.mako deleted file mode 100644 index 9f3cbb9adc..0000000000 --- a/themes-default/slim/views/history.mako +++ /dev/null @@ -1,219 +0,0 @@ -<%inherit file="/layouts/main.mako"/> -<%! - from medusa import app - import os.path - from datetime import datetime - import re - import time - from random import choice - from medusa import providers - from medusa.sbdatetime import sbdatetime - from medusa.common import SKIPPED, WANTED, UNAIRED, ARCHIVED, IGNORED, SNATCHED, SNATCHED_PROPER, SNATCHED_BEST, FAILED, DOWNLOADED, SUBTITLED - from medusa.common import statusStrings - from medusa.show.history import History - from medusa.providers.generic_provider import GenericProvider -%> -<%block name="scripts"> - - - diff --git a/themes-default/slim/views/home_postprocess.mako b/themes-default/slim/views/home_postprocess.mako deleted file mode 100644 index 087dbaf740..0000000000 --- a/themes-default/slim/views/home_postprocess.mako +++ /dev/null @@ -1,124 +0,0 @@ -<%inherit file="/layouts/main.mako"/> -<%! - import pkgutil - from medusa import app -%> -<%block name="scripts"> - - - diff --git a/themes-default/slim/views/inc_addShowOptions.mako b/themes-default/slim/views/inc_addShowOptions.mako deleted file mode 100644 index abc9185e95..0000000000 --- a/themes-default/slim/views/inc_addShowOptions.mako +++ /dev/null @@ -1,93 +0,0 @@ -<% - from medusa import app - from medusa.common import SKIPPED, WANTED, UNAIRED, ARCHIVED, IGNORED, SNATCHED, SNATCHED_PROPER, SNATCHED_BEST, FAILED - from medusa.common import Quality, qualityPresets, qualityPresetStrings, statusStrings - from medusa import subtitles -%> -
- -
- % if app.USE_SUBTITLES: -
- -
- % endif -
- -
-
- -
-
- -
-% if enable_anime_options: -
- -
-% endif -
- -
-
-
- -

-% if enable_anime_options: - <% import medusa.black_and_white_list %> - <%include file="/inc_blackwhitelist.mako"/> -% else: - -% endif diff --git a/themes-default/slim/views/inc_blackwhitelist.mako b/themes-default/slim/views/inc_blackwhitelist.mako deleted file mode 100644 index 28110acd69..0000000000 --- a/themes-default/slim/views/inc_blackwhitelist.mako +++ /dev/null @@ -1,59 +0,0 @@ -
- - - Fansub Groups: -
-

Select your preferred fansub groups from the Available Groups and add them to the Whitelist. Add groups to the Blacklist to ignore them.

-

The Whitelist is checked before the Blacklist.

-

Groups are shown as Name | Rating | Number of subbed episodes.

-

You may also add any fansub group not listed to either list manually.

-

When doing this please note that you can only use groups listed on anidb for this anime. -
If a group is not listed on anidb but subbed this anime, please correct anidb's data.

-
-
-
-
-
-

Whitelist

- -
- -
-
-

Available Groups

- -
- - -
-
-

Blacklist

- -
- -
-
-
-
- - - -
-
-
-
-
diff --git a/themes-default/slim/views/layouts/main.mako b/themes-default/slim/views/layouts/main.mako index 88968a83cd..899845ab56 100644 --- a/themes-default/slim/views/layouts/main.mako +++ b/themes-default/slim/views/layouts/main.mako @@ -100,11 +100,6 @@ - - - - - diff --git a/themes-default/slim/views/partials/home/poster.mako b/themes-default/slim/views/partials/home/poster.mako deleted file mode 100644 index 69c0bf6c41..0000000000 --- a/themes-default/slim/views/partials/home/poster.mako +++ /dev/null @@ -1,179 +0,0 @@ -<%! - import calendar - import re - - from medusa import app - from medusa import sbdatetime - from medusa import network_timezones - from medusa.helpers import remove_article - from medusa.helper.common import pretty_file_size - from medusa.scene_numbering import get_xem_numbering_for_show -%> -
- -
-% for cur_show_list in show_lists: - <% cur_list_type = cur_show_list[0] %> - <% my_show_list = list(cur_show_list[1]) %> - % if app.ANIME_SPLIT_HOME and app.ANIME_SPLIT_HOME_IN_TABS: -
- % endif -
- % if not (app.ANIME_SPLIT_HOME and app.ANIME_SPLIT_HOME_IN_TABS): - % if len(show_lists) > 1: -
- -

${cur_list_type}

-
-
- % endif - % endif -
- % for cur_loading_show in app.show_queue_scheduler.action.loadingShowList: - % if cur_loading_show.show is None: -
- -
-
Loading... (${cur_loading_show.show_name})
-
-
- % endif - % endfor - <% - def titler(x): - return (remove_article(x), x)[not x or app.SORT_ARTICLE] - - my_show_list.sort(key=lambda x: titler(x.name).lower()) - %> - % for cur_show in my_show_list: - <% - cur_airs_next = '' - cur_snatched = 0 - cur_downloaded = 0 - cur_total = 0 - download_stat_tip = '' - display_status = cur_show.status - if None is not display_status: - if re.search(r'(?i)(?:new|returning)\s*series', cur_show.status): - display_status = 'Continuing' - elif re.search(r'(?i)(?:nded)', cur_show.status): - display_status = 'Ended' - if (cur_show.indexer, cur_show.series_id) in show_stat: - series = (cur_show.indexer, cur_show.series_id) - cur_airs_next = show_stat[series]['ep_airs_next'] - cur_snatched = show_stat[series]['ep_snatched'] - if not cur_snatched: - cur_snatched = 0 - cur_downloaded = show_stat[series]['ep_downloaded'] - if not cur_downloaded: - cur_downloaded = 0 - cur_total = show_stat[series]['ep_total'] - if not cur_total: - cur_total = 0 - download_stat = str(cur_downloaded) - download_stat_tip = "Downloaded: " + str(cur_downloaded) - if cur_snatched: - download_stat = download_stat + "+" + str(cur_snatched) - download_stat_tip = download_stat_tip + " " + "Snatched: " + str(cur_snatched) - download_stat = download_stat + " / " + str(cur_total) - download_stat_tip = download_stat_tip + " " + "Total: " + str(cur_total) - nom = cur_downloaded - if cur_total: - den = cur_total - else: - den = 1 - download_stat_tip = "Unaired" - progressbar_percent = nom * 100 // den - data_date = '6000000000.0' - if cur_airs_next: - data_date = calendar.timegm(sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(cur_airs_next, cur_show.airs, cur_show.network)).timetuple()) - elif None is not display_status: - if 'nded' not in display_status and 1 == int(cur_show.paused): - data_date = '5000000500.0' - elif 'ontinu' in display_status: - data_date = '5000000000.0' - elif 'nded' in display_status: - data_date = '5000000100.0' - %> -
-
-
- -
-
- - - -
-
- -
- % endfor -
-
- % if app.ANIME_SPLIT_HOME and app.ANIME_SPLIT_HOME_IN_TABS: -
- % endif -% endfor -
diff --git a/themes-default/slim/views/partials/schedule/banner.mako b/themes-default/slim/views/partials/schedule/banner.mako deleted file mode 100644 index ec0d191954..0000000000 --- a/themes-default/slim/views/partials/schedule/banner.mako +++ /dev/null @@ -1,157 +0,0 @@ -<%! - import datetime - - from medusa import app - from medusa.indexers.api import indexerApi - from medusa.indexers.utils import indexer_id_to_name - from medusa.sbdatetime import sbdatetime -%> - -<% - cur_segment = None - too_late_header = False - missed_header = False - today_header = False - show_div = 'ep_listing listing-default' -%> - -% if app.COMING_EPS_SORT == 'show': -

-% endif -% for cur_result in results: -<% - cur_indexer = int(cur_result['indexer']) - if bool(cur_result['paused']) and not app.COMING_EPS_DISPLAY_PAUSED: - continue - run_time = cur_result['runtime'] - cur_ep_airdate = cur_result['localtime'].date() - if run_time: - cur_ep_enddate = cur_result['localtime'] + datetime.timedelta(minutes = run_time) - else: - cur_ep_enddate = cur_result['localtime'] -%> - % if app.COMING_EPS_SORT == 'network': - <% show_network = ('no network', cur_result['network'])[bool(cur_result['network'])] %> - % if cur_segment != show_network: -
-

${show_network}

-
- <% cur_segment = cur_result['network'] %> - % endif - % if cur_ep_enddate < today: - <% show_div = 'ep_listing listing-overdue' %> - % elif cur_ep_airdate >= next_week.date(): - <% show_div = 'ep_listing listing-toofar' %> - % elif cur_ep_enddate >= today and cur_ep_airdate < next_week.date(): - % if cur_ep_airdate == today.date(): - <% show_div = 'ep_listing listing-current' %> - % else: - <% show_div = 'ep_listing listing-default' %> - % endif - % endif - % elif app.COMING_EPS_SORT == 'date': - % if cur_segment != cur_ep_airdate: - % if cur_ep_enddate < today and cur_ep_airdate != today.date() and not missed_header: -

Missed

- <% missed_header = True %> - % elif cur_ep_airdate >= next_week.date() and not too_late_header: -

Later

- <% too_late_header = True %> - % elif cur_ep_enddate >= today and cur_ep_airdate < next_week.date(): - % if cur_ep_airdate == today.date(): -

${sbdatetime.sbftime(dt=cur_ep_airdate, t_preset='%A').capitalize()}[Today]

- <% today_header = True %> - % else: -

${sbdatetime.sbftime(dt=cur_ep_airdate, t_preset='%A').capitalize()}

- % endif - % endif - <% cur_segment = cur_ep_airdate %> - % endif - % if cur_ep_airdate == today.date() and not today_header: -
-

${sbdatetime.sbftime(dt=cur_ep_airdate, t_preset='%A').capitalize()} [Today]

-
- <% today_header = True %> - % endif - % if cur_ep_enddate < today: - <% show_div = 'ep_listing listing-overdue' %> - % elif cur_ep_airdate >= next_week.date(): - <% show_div = 'ep_listing listing-toofar' %> - % elif cur_ep_enddate >= today and cur_ep_airdate < next_week.date(): - % if cur_ep_airdate == today.date(): - <% show_div = 'ep_listing listing-current' %> - % else: - <% show_div = 'ep_listing listing-default'%> - % endif - % endif - % elif app.COMING_EPS_SORT == 'show': - % if cur_ep_enddate < today: - <% show_div = 'ep_listing listing-overdue listingradius' %> - % elif cur_ep_airdate >= next_week.date(): - <% show_div = 'ep_listing listing-toofar listingradius' %> - % elif cur_ep_enddate >= today and cur_ep_airdate < next_week.date(): - % if cur_ep_airdate == today.date(): - <% show_div = 'ep_listing listing-current listingradius' %> - % else: - <% show_div = 'ep_listing listing-default listingradius' %> - % endif - % endif - % endif -
-
- - - - - - - ## - ## - ## - -
- - - -
-
- - - ${cur_result['show_name']}${('', ' [paused]')[bool(cur_result['paused'])]} - - - -% if cur_result['imdb_id']: - - [imdb] - -% endif - ${indexerApi(cur_indexer).name} - search - search - -
- Next Episode: ${'S%02iE%02i' % (int(cur_result['season']), int(cur_result['episode']))} - ${cur_result['name']} -
- Airs: ${sbdatetime.sbfdatetime(cur_result['localtime'])}${('', ' on %s' % cur_result['network'])[bool(cur_result['network'])]} -
-
- Quality: - -
- ##
-
-% if cur_result['description']: - Plot: -
${cur_result['description']}
-% else: - Plot: - -% endif -
-
-
-
- -% endfor - diff --git a/themes-default/slim/views/partials/schedule/calendar.mako b/themes-default/slim/views/partials/schedule/calendar.mako deleted file mode 100644 index dd88c8e472..0000000000 --- a/themes-default/slim/views/partials/schedule/calendar.mako +++ /dev/null @@ -1,64 +0,0 @@ -<%! - import datetime - import time - import re - - from medusa import app - from medusa.indexers.utils import indexer_id_to_name - from medusa.sbdatetime import sbdatetime -%> - -<% dates = [today.date() + datetime.timedelta(days = i) for i in range(7)] %> -<% tbl_day = 0 %> - -
- % for day in dates: - <% tbl_day += 1 %> - - - - <% day_has_show = False %> - % for cur_result in results: - % if bool(cur_result['paused']) and not app.COMING_EPS_DISPLAY_PAUSED: - <% continue %> - % endif - <% cur_indexer = int(cur_result['indexer']) %> - <% run_time = cur_result['runtime'] %> - <% airday = cur_result['localtime'].date() %> - % if airday == day: - % try: - <% day_has_show = True %> - <% airtime = sbdatetime.fromtimestamp(time.mktime(cur_result['localtime'].timetuple())).sbftime() %> - % if app.TRIM_ZERO: - <% airtime = re.sub(r'0(\d:\d\d)', r'\1', airtime, 0, re.IGNORECASE | re.MULTILINE) %> - % endif - % except OverflowError: - <% airtime = "Invalid" %> - % endtry - - - - % endif - % endfor - % if not day_has_show: - - % endif - -
${sbdatetime.sbftime(dt=day, t_preset='%A').capitalize()}
-
- - - -
-
- - ${airtime} on ${cur_result["network"]} - - - ${'S%02iE%02i' % (int(cur_result['season']), int(cur_result['episode']))} - ${cur_result['name']} - -
-
No shows for this day
- % endfor - -
diff --git a/themes-default/slim/views/partials/schedule/list.mako b/themes-default/slim/views/partials/schedule/list.mako deleted file mode 100644 index 2b0b61aae2..0000000000 --- a/themes-default/slim/views/partials/schedule/list.mako +++ /dev/null @@ -1,103 +0,0 @@ -<%! - import datetime - - from medusa import app, sbdatetime - from medusa.indexers.api import indexerApi - from medusa.indexers.utils import indexer_id_to_name -%> - -<% show_div = 'listing-default' %> - - - - - - - - - - - - - - - - -% for cur_result in results: -<% - cur_indexer = int(cur_result['indexer']) - run_time = cur_result['runtime'] - if bool(cur_result['paused']) and not app.COMING_EPS_DISPLAY_PAUSED: - continue - cur_ep_airdate = cur_result['localtime'].date() - if run_time: - cur_ep_enddate = cur_result['localtime'] + datetime.timedelta(minutes = run_time) - if cur_ep_enddate < today: - show_div = 'listing-overdue' - elif cur_ep_airdate >= next_week.date(): - show_div = 'listing-toofar' - elif cur_ep_airdate >= today.date() and cur_ep_airdate < next_week.date(): - if cur_ep_airdate == today.date(): - show_div = 'listing-current' - else: - show_div = 'listing-default' - else: - cur_ep_enddate = cur_result['localtime'] -%> - - - - - - - - - - - - -% endfor - - - - - - -
Airdate (${('local', 'network')[app.TIMEZONE_DISPLAY == 'network']})EndsShowNext EpNext Ep NameNetworkRun timeQualityIndexersSearch
- <% airDate = sbdatetime.sbdatetime.convert_to_setting(cur_result['localtime']) %> - - - <% ends = sbdatetime.sbdatetime.convert_to_setting(cur_ep_enddate) %> - - ${cur_result['show_name']} -% if bool(cur_result['paused']): - [paused] -% endif - - ${'S%02iE%02i' % (int(cur_result['season']), int(cur_result['episode']))} - - - ${cur_result['name']} - - ${cur_result['network']} - - ${run_time}min - - - - % if cur_result['imdb_id']: - - [imdb] - - % endif - - ${indexerApi(cur_indexer).name} - - - search - search -
 
- \ No newline at end of file diff --git a/themes-default/slim/views/partials/schedule/poster.mako b/themes-default/slim/views/partials/schedule/poster.mako deleted file mode 100644 index ad22fba4dc..0000000000 --- a/themes-default/slim/views/partials/schedule/poster.mako +++ /dev/null @@ -1,155 +0,0 @@ -<%! - import datetime - - from medusa import app - from medusa.indexers.api import indexerApi - from medusa.indexers.utils import indexer_id_to_name - from medusa.sbdatetime import sbdatetime -%> - -<% - cur_segment = None - too_late_header = False - missed_header = False - today_header = False - show_div = 'ep_listing listing-default' -%> - -% if app.COMING_EPS_SORT == 'show': -

-% endif -% for cur_result in results: -<% - cur_indexer = int(cur_result['indexer']) - if bool(cur_result['paused']) and not app.COMING_EPS_DISPLAY_PAUSED: - continue - run_time = cur_result['runtime'] - cur_ep_airdate = cur_result['localtime'].date() - if run_time: - cur_ep_enddate = cur_result['localtime'] + datetime.timedelta(minutes = run_time) - else: - cur_ep_enddate = cur_result['localtime'] -%> - % if app.COMING_EPS_SORT == 'network': - <% show_network = ('no network', cur_result['network'])[bool(cur_result['network'])] %> - % if cur_segment != show_network: -
-

${show_network}

-
- <% cur_segment = cur_result['network'] %> - % endif - % if cur_ep_enddate < today: - <% show_div = 'ep_listing listing-overdue' %> - % elif cur_ep_airdate >= next_week.date(): - <% show_div = 'ep_listing listing-toofar' %> - % elif cur_ep_enddate >= today and cur_ep_airdate < next_week.date(): - % if cur_ep_airdate == today.date(): - <% show_div = 'ep_listing listing-current' %> - % else: - <% show_div = 'ep_listing listing-default' %> - % endif - % endif - % elif app.COMING_EPS_SORT == 'date': - % if cur_segment != cur_ep_airdate: - % if cur_ep_enddate < today and cur_ep_airdate != today.date() and not missed_header: -

Missed

- <% missed_header = True %> - % elif cur_ep_airdate >= next_week.date() and not too_late_header: -

Later

- <% too_late_header = True %> - % elif cur_ep_enddate >= today and cur_ep_airdate < next_week.date(): - % if cur_ep_airdate == today.date(): -

${sbdatetime.sbftime(dt=cur_ep_airdate, t_preset='%A').capitalize()}[Today]

- <% today_header = True %> - % else: -

${sbdatetime.sbftime(dt=cur_ep_airdate, t_preset='%A').capitalize()}

- % endif - % endif - <% cur_segment = cur_ep_airdate %> - % endif - % if cur_ep_airdate == today.date() and not today_header: -
-

${sbdatetime.sbftime(dt=cur_ep_airdate, t_preset='%A').capitalize()} [Today]

-
- <% today_header = True %> - % endif - % if cur_ep_enddate < today: - <% show_div = 'ep_listing listing-overdue' %> - % elif cur_ep_airdate >= next_week.date(): - <% show_div = 'ep_listing listing-toofar' %> - % elif cur_ep_enddate >= today and cur_ep_airdate < next_week.date(): - % if cur_ep_airdate == today.date(): - <% show_div = 'ep_listing listing-current' %> - % else: - <% show_div = 'ep_listing listing-default'%> - % endif - % endif - % elif app.COMING_EPS_SORT == 'show': - % if cur_ep_enddate < today: - <% show_div = 'ep_listing listing-overdue listingradius' %> - % elif cur_ep_airdate >= next_week.date(): - <% show_div = 'ep_listing listing-toofar listingradius' %> - % elif cur_ep_enddate >= today and cur_ep_airdate < next_week.date(): - % if cur_ep_airdate == today.date(): - <% show_div = 'ep_listing listing-current listingradius' %> - % else: - <% show_div = 'ep_listing listing-default listingradius' %> - % endif - % endif - % endif -
-
- - - - - ## - ## - ## - -
- - - - -
- - - ${('', '[paused]')[bool(cur_result['paused'])]} - - - -% if cur_result['imdb_id']: - - [imdb] - -% endif - ${indexerApi(cur_indexer).name} - search - search - -
- Next Episode: ${'S%02iE%02i' % (int(cur_result['season']), int(cur_result['episode']))} - ${cur_result['name']} -
- Airs: ${sbdatetime.sbfdatetime(cur_result['localtime'])}${('', ' on %s' % cur_result['network'])[bool(cur_result['network'])]} -
-
- Quality: - -
- ##
-
-% if cur_result['description']: - Plot: -
${cur_result['description']}
-% else: - Plot: - -% endif -
-
-
-
- -% endfor - diff --git a/themes-default/slim/views/schedule.mako b/themes-default/slim/views/schedule.mako deleted file mode 100644 index cc045cd0f7..0000000000 --- a/themes-default/slim/views/schedule.mako +++ /dev/null @@ -1,87 +0,0 @@ -<%inherit file="/layouts/main.mako"/> -<%! - from random import choice - - from medusa import app -%> -<%block name="scripts"> - - - - - \ No newline at end of file diff --git a/themes-default/slim/yarn.lock b/themes-default/slim/yarn.lock index 919b398e26..2b48d26d7e 100644 --- a/themes-default/slim/yarn.lock +++ b/themes-default/slim/yarn.lock @@ -1299,6 +1299,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "^0.2.35" +"@fortawesome/free-regular-svg-icons@5.15.3": + version "5.15.3" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.3.tgz#1ec4f2410ff638db549c5c5484fc60b66407dbe6" + integrity sha512-q4/p8Xehy9qiVTdDWHL4Z+o5PCLRChePGZRTXkl+/Z7erDVL8VcZUuqzJjs6gUz6czss4VIPBRdCz6wP37/zMQ== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.35" + "@fortawesome/free-solid-svg-icons@5.15.3": version "5.15.3" resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz#52eebe354f60dc77e0bde934ffc5c75ffd04f9d8" @@ -11615,6 +11622,11 @@ value-or-function@^3.0.0: resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= +vanilla-lazyload@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/vanilla-lazyload/-/vanilla-lazyload-12.0.0.tgz#5673fd80dfa20c554afe46891b3450f596f953b1" + integrity sha512-KlcDPYUHRKXp4Ighh3294xzGZiZxeFeddNBRtD5TCD7+x0A1jzeaO0IO7eLFjWgD7gDS+qfL3qo8tWOGhLER/A== + vendors@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" @@ -11773,6 +11785,11 @@ vue-js-toggle-button@1.3.3: resolved "https://registry.yarnpkg.com/vue-js-toggle-button/-/vue-js-toggle-button-1.3.3.tgz#d603089039e41d45e607355ad2e0478c6a52aceb" integrity sha512-0b920oztgK+1SqlYF26MPiT28hAieL5aAQE7u21XEym5ryfzD4EMer4hLkgDC/1sWsCHb22GvV+t1Kb4AI6QFw== +vue-lazyload@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/vue-lazyload/-/vue-lazyload-1.3.3.tgz#4df50a271bde9b74c3caf7a228d6e0af50d5682f" + integrity sha512-uHnq0FTEeNmqnbBC2aRKlmtd9LofMZ6Q3mWvgfLa+i9vhxU8fDK+nGs9c1iVT85axSua/AUnMttIq3xPaU9G3A== + vue-loader@15.9.7: version "15.9.7" resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.7.tgz#15b05775c3e0c38407679393c2ce6df673b01044" diff --git a/themes/dark/assets/css/style.css b/themes/dark/assets/css/style.css index 0d57feff5d..6c4cd47235 100644 --- a/themes/dark/assets/css/style.css +++ b/themes/dark/assets/css/style.css @@ -667,6 +667,8 @@ div.xem { max-width: 100%; overflow: hidden; border: 1px solid rgb(136, 136, 136); + border-top-left-radius: 5px; + border-top-right-radius: 5px; } .background-image img { @@ -934,6 +936,15 @@ div.buttontext p { home_newShow.mako ========================================================================== */ +.addshowoptions { + margin-bottom: 2px; +} + +.addshowoptions button { + float: right; + margin: 0 4px 2px 2px; +} + #addShowForm, #recommendedShowsForm { max-width: 800px; @@ -943,6 +954,21 @@ home_newShow.mako font-size: 13px; } +.show-rating, +.show-votes { + margin-left: 4px; + float: left; +} + +.show-votes > i { + font-size: 11px !important; +} + +select.rec-show-select { + font-size: 12px; + margin: 2px 2px 2px 4px; +} + #addShowForm > div { width: 100% !important; } @@ -1076,6 +1102,7 @@ home_recommendedShows.mako .recommended-container p { padding-top: 2px; + margin: 0; } .recommended-container p img { @@ -1094,7 +1121,7 @@ div.recommended-image { filter: grayscale(100%); } -.show-in-list div#check-overlay { +.show-in-list .check-overlay { opacity: 0.8; background-image: url("../images/green-check.png"); background-repeat: no-repeat; @@ -1112,7 +1139,6 @@ div.recommended-image { white-space: nowrap; font-size: 12px; overflow: hidden; - margin: 0; text-decoration: none; color: rgb(255, 255, 255); } @@ -1120,7 +1146,7 @@ div.recommended-image { .recommended-container { left: -4px; position: relative; - margin: 12px; + margin: 5px; width: 188px; background-color: rgb(223, 218, 207); border: 1px solid rgb(17, 17, 17); @@ -1135,13 +1161,14 @@ div.recommended-image { border-bottom: 1px solid rgb(17, 17, 17); } -.recommended-container .anidb-url { +.recommended-container .recommended-show-url { float: right; padding-right: 4px; } -.anidb-inline { +.recommended-show-link-inline { height: 16px; + padding-bottom: 1px; } .recommended-container .default-poster { @@ -4313,6 +4340,17 @@ CSS helper classes display: block; } +/** Bootstrap fix to get rows without padding **/ +.row-no-padding { + margin-left: 0; + margin-right: 0; + + [class*="col-"] { + padding-left: 0 !important; + padding-right: 0 !important; + } +} + /* Style multiselect components */ .multiselect, .multiselect__tags, diff --git a/themes/dark/assets/css/themed.css b/themes/dark/assets/css/themed.css index 8529dc1b95..bedaf1cce4 100644 --- a/themes/dark/assets/css/themed.css +++ b/themes/dark/assets/css/themed.css @@ -290,11 +290,8 @@ home_recommendedShows.mako ========================================================================== */ .recommended-container { - margin: 12px; - width: 188px; background-color: rgb(51, 51, 51); border: 1px solid rgb(17, 17, 17); - border-radius: 6px; } /* ======================================================================= diff --git a/themes/dark/assets/js/index.js b/themes/dark/assets/js/index.js index b6ae975cb9..68dc82d959 100644 --- a/themes/dark/assets/js/index.js +++ b/themes/dark/assets/js/index.js @@ -15,7 +15,7 @@ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var bootstrap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! bootstrap */ \"./node_modules/bootstrap/dist/js/npm.js\");\n/* harmony import */ var bootstrap__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(bootstrap__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var bootstrap_dist_css_bootstrap_min_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! bootstrap/dist/css/bootstrap.min.css */ \"./node_modules/bootstrap/dist/css/bootstrap.min.css\");\n/* harmony import */ var vue_snotify_styles_material_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-snotify/styles/material.css */ \"./node_modules/vue-snotify/styles/material.css\");\n/* harmony import */ var _vendor_js_tablesorter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vendor/js/tablesorter */ \"./vendor/js/tablesorter.js\");\n/* harmony import */ var _vendor_css_open_sans_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vendor/css/open-sans.css */ \"./vendor/css/open-sans.css\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vue-js-toggle-button */ \"./node_modules/vue-js-toggle-button/dist/index.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash/debounce */ \"./node_modules/lodash/debounce.js\");\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./router */ \"./src/router/index.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./api */ \"./src/api.js\");\n/* harmony import */ var _global_vue_shim__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./global-vue-shim */ \"./src/global-vue-shim.js\");\n/* eslint-disable import/no-unassigned-import */\n\n\n\n\n\n\n/* eslint-enable import/no-unassigned-import */\n\n\n\n\n\n\n\n\n\n\n\nif (window) {\n // @TODO: Remove this before v1.0.0\n window.globalVueShim = _global_vue_shim__WEBPACK_IMPORTED_MODULE_12__.default; // Adding libs to window so mako files can use them\n\n window.$ = (jquery__WEBPACK_IMPORTED_MODULE_0___default());\n window.jQuery = (jquery__WEBPACK_IMPORTED_MODULE_0___default());\n window.Vue = vue__WEBPACK_IMPORTED_MODULE_13__.default;\n window.Vuex = vuex__WEBPACK_IMPORTED_MODULE_14__.default;\n window.ToggleButton = vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_6__.ToggleButton;\n window.axios = (axios__WEBPACK_IMPORTED_MODULE_7___default());\n window._ = {\n debounce: (lodash_debounce__WEBPACK_IMPORTED_MODULE_8___default())\n };\n window.store = _store__WEBPACK_IMPORTED_MODULE_9__.default;\n window.router = _router__WEBPACK_IMPORTED_MODULE_10__.default;\n window.apiRoute = _api__WEBPACK_IMPORTED_MODULE_11__.apiRoute;\n window.apiv1 = _api__WEBPACK_IMPORTED_MODULE_11__.apiv1;\n window.api = _api__WEBPACK_IMPORTED_MODULE_11__.api;\n window.MEDUSA = {\n common: {},\n config: {\n general: {},\n layout: {}\n },\n home: {},\n addShows: {}\n };\n window.webRoot = _api__WEBPACK_IMPORTED_MODULE_11__.webRoot;\n window.apiKey = _api__WEBPACK_IMPORTED_MODULE_11__.apiKey; // Push x-template components to this array to register them globally\n\n window.components = [];\n}\n\nconst UTIL = {\n exec(controller, action) {\n const ns = MEDUSA;\n action = action === undefined ? 'init' : action;\n\n if (controller !== '' && ns[controller] && typeof ns[controller][action] === 'function') {\n ns[controller][action]();\n }\n },\n\n init() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[v-cloak]').removeAttr('v-cloak');\n const {\n body\n } = document;\n const controller = body.getAttribute('data-controller');\n const action = body.getAttribute('data-action');\n UTIL.exec('common'); // Load common\n\n UTIL.exec(controller); // Load MEDUSA[controller]\n\n UTIL.exec(controller, action); // Load MEDUSA[controller][action]\n\n window.dispatchEvent(new Event('medusa-loaded'));\n }\n\n};\nconst {\n pathname\n} = window.location;\n\nif (!pathname.includes('/login') && !pathname.includes('/apibuilder')) {\n const configLoaded = event => {\n const {\n general,\n layout\n } = event.detail;\n MEDUSA.config.general = { ...MEDUSA.config.general,\n ...general\n };\n const themeSpinner = layout.themeName === 'dark' ? '-dark' : '';\n MEDUSA.config.layout = { ...MEDUSA.config.layout,\n ...layout,\n themeSpinner,\n loading: ''\n };\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).ready(UTIL.init);\n };\n\n window.addEventListener('medusa-config-loaded', configLoaded, {\n once: true\n });\n}\n\n//# sourceURL=webpack://slim/./src/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var bootstrap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! bootstrap */ \"./node_modules/bootstrap/dist/js/npm.js\");\n/* harmony import */ var bootstrap__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(bootstrap__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var bootstrap_dist_css_bootstrap_min_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! bootstrap/dist/css/bootstrap.min.css */ \"./node_modules/bootstrap/dist/css/bootstrap.min.css\");\n/* harmony import */ var vue_snotify_styles_material_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-snotify/styles/material.css */ \"./node_modules/vue-snotify/styles/material.css\");\n/* harmony import */ var _vendor_js_tablesorter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../vendor/js/tablesorter */ \"./vendor/js/tablesorter.js\");\n/* harmony import */ var _vendor_css_open_sans_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../vendor/css/open-sans.css */ \"./vendor/css/open-sans.css\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vue-js-toggle-button */ \"./node_modules/vue-js-toggle-button/dist/index.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash/debounce */ \"./node_modules/lodash/debounce.js\");\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var vueisotope__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! vueisotope */ \"./node_modules/vueisotope/dist/vue_isotope.min.js\");\n/* harmony import */ var vueisotope__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(vueisotope__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./router */ \"./src/router/index.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./api */ \"./src/api.js\");\n/* harmony import */ var _global_vue_shim__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./global-vue-shim */ \"./src/global-vue-shim.js\");\n/* eslint-disable import/no-unassigned-import */\n\n\n\n\n\n\n/* eslint-enable import/no-unassigned-import */\n\n\n\n\n\n\n\n\n\n\n\n\nif (window) {\n // @TODO: Remove this before v1.0.0\n window.globalVueShim = _global_vue_shim__WEBPACK_IMPORTED_MODULE_13__.default; // Adding libs to window so mako files can use them\n\n window.$ = (jquery__WEBPACK_IMPORTED_MODULE_0___default());\n window.jQuery = (jquery__WEBPACK_IMPORTED_MODULE_0___default());\n window.Vue = vue__WEBPACK_IMPORTED_MODULE_14__.default;\n window.Vuex = vuex__WEBPACK_IMPORTED_MODULE_15__.default;\n window.ToggleButton = vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_6__.ToggleButton;\n window.axios = (axios__WEBPACK_IMPORTED_MODULE_7___default());\n window._ = {\n debounce: (lodash_debounce__WEBPACK_IMPORTED_MODULE_8___default())\n };\n window.store = _store__WEBPACK_IMPORTED_MODULE_10__.default;\n window.router = _router__WEBPACK_IMPORTED_MODULE_11__.default;\n window.apiRoute = _api__WEBPACK_IMPORTED_MODULE_12__.apiRoute;\n window.apiv1 = _api__WEBPACK_IMPORTED_MODULE_12__.apiv1;\n window.api = _api__WEBPACK_IMPORTED_MODULE_12__.api;\n window.MEDUSA = {\n common: {},\n config: {\n general: {},\n layout: {}\n },\n home: {},\n addShows: {}\n };\n window.webRoot = _api__WEBPACK_IMPORTED_MODULE_12__.webRoot;\n window.apiKey = _api__WEBPACK_IMPORTED_MODULE_12__.apiKey; // Push x-template components to this array to register them globally\n\n window.components = [];\n window.components.push((vueisotope__WEBPACK_IMPORTED_MODULE_9___default()));\n}\n\nconst UTIL = {\n exec(controller, action) {\n const ns = MEDUSA;\n action = action === undefined ? 'init' : action;\n\n if (controller !== '' && ns[controller] && typeof ns[controller][action] === 'function') {\n ns[controller][action]();\n }\n },\n\n init() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[v-cloak]').removeAttr('v-cloak');\n const {\n body\n } = document;\n const controller = body.getAttribute('data-controller');\n const action = body.getAttribute('data-action');\n UTIL.exec('common'); // Load common\n\n UTIL.exec(controller); // Load MEDUSA[controller]\n\n UTIL.exec(controller, action); // Load MEDUSA[controller][action]\n\n window.dispatchEvent(new Event('medusa-loaded'));\n }\n\n};\nconst {\n pathname\n} = window.location;\n\nif (!pathname.includes('/login') && !pathname.includes('/apibuilder')) {\n const configLoaded = event => {\n const {\n general,\n layout\n } = event.detail;\n MEDUSA.config.general = { ...MEDUSA.config.general,\n ...general\n };\n const themeSpinner = layout.themeName === 'dark' ? '-dark' : '';\n MEDUSA.config.layout = { ...MEDUSA.config.layout,\n ...layout,\n themeSpinner,\n loading: ''\n };\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).ready(UTIL.init);\n };\n\n window.addEventListener('medusa-config-loaded', configLoaded, {\n once: true\n });\n}\n\n//# sourceURL=webpack://slim/./src/index.js?"); /***/ }) diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index e0f7113c6a..f66db1dd99 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -114,7 +114,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api.js */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _utils_core_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/core.js */ \"./src/utils/core.js\");\n/* harmony import */ var date_fns_format__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! date-fns/format */ \"./node_modules/date-fns/esm/format/index.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vue-js-toggle-button */ \"./node_modules/vue-js-toggle-button/dist/index.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var vue_multiselect__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vue-multiselect */ \"./node_modules/vue-multiselect/dist/vue-multiselect.min.js\");\n/* harmony import */ var vue_multiselect__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(vue_multiselect__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var vue_multiselect_dist_vue_multiselect_min_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vue-multiselect/dist/vue-multiselect.min.css */ \"./node_modules/vue-multiselect/dist/vue-multiselect.min.css\");\n/* harmony import */ var v_tooltip__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! v-tooltip */ \"./node_modules/v-tooltip/dist/v-tooltip.esm.js\");\n/* provided dependency */ var $ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'config-general',\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 CustomLogs: _helpers__WEBPACK_IMPORTED_MODULE_2__.CustomLogs,\n LanguageSelect: _helpers__WEBPACK_IMPORTED_MODULE_2__.LanguageSelect,\n Multiselect: (vue_multiselect__WEBPACK_IMPORTED_MODULE_5___default()),\n SortedSelectList: _helpers__WEBPACK_IMPORTED_MODULE_2__.SortedSelectList,\n VPopover: v_tooltip__WEBPACK_IMPORTED_MODULE_7__.VPopover,\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_2__.StateSwitch,\n ToggleButton: vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_4__.ToggleButton,\n RootDirs: _root_dirs_vue__WEBPACK_IMPORTED_MODULE_1__.default\n },\n directives: {\n tooltip: v_tooltip__WEBPACK_IMPORTED_MODULE_7__.VTooltip\n },\n\n data() {\n const defaultPageOptions = [{\n value: 'home',\n text: 'Shows'\n }, {\n value: 'schedule',\n text: 'Schedule'\n }, {\n value: 'history',\n text: 'History'\n }, {\n value: 'news',\n text: 'News'\n }, {\n value: 'IRC',\n text: 'IRC'\n }];\n const privacyLevelOptions = [{\n value: 'high',\n text: 'HIGH'\n }, {\n value: 'normal',\n text: 'NORMAL'\n }, {\n value: 'low',\n text: 'LOW'\n }];\n return {\n defaultPageOptions,\n privacyLevelOptions,\n resetBranchSelected: null,\n saving: false,\n selectedBranch: '',\n checkoutBranchMessage: ''\n };\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_8__.mapState)({\n general: state => state.config.general,\n configLoaded: state => state.config.consts.statuses.length > 0,\n layout: state => state.config.layout,\n statuses: state => state.config.consts.statuses,\n indexers: state => state.config.indexers,\n system: state => state.config.system,\n gitRemoteBranches: state => state.config.system.gitRemoteBranches // We need the reactivity on this.\n\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_8__.mapGetters)(['getStatus']),\n indexerDefault: {\n get() {\n const {\n general\n } = this;\n const {\n indexerDefault\n } = general;\n return indexerDefault || 0;\n },\n\n set(indexer) {\n // TODO: commit instead\n this.general.indexerDefault = indexer;\n }\n\n },\n\n indexerListOptions() {\n const {\n indexers\n } = this;\n const allIndexers = [{\n text: 'All Indexers',\n value: 0\n }];\n const indexerOptions = Object.values(indexers.indexers).map(indexer => ({\n value: indexer.id,\n text: indexer.name\n }));\n return [...allIndexers, ...indexerOptions];\n },\n\n datePresetOptions() {\n const {\n general\n } = this;\n const {\n datePresets\n } = general;\n const systemDefault = [{\n value: '%x',\n text: 'Use System Default'\n }];\n const formattedDatePresets = datePresets.map(preset => ({\n value: preset,\n text: (0,date_fns_format__WEBPACK_IMPORTED_MODULE_9__.default)(new Date(), (0,_utils_core_js__WEBPACK_IMPORTED_MODULE_3__.convertDateFormat)(preset))\n }));\n return [...systemDefault, ...formattedDatePresets];\n },\n\n timePresetOptions() {\n const {\n general\n } = this;\n const {\n timePresets\n } = general;\n const systemDefault = [{\n value: '%x',\n text: 'Use System Default'\n }];\n const formattedTimePresets = timePresets.map(preset => ({\n value: preset,\n text: (0,date_fns_format__WEBPACK_IMPORTED_MODULE_9__.default)(new Date(), (0,_utils_core_js__WEBPACK_IMPORTED_MODULE_3__.convertDateFormat)(preset))\n }));\n return [...systemDefault, ...formattedTimePresets];\n },\n\n availableThemesOptions() {\n const {\n general\n } = this;\n const {\n availableThemes\n } = general;\n\n if (!availableThemes) {\n return [];\n }\n\n return availableThemes.map(theme => ({\n value: theme.name,\n text: `${theme.name} (${theme.version})`\n }));\n },\n\n cpuPresetOptions() {\n const {\n system\n } = this;\n const {\n cpuPresets\n } = system;\n\n if (!cpuPresets) {\n return [];\n }\n\n return Object.keys(cpuPresets).map(key => ({\n value: key,\n text: key\n }));\n },\n\n defaultDeletedEpOptions() {\n const {\n general,\n getStatus\n } = this;\n let status = [];\n\n if (general.skipRemovedFiles) {\n status = ['skipped', 'ignored'].map(key => getStatus({\n key\n }));\n } else {\n // Get status objects, when skip removed files is enabled\n status = ['skipped', 'ignored', 'archived'].map(key => getStatus({\n key\n }));\n }\n\n if (status.every(x => x !== undefined)) {\n return status.map(status => ({\n text: status.name,\n value: status.value\n }));\n }\n\n return [];\n },\n\n githubRemoteBranchesOptions() {\n const {\n general,\n getGitRemoteBranches,\n gitRemoteBranches\n } = this;\n const {\n username,\n password,\n token\n } = general.git;\n\n if (!gitRemoteBranches.length > 0) {\n getGitRemoteBranches();\n }\n\n let filteredBranches = [];\n\n if ((username && password || token) && general.developer) {\n filteredBranches = gitRemoteBranches;\n } else if (username && password || token) {\n filteredBranches = gitRemoteBranches.filter(branch => ['master', 'develop'].includes(branch));\n } else {\n filteredBranches = gitRemoteBranches.filter(branch => ['master'].includes(branch));\n }\n\n return filteredBranches.map(branch => ({\n text: branch,\n value: branch\n }));\n },\n\n githubTokenPopover() {\n const {\n general\n } = this;\n return '

Copy the generated token and paste it in the token input box.

' + `

` + '


';\n }\n\n },\n methods: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_8__.mapActions)({\n setConfig: 'setConfig',\n setTheme: 'setTheme',\n getApiKey: 'getApiKey',\n setLayoutShow: 'setLayoutShow',\n getGitRemoteBranches: 'getGitRemoteBranches'\n }),\n\n async generateApiKey() {\n const {\n getApiKey,\n save\n } = this;\n\n try {\n await getApiKey();\n this.$snotify.success('Saving and reloading the page, to utilize the new api key', 'Warning', {\n timeout: 5000\n });\n setTimeout(() => {\n // Save the new apiKey. No choice to reload because of /src/api.js\n save();\n }, 500);\n setTimeout(() => {\n // For now we reload the page since the layouts use python still\n location.reload();\n }, 500);\n } catch (error) {\n this.$snotify.error('Error while trying to get a new api key', `Error: ${error}`);\n }\n },\n\n async changeTheme(themeName) {\n const {\n setTheme\n } = this;\n\n try {\n await setTheme({\n themeName\n });\n this.$snotify.success('Saving and reloading the page', 'Saving', {\n timeout: 5000\n });\n setTimeout(() => {\n // Reload the page as we need to reload static content.\n (0,_utils_core_js__WEBPACK_IMPORTED_MODULE_3__.forceBrowserReload)();\n }, 1000);\n } catch (error) {\n this.$snotify.error('Error while trying to change the theme', `Error: ${error}`);\n }\n },\n\n async save() {\n const {\n general,\n layout,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true;\n const {\n availableThemes,\n backlogOverview,\n datePresets,\n loggingLevels,\n logs,\n timePresets,\n randomShowSlug,\n recentShows,\n themeName,\n ...filteredConfig\n } = general;\n const {\n local,\n ...filteredLayout\n } = layout;\n const configMain = {\n section: 'main',\n config: { ...filteredConfig,\n ...{\n layout: filteredLayout\n },\n ...{\n logs: {\n debug: general.logs.debug,\n dbDebug: general.logs.dbDebug,\n actualLogDir: general.logs.actualLogDir,\n nr: general.logs.nr,\n size: general.logs.size,\n subliminalLog: general.logs.subliminalLog,\n privacyLevel: general.logs.privacyLevel\n }\n }\n }\n };\n\n try {\n await setConfig(configMain);\n this.$snotify.success('Saved general config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save general config', `Error: ${error}`);\n } finally {\n this.saving = false;\n }\n },\n\n saveShowListOrder(value) {\n const {\n layout,\n setLayoutShow\n } = this;\n const mergedShowLayout = { ...layout.show,\n ...{\n showListOrder: value.map(item => item.value)\n }\n };\n setLayoutShow(mergedShowLayout);\n },\n\n async compareDBUpgrade() {\n const {\n checkoutBranch,\n selectedBranch\n } = this;\n\n try {\n this.checkoutBranchMessage = 'Checking if the checkout requires a database upgrade / downgrade';\n const result = await _api_js__WEBPACK_IMPORTED_MODULE_0__.apiRoute.get('home/getDBcompare');\n\n if (result.data.status === 'success') {\n if (result.data.message === 'equal') {\n // Checkout Branch\n checkoutBranch();\n }\n\n if (result.data.message === 'upgrade') {\n this.$modal.show('query-upgrade-database', {\n selectedBranch\n });\n }\n\n if (result.data.message === 'downgrade') {\n this.$snotify.error('Can\\'t switch branch as this will result in a database downgrade.', 'Error');\n }\n } else {\n this.$snotify.error('Error while trying to compare db versions for checkout', `Error: ${result.data.status}`);\n }\n } catch (error) {\n console.log(error);\n }\n },\n\n /**\n * Validate if we need a compareDb, or directly checkout.\n *\n * If whe're running a master or develop branch, we check for database changes.\n * This to prepare the user, by showing a few modals.\n * If the user is running another branch like, a feature branch. We asume the user knows what he's doing.\n *\n */\n validateCheckoutBranch() {\n const {\n compareDBUpgrade,\n selectedBranch\n } = this;\n\n if (!selectedBranch) {\n return;\n }\n\n compareDBUpgrade();\n },\n\n async checkoutBranch() {\n const {\n selectedBranch\n } = this;\n this.checkoutBranchMessage = `Checking out branch ${selectedBranch}`;\n await _api_js__WEBPACK_IMPORTED_MODULE_0__.api.post('system/operation', {\n type: 'CHECKOUT_BRANCH',\n branch: selectedBranch\n }, {\n timeout: 120000\n });\n this.checkoutBranchMessage = `Finished checking out branch ${selectedBranch}`;\n setTimeout(() => {\n this.checkoutBranchMessage = '';\n }, 4000);\n this.$modal.show('query-restart');\n },\n\n cancelCheckout() {\n this.checkoutBranchMessage = '';\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/config-general.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api.js */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _utils_core_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/core.js */ \"./src/utils/core.js\");\n/* harmony import */ var date_fns_format__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! date-fns/format */ \"./node_modules/date-fns/esm/format/index.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vue-js-toggle-button */ \"./node_modules/vue-js-toggle-button/dist/index.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var vue_multiselect__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vue-multiselect */ \"./node_modules/vue-multiselect/dist/vue-multiselect.min.js\");\n/* harmony import */ var vue_multiselect__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(vue_multiselect__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var vue_multiselect_dist_vue_multiselect_min_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vue-multiselect/dist/vue-multiselect.min.css */ \"./node_modules/vue-multiselect/dist/vue-multiselect.min.css\");\n/* harmony import */ var v_tooltip__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! v-tooltip */ \"./node_modules/v-tooltip/dist/v-tooltip.esm.js\");\n/* provided dependency */ var $ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'config-general',\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 CustomLogs: _helpers__WEBPACK_IMPORTED_MODULE_2__.CustomLogs,\n LanguageSelect: _helpers__WEBPACK_IMPORTED_MODULE_2__.LanguageSelect,\n Multiselect: (vue_multiselect__WEBPACK_IMPORTED_MODULE_5___default()),\n SortedSelectList: _helpers__WEBPACK_IMPORTED_MODULE_2__.SortedSelectList,\n VPopover: v_tooltip__WEBPACK_IMPORTED_MODULE_7__.VPopover,\n SelectTraktLists: _helpers__WEBPACK_IMPORTED_MODULE_2__.SelectTraktLists,\n StateSwitch: _helpers__WEBPACK_IMPORTED_MODULE_2__.StateSwitch,\n ToggleButton: vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_4__.ToggleButton,\n RootDirs: _root_dirs_vue__WEBPACK_IMPORTED_MODULE_1__.default\n },\n directives: {\n tooltip: v_tooltip__WEBPACK_IMPORTED_MODULE_7__.VTooltip\n },\n\n data() {\n const defaultPageOptions = [{\n value: 'home',\n text: 'Shows'\n }, {\n value: 'schedule',\n text: 'Schedule'\n }, {\n value: 'history',\n text: 'History'\n }, {\n value: 'news',\n text: 'News'\n }, {\n value: 'IRC',\n text: 'IRC'\n }];\n const privacyLevelOptions = [{\n value: 'high',\n text: 'HIGH'\n }, {\n value: 'normal',\n text: 'NORMAL'\n }, {\n value: 'low',\n text: 'LOW'\n }];\n return {\n defaultPageOptions,\n privacyLevelOptions,\n resetBranchSelected: null,\n saving: false,\n selectedBranch: '',\n checkoutBranchMessage: ''\n };\n },\n\n beforeMount() {\n // Wait for the next tick, so the component is rendered\n this.$nextTick(() => {\n $('#config-components').tabs();\n });\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_8__.mapState)({\n general: state => state.config.general,\n configLoaded: state => state.config.consts.statuses.length > 0,\n layout: state => state.config.layout,\n statuses: state => state.config.consts.statuses,\n indexers: state => state.config.indexers,\n system: state => state.config.system,\n gitRemoteBranches: state => state.config.system.gitRemoteBranches // We need the reactivity on this.\n\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_8__.mapGetters)(['getStatus']),\n indexerDefault: {\n get() {\n const {\n general\n } = this;\n const {\n indexerDefault\n } = general;\n return indexerDefault || 0;\n },\n\n set(indexer) {\n // TODO: commit instead\n this.general.indexerDefault = indexer;\n }\n\n },\n\n indexerListOptions() {\n const {\n indexers\n } = this;\n const allIndexers = [{\n text: 'All Indexers',\n value: 0\n }];\n const indexerOptions = Object.values(indexers.indexers).map(indexer => ({\n value: indexer.id,\n text: indexer.name\n }));\n return [...allIndexers, ...indexerOptions];\n },\n\n datePresetOptions() {\n const {\n general\n } = this;\n const {\n datePresets\n } = general;\n const systemDefault = [{\n value: '%x',\n text: 'Use System Default'\n }];\n const formattedDatePresets = datePresets.map(preset => ({\n value: preset,\n text: (0,date_fns_format__WEBPACK_IMPORTED_MODULE_9__.default)(new Date(), (0,_utils_core_js__WEBPACK_IMPORTED_MODULE_3__.convertDateFormat)(preset))\n }));\n return [...systemDefault, ...formattedDatePresets];\n },\n\n timePresetOptions() {\n const {\n general\n } = this;\n const {\n timePresets\n } = general;\n const systemDefault = [{\n value: '%x',\n text: 'Use System Default'\n }];\n const formattedTimePresets = timePresets.map(preset => ({\n value: preset,\n text: (0,date_fns_format__WEBPACK_IMPORTED_MODULE_9__.default)(new Date(), (0,_utils_core_js__WEBPACK_IMPORTED_MODULE_3__.convertDateFormat)(preset))\n }));\n return [...systemDefault, ...formattedTimePresets];\n },\n\n availableThemesOptions() {\n const {\n general\n } = this;\n const {\n availableThemes\n } = general;\n\n if (!availableThemes) {\n return [];\n }\n\n return availableThemes.map(theme => ({\n value: theme.name,\n text: `${theme.name} (${theme.version})`\n }));\n },\n\n cpuPresetOptions() {\n const {\n system\n } = this;\n const {\n cpuPresets\n } = system;\n\n if (!cpuPresets) {\n return [];\n }\n\n return Object.keys(cpuPresets).map(key => ({\n value: key,\n text: key\n }));\n },\n\n defaultDeletedEpOptions() {\n const {\n general,\n getStatus\n } = this;\n let status = [];\n\n if (general.skipRemovedFiles) {\n status = ['skipped', 'ignored'].map(key => getStatus({\n key\n }));\n } else {\n // Get status objects, when skip removed files is enabled\n status = ['skipped', 'ignored', 'archived'].map(key => getStatus({\n key\n }));\n }\n\n if (status.every(x => x !== undefined)) {\n return status.map(status => ({\n text: status.name,\n value: status.value\n }));\n }\n\n return [];\n },\n\n githubRemoteBranchesOptions() {\n const {\n general,\n getGitRemoteBranches,\n gitRemoteBranches\n } = this;\n const {\n username,\n password,\n token\n } = general.git;\n\n if (!gitRemoteBranches.length > 0) {\n getGitRemoteBranches();\n }\n\n let filteredBranches = [];\n\n if ((username && password || token) && general.developer) {\n filteredBranches = gitRemoteBranches;\n } else if (username && password || token) {\n filteredBranches = gitRemoteBranches.filter(branch => ['master', 'develop'].includes(branch));\n } else {\n filteredBranches = gitRemoteBranches.filter(branch => ['master'].includes(branch));\n }\n\n return filteredBranches.map(branch => ({\n text: branch,\n value: branch\n }));\n },\n\n githubTokenPopover() {\n const {\n general\n } = this;\n return '

Copy the generated token and paste it in the token input box.

' + `

` + '


';\n }\n\n },\n methods: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_8__.mapActions)({\n setConfig: 'setConfig',\n setTheme: 'setTheme',\n getApiKey: 'getApiKey',\n setLayoutShow: 'setLayoutShow',\n getGitRemoteBranches: 'getGitRemoteBranches'\n }),\n\n async generateApiKey() {\n const {\n getApiKey,\n save\n } = this;\n\n try {\n await getApiKey();\n this.$snotify.success('Saving and reloading the page, to utilize the new api key', 'Warning', {\n timeout: 5000\n });\n setTimeout(() => {\n // Save the new apiKey. No choice to reload because of /src/api.js\n save();\n }, 500);\n setTimeout(() => {\n // For now we reload the page since the layouts use python still\n location.reload();\n }, 500);\n } catch (error) {\n this.$snotify.error('Error while trying to get a new api key', `Error: ${error}`);\n }\n },\n\n async changeTheme(themeName) {\n const {\n setTheme\n } = this;\n\n try {\n await setTheme({\n themeName\n });\n this.$snotify.success('Saving and reloading the page', 'Saving', {\n timeout: 5000\n });\n setTimeout(() => {\n // Reload the page as we need to reload static content.\n (0,_utils_core_js__WEBPACK_IMPORTED_MODULE_3__.forceBrowserReload)();\n }, 1000);\n } catch (error) {\n this.$snotify.error('Error while trying to change the theme', `Error: ${error}`);\n }\n },\n\n async save() {\n const {\n general,\n layout,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true;\n const {\n availableThemes,\n backlogOverview,\n datePresets,\n loggingLevels,\n logs,\n timePresets,\n randomShowSlug,\n recentShows,\n themeName,\n recommended,\n ...filteredConfig\n } = general;\n const {\n local,\n ...filteredLayout\n } = layout;\n const configMain = {\n section: 'main',\n config: { ...filteredConfig,\n ...{\n layout: filteredLayout\n },\n ...{\n logs: {\n debug: general.logs.debug,\n dbDebug: general.logs.dbDebug,\n actualLogDir: general.logs.actualLogDir,\n nr: general.logs.nr,\n size: general.logs.size,\n subliminalLog: general.logs.subliminalLog,\n privacyLevel: general.logs.privacyLevel\n }\n },\n ...{\n recommended: {\n cache: general.recommended.cache,\n trakt: {\n selectedLists: general.recommended.trakt.selectedLists\n }\n }\n }\n }\n };\n\n try {\n await setConfig(configMain);\n this.$snotify.success('Saved general config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save general config', `Error: ${error}`);\n } finally {\n this.saving = false;\n }\n },\n\n saveShowListOrder(value) {\n const {\n layout,\n setLayoutShow\n } = this;\n const mergedShowLayout = { ...layout.show,\n ...{\n showListOrder: value.map(item => item.value)\n }\n };\n setLayoutShow(mergedShowLayout);\n },\n\n async compareDBUpgrade() {\n const {\n checkoutBranch,\n selectedBranch\n } = this;\n\n try {\n this.checkoutBranchMessage = 'Checking if the checkout requires a database upgrade / downgrade';\n const result = await _api_js__WEBPACK_IMPORTED_MODULE_0__.apiRoute.get('home/getDBcompare');\n\n if (result.data.status === 'success') {\n if (result.data.message === 'equal') {\n // Checkout Branch\n checkoutBranch();\n }\n\n if (result.data.message === 'upgrade') {\n this.$modal.show('query-upgrade-database', {\n selectedBranch\n });\n }\n\n if (result.data.message === 'downgrade') {\n this.$snotify.error('Can\\'t switch branch as this will result in a database downgrade.', 'Error');\n }\n } else {\n this.$snotify.error('Error while trying to compare db versions for checkout', `Error: ${result.data.status}`);\n }\n } catch (error) {\n console.log(error);\n }\n },\n\n /**\n * Validate if we need a compareDb, or directly checkout.\n *\n * If whe're running a master or develop branch, we check for database changes.\n * This to prepare the user, by showing a few modals.\n * If the user is running another branch like, a feature branch. We asume the user knows what he's doing.\n *\n */\n validateCheckoutBranch() {\n const {\n compareDBUpgrade,\n selectedBranch\n } = this;\n\n if (!selectedBranch) {\n return;\n }\n\n compareDBUpgrade();\n },\n\n async checkoutBranch() {\n const {\n selectedBranch\n } = this;\n this.checkoutBranchMessage = `Checking out branch ${selectedBranch}`;\n await _api_js__WEBPACK_IMPORTED_MODULE_0__.api.post('system/operation', {\n type: 'CHECKOUT_BRANCH',\n branch: selectedBranch\n }, {\n timeout: 120000\n });\n this.checkoutBranchMessage = `Finished checking out branch ${selectedBranch}`;\n setTimeout(() => {\n this.checkoutBranchMessage = '';\n }, 4000);\n this.$modal.show('query-restart');\n },\n\n cancelCheckout() {\n this.checkoutBranchMessage = '';\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/config-general.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -213,7 +213,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../router */ \"./src/router/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'app-link',\n props: {\n to: [String, Object],\n href: String,\n indexerId: {\n type: String\n },\n placeholder: {\n type: String,\n default: 'indexer-to-name'\n }\n },\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_1__.mapState)({\n general: state => state.config.general\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_1__.mapGetters)(['indexerIdToName']),\n\n indexerName() {\n // Returns `undefined` if not found\n const {\n indexerId,\n indexerIdToName\n } = this;\n return indexerIdToName(indexerId);\n },\n\n computedBase() {\n return document.querySelector('base').getAttribute('href');\n },\n\n computedHref() {\n const {\n href,\n indexerId,\n placeholder,\n indexerName\n } = this;\n\n if (indexerId && placeholder) {\n return href.replace(placeholder, indexerName);\n }\n\n return href;\n },\n\n isIRC() {\n if (!this.computedHref) {\n return;\n }\n\n return this.computedHref.startsWith('irc://');\n },\n\n isAbsolute() {\n const href = this.computedHref;\n\n if (!href) {\n return;\n }\n\n return /^[a-z][\\d+.a-z-]*:/.test(href);\n },\n\n isExternal() {\n const base = this.computedBase;\n const href = this.computedHref;\n\n if (!href) {\n return;\n }\n\n return !href.startsWith(base) && !href.startsWith('webcal://');\n },\n\n isHashPath() {\n if (!this.computedHref) {\n return;\n }\n\n return this.computedHref.startsWith('#');\n },\n\n anonymisedHref() {\n const {\n anonRedirect\n } = this.general;\n const href = this.computedHref;\n\n if (!href) {\n return;\n }\n\n return anonRedirect ? anonRedirect + href : href;\n },\n\n matchingVueRoute() {\n const {\n isAbsolute,\n isExternal,\n computedHref\n } = this;\n\n if (isAbsolute && isExternal) {\n return;\n }\n\n const {\n route\n } = _router__WEBPACK_IMPORTED_MODULE_0__.default.resolve(_router__WEBPACK_IMPORTED_MODULE_0__.base + computedHref);\n\n if (!route.name) {\n return;\n }\n\n return route;\n },\n\n linkProperties() {\n const {\n to,\n isIRC,\n isAbsolute,\n isExternal,\n isHashPath,\n anonymisedHref,\n matchingVueRoute\n } = this;\n const base = this.computedBase;\n const href = this.computedHref; // Return normal router-link\n\n if (to) {\n return {\n is: 'router-link',\n to\n };\n } // Just return a boring link with other attrs\n // @NOTE: This is for scroll anchors as it uses the id\n\n\n if (!href) {\n return {\n is: 'a',\n // Only tag this as a \"false-link\" if we passed a name in the props\n falseLink: Boolean(this.$attrs.name) || undefined\n };\n } // If current page and next page are both vue routes return router-link\n\n\n if (matchingVueRoute && this.$route && matchingVueRoute.meta.converted && this.$route.meta.converted) {\n // Allows us to skip when we're in a test\n if (window.loadMainApp) {\n return {\n is: 'router-link',\n to: matchingVueRoute.fullPath,\n // Add a `href` attribute to enable native mouse navigation (middle click, ctrl+click, etc.)\n href: new URL(matchingVueRoute.fullPath, base).href\n };\n }\n }\n\n return {\n is: 'a',\n target: isAbsolute && isExternal ? '_blank' : '_self',\n href: (() => {\n if (isHashPath) {\n const {\n location\n } = window;\n\n if (location.hash.length === 0) {\n // Current location might be `url#`\n const newHash = location.href.endsWith('#') ? href.slice(1) : href;\n return location.href + newHash;\n }\n\n return location.href.replace(location.hash, '') + href;\n }\n\n if (isIRC) {\n return href;\n }\n\n if (isAbsolute) {\n if (isExternal) {\n return anonymisedHref;\n }\n\n return href;\n }\n\n return new URL(href, base).href;\n })(),\n rel: isAbsolute && isExternal ? 'noreferrer' : undefined\n };\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/helpers/app-link.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../router */ \"./src/router/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'app-link',\n props: {\n to: [String, Object],\n href: String,\n indexerId: {\n type: String\n },\n placeholder: {\n type: String,\n default: 'indexer-to-name'\n }\n },\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_1__.mapState)({\n general: state => state.config.general\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_1__.mapGetters)(['indexerIdToName']),\n\n indexerName() {\n // Returns `undefined` if not found\n const {\n indexerId,\n indexerIdToName\n } = this;\n return indexerIdToName(indexerId);\n },\n\n computedBase() {\n return document.querySelector('base').getAttribute('href');\n },\n\n computedHref() {\n const {\n href,\n indexerId,\n placeholder,\n indexerName\n } = this;\n\n if (indexerId && placeholder) {\n return href.replace(placeholder, indexerName);\n }\n\n return href;\n },\n\n isIRC() {\n if (!this.computedHref) {\n return;\n }\n\n return this.computedHref.startsWith('irc://');\n },\n\n isAbsolute() {\n const href = this.computedHref;\n\n if (!href) {\n return;\n }\n\n return /^[a-z][\\d+.a-z-]*:/.test(href);\n },\n\n isExternal() {\n const base = this.computedBase;\n const href = this.computedHref;\n\n if (!href) {\n return;\n }\n\n return !href.startsWith(base) && !href.startsWith('webcal://');\n },\n\n isHashPath() {\n if (!this.computedHref) {\n return;\n }\n\n return this.computedHref.startsWith('#');\n },\n\n /**\n * Not used for now as derefer.org is down and there are no suitable replacements.\n * @returns {string} - de-refer service'd url.\n */\n anonymisedHref() {\n const {\n anonRedirect\n } = this.general;\n const href = this.computedHref;\n\n if (!href) {\n return;\n }\n\n return anonRedirect ? anonRedirect + href : href;\n },\n\n matchingVueRoute() {\n const {\n isAbsolute,\n isExternal,\n computedHref\n } = this;\n\n if (isAbsolute && isExternal) {\n return;\n }\n\n const {\n route\n } = _router__WEBPACK_IMPORTED_MODULE_0__.default.resolve(_router__WEBPACK_IMPORTED_MODULE_0__.base + computedHref);\n\n if (!route.name) {\n return;\n }\n\n return route;\n },\n\n linkProperties() {\n const {\n to,\n isIRC,\n isAbsolute,\n isExternal,\n isHashPath,\n matchingVueRoute\n } = this;\n const base = this.computedBase;\n const href = this.computedHref; // Return normal router-link\n\n if (to) {\n return {\n is: 'router-link',\n to\n };\n } // Just return a boring link with other attrs\n // @NOTE: This is for scroll anchors as it uses the id\n\n\n if (!href) {\n return {\n is: 'a',\n // Only tag this as a \"false-link\" if we passed a name in the props\n falseLink: Boolean(this.$attrs.name) || undefined\n };\n } // If current page and next page are both vue routes return router-link\n\n\n if (matchingVueRoute && this.$route && matchingVueRoute.meta.converted && this.$route.meta.converted) {\n // Allows us to skip when we're in a test\n if (window.loadMainApp) {\n return {\n is: 'router-link',\n to: matchingVueRoute.fullPath,\n // Add a `href` attribute to enable native mouse navigation (middle click, ctrl+click, etc.)\n href: new URL(matchingVueRoute.fullPath, base).href\n };\n }\n }\n\n return {\n is: 'a',\n target: isAbsolute && isExternal ? '_blank' : '_self',\n href: (() => {\n if (isHashPath) {\n const {\n location\n } = window;\n\n if (location.hash.length === 0) {\n // Current location might be `url#`\n const newHash = location.href.endsWith('#') ? href.slice(1) : href;\n return location.href + newHash;\n }\n\n return location.href.replace(location.hash, '') + href;\n }\n\n if (isIRC || isAbsolute) {\n return href;\n }\n\n return new URL(href, base).href;\n })(),\n rel: isAbsolute && isExternal ? 'noreferrer noopener' : undefined\n };\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/helpers/app-link.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -224,7 +224,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _app_link_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./app-link.vue */ \"./src/components/helpers/app-link.vue\");\n/* harmony import */ var _lazy_image_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lazy-image.vue */ \"./src/components/helpers/lazy-image.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'asset',\n components: {\n AppLink: _app_link_vue__WEBPACK_IMPORTED_MODULE_1__.default,\n LazyImage: _lazy_image_vue__WEBPACK_IMPORTED_MODULE_2__.default\n },\n props: {\n showSlug: {\n type: String\n },\n type: {\n type: String,\n required: true\n },\n defaultSrc: {\n type: String,\n required: true\n },\n link: {\n type: Boolean,\n default: false\n },\n cls: {\n type: String\n },\n imgWidth: {\n type: Number\n },\n lazy: Boolean\n },\n\n data() {\n return {\n error: false\n };\n },\n\n computed: {\n src() {\n const {\n defaultSrc,\n error,\n showSlug,\n type\n } = this;\n\n if (error || !showSlug || !type) {\n return defaultSrc;\n }\n\n return `${_api__WEBPACK_IMPORTED_MODULE_0__.webRoot}/api/v2/series/${showSlug}/asset/${type}?api_key=${_api__WEBPACK_IMPORTED_MODULE_0__.apiKey}`;\n },\n\n href() {\n const {\n link,\n src\n } = this; // Compute a link to the full asset, if applicable\n\n if (link) {\n return src.replace('Thumb', '');\n }\n\n return undefined;\n },\n\n newCls() {\n const {\n cls,\n imgWidth\n } = this;\n let newClass = cls;\n\n if (imgWidth) {\n newClass += ` width-${imgWidth}`;\n }\n\n return newClass;\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/helpers/asset.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _app_link_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./app-link.vue */ \"./src/components/helpers/app-link.vue\");\n/* harmony import */ var _lazy_image_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lazy-image.vue */ \"./src/components/helpers/lazy-image.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'asset',\n components: {\n AppLink: _app_link_vue__WEBPACK_IMPORTED_MODULE_1__.default,\n LazyImage: _lazy_image_vue__WEBPACK_IMPORTED_MODULE_2__.default\n },\n props: {\n showSlug: String,\n type: {\n type: String,\n required: true\n },\n defaultSrc: {\n type: String,\n required: true\n },\n link: {\n type: Boolean,\n default: false\n },\n cls: String,\n imgWidth: Number,\n lazy: Boolean,\n imgStyle: String\n },\n\n data() {\n return {\n error: false\n };\n },\n\n computed: {\n src() {\n const {\n defaultSrc,\n error,\n showSlug,\n type\n } = this;\n\n if (error || !showSlug || !type) {\n return defaultSrc;\n }\n\n return `${_api__WEBPACK_IMPORTED_MODULE_0__.webRoot}/api/v2/series/${showSlug}/asset/${type}?api_key=${_api__WEBPACK_IMPORTED_MODULE_0__.apiKey}`;\n },\n\n href() {\n const {\n link,\n src\n } = this; // Compute a link to the full asset, if applicable\n\n if (link) {\n return src.replace('Thumb', '');\n }\n\n return undefined;\n },\n\n newCls() {\n const {\n cls,\n imgWidth\n } = this;\n let newClass = cls;\n\n if (imgWidth) {\n newClass += ` width-${imgWidth}`;\n }\n\n return newClass;\n },\n\n newStyle() {\n const {\n imgWidth,\n imgStyle\n } = this;\n let tempStyle = '';\n\n if (imgStyle) {\n tempStyle = imgStyle;\n }\n\n if (imgWidth) {\n tempStyle += `;width=${imgWidth}px`;\n }\n\n return tempStyle;\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/helpers/asset.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -389,7 +389,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var lozad__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lozad */ \"./node_modules/lozad/dist/lozad.min.js\");\n/* harmony import */ var lozad__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lozad__WEBPACK_IMPORTED_MODULE_0__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'lazy-image',\n props: {\n height: {\n type: Number,\n default: null\n },\n lazySrc: {\n type: String,\n default: null\n },\n lazySrcset: {\n type: String,\n default: null\n },\n lazyDefaultSrc: {\n type: String,\n default: null\n },\n lazyCls: {\n type: String,\n default: ''\n },\n width: {\n type: Number,\n default: null\n }\n },\n\n data() {\n return {\n loading: true,\n error: false\n };\n },\n\n computed: {\n aspectRatio() {\n // Calculate the aspect ratio of the image\n // if the width and the height are given.\n if (!this.width || !this.height) {\n return null;\n }\n\n return this.height / this.width * 100;\n },\n\n style() {\n const style = {};\n\n if (this.width) {\n style.width = `${this.width}px`;\n } // If the image is still loading and an\n // aspect ratio could be calculated, we\n // apply the calculated aspect ratio by\n // using padding top.\n\n\n const applyAspectRatio = this.loading && this.aspectRatio;\n\n if (applyAspectRatio) {\n // Prevent flash of unstyled image\n // after the image is loaded.\n style.height = 0; // Scale the image container according\n // to the aspect ratio.\n\n style.paddingTop = `${this.aspectRatio}%`;\n }\n\n return style;\n }\n\n },\n\n mounted() {\n // As soon as the element triggers\n // the `load` event, the loading state is\n // set to `false`, which removes the apsect\n // ratio we've applied earlier.\n const setLoadingState = () => {\n this.loading = false;\n };\n\n this.$el.addEventListener('load', setLoadingState); // We remove the event listener as soon as\n // the component is destroyed to prevent\n // potential memory leaks.\n\n this.$once('hook:destroyed', () => {\n this.$el.removeEventListener('load', setLoadingState);\n }); // We initialize Lozad.js on the root\n // element of our component.\n\n const observer = lozad__WEBPACK_IMPORTED_MODULE_0___default()(this.$el, {\n loaded: el => {\n el.classList.add('loaded');\n const img = new Image();\n img.src = el.getAttribute('data-src');\n img.addEventListener('error', () => {\n el.classList.add('error');\n\n if (this.lazyDefaultSrc) {\n el.setAttribute('src', this.lazyDefaultSrc);\n }\n }, false);\n }\n });\n observer.observe();\n },\n\n methods: {\n observe() {\n // We initialize Lozad.js on the root\n // element of our component.\n const observer = lozad__WEBPACK_IMPORTED_MODULE_0___default()(this.$el);\n observer.observe();\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/helpers/lazy-image.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var lozad__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lozad */ \"./node_modules/lozad/dist/lozad.min.js\");\n/* harmony import */ var lozad__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lozad__WEBPACK_IMPORTED_MODULE_0__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'lazy-image',\n props: {\n lazyWidth: {\n type: Number,\n default: null\n },\n lazyHeight: {\n type: Number,\n default: null\n },\n lazySrc: {\n type: String,\n default: null\n },\n lazySrcset: {\n type: String,\n default: null\n },\n lazyDefaultSrc: {\n type: String,\n default: null\n },\n lazyCls: {\n type: String,\n default: ''\n }\n },\n\n data() {\n return {\n loading: true,\n error: false\n };\n },\n\n computed: {\n aspectRatio() {\n // Calculate the aspect ratio of the image\n // if the width and the height are given.\n if (!this.width || !this.height) {\n return null;\n }\n\n return this.height / this.width * 100;\n },\n\n style() {\n const style = {};\n const {\n lazyWidth\n } = this;\n\n if (lazyWidth) {\n style.width = `${lazyWidth}px`;\n } // If the image is still loading and an\n // aspect ratio could be calculated, we\n // apply the calculated aspect ratio by\n // using padding top.\n\n\n const applyAspectRatio = this.loading && this.aspectRatio;\n\n if (applyAspectRatio) {\n // Prevent flash of unstyled image\n // after the image is loaded.\n style.height = 0; // Scale the image container according\n // to the aspect ratio.\n\n style.paddingTop = `${this.aspectRatio}%`;\n }\n\n return style;\n }\n\n },\n\n mounted() {\n // As soon as the element triggers\n // the `load` event, the loading state is\n // set to `false`, which removes the apsect\n // ratio we've applied earlier.\n const setLoadingState = () => {\n this.loading = false;\n };\n\n this.$el.addEventListener('load', setLoadingState); // We remove the event listener as soon as\n // the component is destroyed to prevent\n // potential memory leaks.\n\n this.$once('hook:destroyed', () => {\n this.$el.removeEventListener('load', setLoadingState);\n }); // We initialize Lozad.js on the root\n // element of our component.\n\n const observer = lozad__WEBPACK_IMPORTED_MODULE_0___default()(this.$el, {\n loaded: el => {\n el.classList.add('loaded');\n const img = new Image();\n img.src = el.getAttribute('data-src');\n img.addEventListener('error', () => {\n el.classList.add('error');\n\n if (this.lazyDefaultSrc) {\n el.setAttribute('src', this.lazyDefaultSrc);\n }\n }, false);\n }\n });\n observer.observe();\n },\n\n methods: {\n observe() {\n // We initialize Lozad.js on the root\n // element of our component.\n const observer = lozad__WEBPACK_IMPORTED_MODULE_0___default()(this.$el);\n observer.observe();\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/helpers/lazy-image.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -503,6 +503,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/select-trakt-lists.vue?vue&type=script&lang=js&": +/*!*****************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/select-trakt-lists.vue?vue&type=script&lang=js& ***! + \*****************************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'select-trakt-list',\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_0__.mapState)({\n availableLists: state => state.config.general.recommended.trakt.availableLists,\n selectedLists: state => state.config.general.recommended.trakt.selectedLists,\n general: state => state.config.general\n })\n },\n methods: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_0__.mapActions)(['setTraktSelectedLists']),\n\n saveLists(event, currentList) {\n const {\n selectedLists,\n setTraktSelectedLists\n } = this;\n const isChecked = event.currentTarget.checked; // Add to list\n\n if (isChecked && !selectedLists.includes(currentList)) {\n selectedLists.push(currentList);\n } // Remove from list\n\n\n const newList = selectedLists.filter(list => list !== currentList || currentList && isChecked);\n setTraktSelectedLists(newList);\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/helpers/select-trakt-lists.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/show-selector.vue?vue&type=script&lang=js&": /*!************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/show-selector.vue?vue&type=script&lang=js& ***! @@ -547,6 +558,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/trakt-authentication.vue?vue&type=script&lang=js&": +/*!*******************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/trakt-authentication.vue?vue&type=script&lang=js& ***! + \*******************************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* provided dependency */ var $ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: {\n ConfigToggleSlider: ___WEBPACK_IMPORTED_MODULE_0__.ConfigToggleSlider,\n ConfigTemplate: ___WEBPACK_IMPORTED_MODULE_0__.ConfigTemplate,\n ConfigTextboxNumber: ___WEBPACK_IMPORTED_MODULE_0__.ConfigTextboxNumber,\n ConfigTextbox: ___WEBPACK_IMPORTED_MODULE_0__.ConfigTextbox\n },\n props: {\n authOnly: Boolean\n },\n\n data() {\n return {\n traktRequestSend: false,\n traktRequestAuthenticated: false,\n traktUserCode: '',\n traktRequestMessage: '',\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 saving: false,\n testTraktResult: 'Click below to test.',\n traktBlacklistClass: ''\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapState)({\n indexers: state => state.config.indexers,\n trakt: state => state.config.notifiers.trakt\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 methods: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapActions)(['setConfig']),\n\n async TraktRequestDeviceCode() {\n this.traktUserCode = '';\n this.traktRequestAuthenticated = false;\n const response = await (0,_api__WEBPACK_IMPORTED_MODULE_1__.apiRoute)('home/requestTraktDeviceCodeOauth');\n\n if (response.data) {\n this.traktVerificationUrl = response.data.verification_url;\n window.open(response.data.verification_url, 'popUp', 'toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550');\n this.traktRequestSend = true;\n this.traktUserCode = response.data.user_code;\n this.checkTraktAuthenticated();\n }\n },\n\n checkTraktAuthenticated() {\n let counter = 0;\n const i = setInterval(() => {\n (0,_api__WEBPACK_IMPORTED_MODULE_1__.apiRoute)('home/checkTrakTokenOauth').then(response => {\n if (response.data) {\n this.traktRequestMessage = response.data.result;\n\n if (!response.data.error) {\n clearInterval(i);\n this.traktRequestAuthenticated = true;\n this.traktUserCode = '';\n }\n }\n });\n counter++;\n\n if (counter === 12) {\n clearInterval(i);\n this.traktRequestAuthenticated = false;\n this.traktUserCode = '';\n }\n }, 5000);\n },\n\n testTrakt() {\n const {\n trakt\n } = this;\n const {\n blacklistName\n } = trakt;\n\n if (/\\s/g.test(blacklistName)) {\n this.testTraktResult = 'Check blacklist name; the value needs to be a trakt slug';\n this.traktBlacklistClass = 'warning';\n return;\n }\n\n this.traktBlacklistClass = ''; // $('#testTrakt-result').html(MEDUSA.config.layout.loading);\n\n (0,_api__WEBPACK_IMPORTED_MODULE_1__.apiRoute)(`home/testTrakt?blacklist_name=${blacklistName}`).then(result => {\n this.testTraktResult = result.data; // $('#testTrakt').prop('disabled', false);\n });\n },\n\n traktForceSync() {\n // $('#testTrakt-result').html(MEDUSA.config.layout.loading);\n $.getJSON('home/forceTraktSync', data => {\n this.testTraktResult = data.result;\n });\n },\n\n async save() {\n const {\n trakt,\n setConfig\n } = this; // Disable the save button until we're done.\n\n this.saving = true;\n const section = 'main';\n const config = {\n notifiers: {\n trakt\n }\n };\n\n try {\n await setConfig({\n section,\n config\n });\n this.$snotify.success('Saved Trakt config', 'Saved', {\n timeout: 5000\n });\n } catch (error) {\n this.$snotify.error('Error while trying to save Trakt config', 'Error');\n } finally {\n this.saving = false;\n }\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/helpers/trakt-authentication.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-compact.vue?vue&type=script&lang=js&": /*!******************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-compact.vue?vue&type=script&lang=js& ***! @@ -642,7 +664,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'manage-searches',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__.AppLink\n },\n\n data() {\n return {\n sceneExceptions: [{\n id: 'local',\n name: \"Medusa's\",\n url: 'https://github.com/pymedusa/Medusa/wiki/Scene-exceptions-and-numbering',\n lastRefresh: ''\n }, {\n id: 'xem',\n name: 'XEM',\n url: 'http://thexem.de',\n lastRefresh: ''\n }, {\n id: 'anidb',\n name: 'AniDB',\n url: '',\n lastRefresh: ''\n }],\n sceneRefresh: {\n inProgress: true,\n showSpinner: false,\n message: ''\n }\n };\n },\n\n computed: { // @TODO: Replace with mapState\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapState)({\n general: state => state.config.general,\n system: state => state.config.system,\n search: state => state.config.search,\n queueItems: state => state.queue.queueitems\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapGetters)({\n getQueueItemsByName: 'getQueueItemsByName'\n }),\n\n spinnerSrc() {\n const {\n general\n } = this;\n const {\n themeName\n } = general;\n const themeSpinner = themeName === 'dark' ? '-dark' : '';\n return 'images/loading32' + themeSpinner + '.gif';\n },\n\n schedulerStatus() {\n const {\n getQueueItemsByName,\n system\n } = this;\n const {\n schedulers\n } = system;\n\n if (schedulers.length === 0) {\n return;\n }\n\n const backlog = schedulers.find(scheduler => scheduler.key === 'backlog');\n const daily = schedulers.find(scheduler => scheduler.key === 'dailySearch');\n const proper = schedulers.find(scheduler => scheduler.key === 'properFinder');\n const search = schedulers.find(scheduler => scheduler.key === 'searchQueue');\n const forcedSearch = schedulers.find(scheduler => scheduler.key === 'forcedSearchQueue');\n const subtitles = schedulers.find(scheduler => scheduler.key === 'subtitlesFinder');\n const downloadHandler = schedulers.find(scheduler => scheduler.key === 'downloadHandler');\n const downloadHanlderQueueItems = getQueueItemsByName('DOWNLOADHANDLER');\n\n if (downloadHanlderQueueItems.length > 0) {\n // Found a queueitem from the DOWNLOADHANDLER. Check last item for an isActive state.\n const lastItem = downloadHanlderQueueItems.slice(-1);\n downloadHandler.isActive = lastItem[0].isActive;\n }\n\n return {\n backlogPaused: backlog.isEnabled === 'Paused',\n backlogRunning: backlog.isActive,\n dailySearchStatus: daily.isActive,\n searchQueueLength: search.queueLength,\n forcedSearchQueueLength: forcedSearch.queueLength,\n subtitlesFinderStatus: subtitles.isActive,\n properSearchStatus: proper.isActive,\n downloadHandlerStatus: downloadHandler.isActive\n };\n }\n\n },\n methods: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapActions)({\n getConfig: 'getConfig'\n }),\n\n /**\n * Trigger the force refresh of all the exception types.\n */\n forceSceneExceptionRefresh() {\n const {\n updateExceptionData,\n sceneRefresh\n } = this; // Start a spinner.\n\n sceneRefresh.showSpinner = true;\n sceneRefresh.inProgress = true;\n sceneRefresh.message = 'Retrieving scene exceptions...';\n _api__WEBPACK_IMPORTED_MODULE_0__.api.post('alias-source/all/operation', {\n type: 'REFRESH'\n }, {\n timeout: 60000\n }).then(() => {\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get('alias-source').then(response => {\n updateExceptionData(response.data);\n }).catch(error => {\n console.error('Trying to get scene exceptions failed with error: ' + error);\n sceneRefresh.showSpinner = false;\n sceneRefresh.inProgress = false;\n sceneRefresh.message = 'Trying to get scene exceptions failed with error: ' + error;\n });\n sceneRefresh.message = 'Finished updating scene exceptions.';\n }).catch(error => {\n console.error('Trying to update scene exceptions failed with error: ' + error);\n sceneRefresh.message = 'Trying to update scene exceptions failed with error: ' + error;\n sceneRefresh.inProgress = false;\n }).finally(() => {\n sceneRefresh.showSpinner = false;\n });\n },\n\n /**\n * Get total number current scene exceptions per source. Will request medusa, xem and anidb name exceptions.\n * @param {Object[]} exceptions - A list of exception types with their last updates.\n * @param {string} exceptions[].id - The name of the scene exception source.\n * @param {number} exceptions[].lastRefresh - The last update of the scene exception source as a timestamp.\n */\n updateExceptionData(exceptions) {\n const {\n sceneExceptions,\n sceneRefresh\n } = this;\n\n for (const type of ['local', 'xem', 'anidb']) {\n const data = exceptions.find(obj => obj.id === type);\n const exception = sceneExceptions.find(item => item.id === type);\n exception.lastRefresh = new Date(data.lastRefresh * 1000).toLocaleDateString();\n }\n\n sceneRefresh.inProgress = false;\n },\n\n forceBacklog() {\n _api__WEBPACK_IMPORTED_MODULE_0__.api.put('search/backlog');\n },\n\n forceDaily() {\n _api__WEBPACK_IMPORTED_MODULE_0__.api.put('search/daily');\n },\n\n forceFindPropers() {\n _api__WEBPACK_IMPORTED_MODULE_0__.api.put('search/proper');\n },\n\n forceSubtitlesFinder() {\n _api__WEBPACK_IMPORTED_MODULE_0__.api.put('search/subtitles');\n },\n\n toggleBacklog() {\n const {\n schedulerStatus\n } = this;\n _api__WEBPACK_IMPORTED_MODULE_0__.api.put('search/backlog', {\n options: {\n paused: !schedulerStatus.backlogPaused\n }\n }); // eslint-disable-line no-undef\n },\n\n forceDownloadHandler() {\n _api__WEBPACK_IMPORTED_MODULE_0__.api.post('system/operation', {\n type: 'FORCEADH'\n });\n }\n\n },\n\n mounted() {\n // Initially load the exception types last updates on page load.\n const {\n updateExceptionData\n } = this;\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get('alias-source').then(response => {\n updateExceptionData(response.data);\n }).catch(error => {\n console.error('Trying to get scene exceptions failed with error: ' + error);\n });\n },\n\n watch: {\n queueItems() {\n const {\n getConfig\n } = this;\n getConfig('system');\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/manage-searches.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'manage-searches',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__.AppLink\n },\n\n data() {\n return {\n sceneExceptions: [{\n id: 'local',\n name: \"Medusa's\",\n url: 'https://github.com/pymedusa/Medusa/wiki/Scene-exceptions-and-numbering',\n lastRefresh: ''\n }, {\n id: 'xem',\n name: 'XEM',\n url: 'http://thexem.de',\n lastRefresh: ''\n }, {\n id: 'anidb',\n name: 'AniDB',\n url: '',\n lastRefresh: ''\n }],\n sceneRefresh: {\n inProgress: true,\n showSpinner: false,\n message: ''\n }\n };\n },\n\n computed: { // @TODO: Replace with mapState\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapState)({\n general: state => state.config.general,\n system: state => state.config.system,\n search: state => state.config.search,\n queueItems: state => state.queue.queueitems\n }),\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapGetters)({\n getQueueItemsByName: 'getQueueItemsByName'\n }),\n\n spinnerSrc() {\n const {\n general\n } = this;\n const {\n themeName\n } = general;\n const themeSpinner = themeName === 'dark' ? '-dark' : '';\n return 'images/loading32' + themeSpinner + '.gif';\n },\n\n schedulerStatus() {\n const {\n getQueueItemsByName,\n system\n } = this;\n const {\n schedulers\n } = system;\n\n if (schedulers.length === 0) {\n return;\n }\n\n const backlog = schedulers.find(scheduler => scheduler.key === 'backlog');\n const daily = schedulers.find(scheduler => scheduler.key === 'dailySearch');\n const proper = schedulers.find(scheduler => scheduler.key === 'properFinder');\n const search = schedulers.find(scheduler => scheduler.key === 'searchQueue');\n const forcedSearch = schedulers.find(scheduler => scheduler.key === 'forcedSearchQueue');\n const subtitles = schedulers.find(scheduler => scheduler.key === 'subtitlesFinder');\n const downloadHandler = schedulers.find(scheduler => scheduler.key === 'downloadHandler');\n const downloadHanlderQueueItems = getQueueItemsByName('DOWNLOADHANDLER');\n\n if (downloadHanlderQueueItems.length > 0) {\n // Found a queueitem from the DOWNLOADHANDLER. Check last item for an isActive state.\n const lastItem = downloadHanlderQueueItems.slice(-1);\n downloadHandler.isActive = lastItem[0].isActive;\n }\n\n return {\n backlogPaused: backlog.isEnabled === 'Paused',\n backlogRunning: backlog.isActive,\n dailySearchStatus: daily.isActive,\n searchQueueLength: search.queueLength,\n forcedSearchQueueLength: forcedSearch.queueLength,\n subtitlesFinderStatus: subtitles.isActive,\n properSearchStatus: proper.isActive,\n downloadHandlerStatus: downloadHandler.isActive\n };\n }\n\n },\n methods: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapActions)({\n getConfig: 'getConfig'\n }),\n\n /**\n * Trigger the force refresh of all the exception types.\n */\n forceSceneExceptionRefresh() {\n const {\n updateExceptionData,\n sceneRefresh\n } = this; // Start a spinner.\n\n sceneRefresh.showSpinner = true;\n sceneRefresh.inProgress = true;\n sceneRefresh.message = 'Retrieving scene exceptions...';\n _api__WEBPACK_IMPORTED_MODULE_0__.api.post('alias-source/all/operation', {\n type: 'REFRESH'\n }, {\n timeout: 60000\n }).then(() => {\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get('alias-source').then(response => {\n updateExceptionData(response.data);\n }).catch(error => {\n console.error('Trying to get scene exceptions failed with error: ' + error);\n sceneRefresh.showSpinner = false;\n sceneRefresh.inProgress = false;\n sceneRefresh.message = 'Trying to get scene exceptions failed with error: ' + error;\n });\n sceneRefresh.message = 'Finished updating scene exceptions.';\n }).catch(error => {\n console.error('Trying to update scene exceptions failed with error: ' + error);\n sceneRefresh.message = 'Trying to update scene exceptions failed with error: ' + error;\n sceneRefresh.inProgress = false;\n }).finally(() => {\n sceneRefresh.showSpinner = false;\n });\n },\n\n /**\n * Get total number current scene exceptions per source. Will request medusa, xem and anidb name exceptions.\n * @param {Object[]} exceptions - A list of exception types with their last updates.\n * @param {string} exceptions[].id - The name of the scene exception source.\n * @param {number} exceptions[].lastRefresh - The last update of the scene exception source as a timestamp.\n */\n updateExceptionData(exceptions) {\n const {\n sceneExceptions,\n sceneRefresh\n } = this;\n\n for (const type of ['local', 'xem', 'anidb']) {\n const data = exceptions.find(obj => obj.id === type);\n const exception = sceneExceptions.find(item => item.id === type);\n exception.lastRefresh = new Date(data.lastRefresh * 1000).toLocaleDateString();\n }\n\n sceneRefresh.inProgress = false;\n },\n\n forceBacklog() {\n _api__WEBPACK_IMPORTED_MODULE_0__.api.put('search/backlog');\n },\n\n forceDaily() {\n _api__WEBPACK_IMPORTED_MODULE_0__.api.put('search/daily');\n },\n\n forceFindPropers() {\n _api__WEBPACK_IMPORTED_MODULE_0__.api.put('search/proper');\n },\n\n forceSubtitlesFinder() {\n _api__WEBPACK_IMPORTED_MODULE_0__.api.put('search/subtitles');\n },\n\n toggleBacklog() {\n const {\n schedulerStatus\n } = this;\n _api__WEBPACK_IMPORTED_MODULE_0__.api.put('search/backlog', {\n options: {\n paused: !schedulerStatus.backlogPaused\n }\n }); // eslint-disable-line no-undef\n },\n\n forceDownloadHandler() {\n _api__WEBPACK_IMPORTED_MODULE_0__.api.post('system/operation', {\n type: 'FORCEADH'\n });\n },\n\n async searchRecommendedShows(source) {\n try {\n await _api__WEBPACK_IMPORTED_MODULE_0__.api.post(`recommended/${source}`);\n this.$snotify.success('Started search for new recommended shows', `Searching ${source}`);\n } catch (error) {\n if (error.response.status === 409) {\n this.$snotify.error(error.response.data.error, 'Error');\n }\n }\n }\n\n },\n\n mounted() {\n // Initially load the exception types last updates on page load.\n const {\n updateExceptionData\n } = this;\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get('alias-source').then(response => {\n updateExceptionData(response.data);\n }).catch(error => {\n console.error('Trying to get scene exceptions failed with error: ' + error);\n });\n },\n\n watch: {\n queueItems() {\n const {\n getConfig\n } = this;\n getConfig('system');\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/manage-searches.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -686,7 +708,29 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! . */ \"./src/components/index.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_4__ = __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_4___default = /*#__PURE__*/__webpack_require__.n(vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vue-js-toggle-button */ \"./node_modules/vue-js-toggle-button/dist/index.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_5__);\n/* provided dependency */ var $ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: {\n AddShowOptions: ___WEBPACK_IMPORTED_MODULE_2__.AddShowOptions,\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_3__.AppLink,\n RootDirs: _root_dirs_vue__WEBPACK_IMPORTED_MODULE_1__.default,\n ToggleButton: vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_5__.ToggleButton,\n VTab: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_4__.VTab,\n VueTabs: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_4__.VueTabs\n },\n\n data() {\n return {\n // @FIXME: Python conversions (fix when config is loaded before routes)\n // indexers: ${json.dumps(indexers)},\n isLoading: false,\n requestTimeout: 3 * 60 * 1000,\n errorMessage: '',\n rootDirs: [],\n dirList: [],\n useCustomizeOptions: false,\n promptForSettings: false,\n enableAnimeOptions: true,\n presetShowOptions: {\n subtitles: null,\n status: null,\n statusAfter: null,\n seasonFolders: null,\n anime: null,\n scene: null,\n release: {\n blacklist: [],\n whitelist: []\n },\n quality: {\n allowed: [],\n preferred: []\n },\n showLists: []\n },\n addShowComponents: {},\n // An array of mounted new-show.vue components.\n addedShowQueueItems: []\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_6__.mapState)({\n config: state => state.config.general,\n // Used by `inc_addShowOptions.mako`\n indexers: state => state.config.indexers,\n indexerDefault: state => state.config.general.indexerDefault,\n queueitems: state => state.shows.queueitems\n }),\n\n selectedRootDirs() {\n return this.rootDirs.filter(rd => rd.selected);\n },\n\n filteredDirList() {\n return this.dirList.filter(dir => !dir.alreadyAdded);\n },\n\n displayPaths() {\n // Mark the root dir as bold in the path\n const appendSepChar = path => {\n const sepChar = (() => {\n if (path.includes('\\\\')) {\n return '\\\\';\n }\n\n if (path.includes('/')) {\n return '/';\n }\n\n return '';\n })();\n\n return path.slice(-1) === sepChar ? path : path + sepChar;\n };\n\n return this.filteredDirList.map(dir => {\n const rootDirObj = this.rootDirs.find(rd => dir.path.startsWith(rd.path));\n\n if (!rootDirObj) {\n return dir.path;\n }\n\n const rootDir = appendSepChar(rootDirObj.path);\n const rdEndIndex = dir.path.indexOf(rootDir) + rootDir.length;\n return '' + dir.path.slice(0, rdEndIndex) + '' + dir.path.slice(rdEndIndex);\n });\n },\n\n showTable() {\n const {\n isLoading,\n selectedRootDirs,\n errorMessage\n } = this;\n return !isLoading && selectedRootDirs.length !== 0 && errorMessage === '';\n },\n\n checkAll: {\n get() {\n const selectedDirList = this.filteredDirList.filter(dir => dir.selected);\n\n if (selectedDirList.length === 0) {\n return false;\n }\n\n return selectedDirList.length === this.filteredDirList.length;\n },\n\n set(newValue) {\n this.dirList = this.dirList.map(dir => {\n dir.selected = newValue;\n return dir;\n });\n }\n\n },\n\n indexerListOptions() {\n const {\n indexers\n } = this;\n const allIndexers = [{\n text: 'All Indexers',\n value: 0\n }];\n const indexerOptions = Object.values(indexers.indexers).map(indexer => ({\n value: indexer.id,\n text: indexer.name\n }));\n return [...allIndexers, ...indexerOptions];\n }\n\n },\n methods: {\n indexExist(index) {\n return this.addShowComponents[`curdirindex-${index}`] === undefined;\n },\n\n /**\n * Transform root dirs paths array, and select all the paths.\n * @param {string[]} paths - The root dir paths\n */\n rootDirsPathsUpdated(paths) {\n this.rootDirs = paths.map(path => {\n return {\n selected: true,\n path\n };\n });\n },\n\n update() {\n const {\n indexerDefault\n } = this;\n\n if (this.isLoading) {\n return;\n }\n\n this.isLoading = true;\n this.errorMessage = '';\n const indices = this.rootDirs.reduce((indices, rd, index) => {\n if (rd.selected) {\n indices.push(index);\n }\n\n return indices;\n }, []);\n\n if (indices.length === 0) {\n this.dirList = [];\n this.isLoading = false;\n return;\n }\n\n const config = {\n params: {\n rootDirs: indices.join(',')\n },\n timeout: this.requestTimeout\n };\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get('internal/existingSeries', config).then(response => {\n const {\n data\n } = response;\n this.dirList = data.map(dir => {\n // Pre-select all dirs not already added\n dir.selected = !dir.alreadyAdded;\n dir.selectedIndexer = dir.metadata.indexer || indexerDefault;\n return dir;\n });\n this.isLoading = false;\n this.$nextTick(() => {\n $('#addRootDirTable').tablesorter({\n widgets: ['zebra'],\n // This fixes the checkAll checkbox getting unbound because this code changes the innerHTML of the \n // https://github.com/Mottie/tablesorter/blob/v2.28.1/js/jquery.tablesorter.js#L566\n headerTemplate: '',\n headers: {\n 0: {\n sorter: false\n },\n 3: {\n sorter: false\n }\n }\n }) // Fixes tablesorter not working after root dirs are refreshed\n .trigger('updateAll');\n });\n }).catch(error => {\n this.errorMessage = error.message;\n this.dirList = [];\n this.isLoading = false;\n });\n },\n\n seriesIndexerUrl(curDir) {\n const {\n showUrl\n } = Object.values(this.indexers.indexers).find(indexer => indexer.id === curDir.metadata.indexer);\n return `${showUrl}${curDir.metadata.seriesId}`;\n },\n\n /**\n * Loop through the selected shows and open an add-show dialog, if needed.\n * Or add unattended if possible.\n *\n * @returns {void}\n */\n submitSeriesDirs() {\n const dirList = this.filteredDirList.filter(dir => dir.selected);\n\n if (dirList.length === 0) {\n return false;\n }\n\n for (const [curDirIndex] of dirList.entries()) {\n // Loop through the existing shows.\n this.openAddNewShow(curDirIndex, true);\n }\n },\n\n updateOptions(options) {\n // Update seleted options from add-show-options.vue @change event.\n this.presetShowOptions.subtitles = options.subtitles;\n this.presetShowOptions.status = options.status;\n this.presetShowOptions.statusAfter = options.statusAfter;\n this.presetShowOptions.seasonFolders = options.seasonFolders;\n this.presetShowOptions.anime = options.anime;\n this.presetShowOptions.scene = options.scene;\n this.presetShowOptions.release.blacklist = options.release.blacklist;\n this.presetShowOptions.release.whitelist = options.release.whitelist;\n this.presetShowOptions.quality.allowed = options.quality.allowed;\n this.presetShowOptions.quality.preferred = options.quality.preferred;\n this.presetShowOptions.showLists = options.showLists;\n },\n\n /**\n * Mount the new-show.vue component and provide nfo info if available.\n * @param {number} curDirIndex - Index of the looped filteredDirList array.\n * @param {boolean} unattended - true if shows should be added without prompting for show options.\n */\n openAddNewShow(curDirIndex, unattended = false) {\n const {\n addShowComponents,\n filteredDirList,\n presetShowOptions,\n promptForSettings\n } = this;\n const curDir = filteredDirList[curDirIndex];\n const providedInfo = {\n use: false,\n showId: 0,\n showName: '',\n showDir: curDir.path,\n indexerId: 0,\n indexerLanguage: 'en',\n curDirIndex,\n // Add so we can return it with the matching queueitem. This allows us to keep track.\n // If promptForSettings is enabled, negate out the unattended flag if enabled.\n unattended: unattended && !promptForSettings // Passed as a flag, to auto add the show if enabled.\n\n };\n\n if (curDir.metadata.indexer) {\n providedInfo.indexerId = curDir.metadata.indexer;\n }\n\n if (curDir.metadata.seriesId) {\n providedInfo.showId = curDir.metadata.seriesId;\n }\n\n if (curDir.metadata.seriesName) {\n providedInfo.showName = curDir.metadata.seriesName;\n }\n\n providedInfo.use = Boolean(providedInfo.indexerId !== 0 && providedInfo.showId !== 0 && providedInfo.showName);\n const propsData = {\n providedInfo\n };\n\n if (this.useCustomizeOptions) {\n // Is useCustomizeOptions is enabled. The preset options are used.\n propsData.presetShowOptions = presetShowOptions;\n propsData.presetShowOptions.use = true;\n }\n\n const NewShowClass = vue__WEBPACK_IMPORTED_MODULE_7__.default.extend(___WEBPACK_IMPORTED_MODULE_2__.NewShow);\n const instance = new NewShowClass({\n propsData,\n parent: this\n }); // Bind the 'added' event, as through that we receive the addShow queueitem.\n\n instance.$on('added', queueitem => {\n this.addedShowQueueItems.push(queueitem);\n this.closeAddShowComponent(queueitem.providedInfo.curDirIndex);\n }); // Need these, because we want it to span the width of the parent table row.\n\n const row = document.createElement('tr');\n row.style.columnSpan = 'all';\n const cell = document.createElement('td');\n cell.setAttribute('colspan', '9999');\n const wrapper = document.createElement('div'); // Just used to mount on.\n\n row.append(cell);\n cell.append(wrapper);\n this.$refs[`curdirindex-${curDirIndex}`][0].after(row);\n instance.$mount(wrapper);\n vue__WEBPACK_IMPORTED_MODULE_7__.default.set(addShowComponents, `curdirindex-${curDirIndex}`, instance);\n },\n\n closeAddShowComponent(index) {\n const {\n addShowComponents\n } = this;\n addShowComponents[`curdirindex-${index}`].$destroy(); // Remove the element from the DOM\n\n addShowComponents[`curdirindex-${index}`].$el.closest('tr').remove();\n vue__WEBPACK_IMPORTED_MODULE_7__.default.set(addShowComponents, `curdirindex-${index}`, undefined);\n }\n\n },\n watch: {\n selectedRootDirs() {\n this.update();\n },\n\n queueitems(queueItem) {\n const {\n addedShowQueueItems\n } = this;\n\n for (const [index, addedItem] of addedShowQueueItems.entries()) {\n const foundItem = queueItem.find(item => item.identifier === addedItem.identifier);\n\n if (foundItem) {\n // Merge the data\n vue__WEBPACK_IMPORTED_MODULE_7__.default.set(this.addedShowQueueItems, index, { ...addedItem,\n ...foundItem\n });\n }\n }\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/new-shows-existing.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! . */ \"./src/components/index.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_4__ = __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_4___default = /*#__PURE__*/__webpack_require__.n(vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vue-js-toggle-button */ \"./node_modules/vue-js-toggle-button/dist/index.js\");\n/* harmony import */ var vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_5__);\n/* provided dependency */ var $ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: {\n AddShowOptions: ___WEBPACK_IMPORTED_MODULE_2__.AddShowOptions,\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_3__.AppLink,\n RootDirs: _root_dirs_vue__WEBPACK_IMPORTED_MODULE_1__.default,\n ToggleButton: vue_js_toggle_button__WEBPACK_IMPORTED_MODULE_5__.ToggleButton,\n VTab: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_4__.VTab,\n VueTabs: vue_nav_tabs_dist_vue_tabs_js__WEBPACK_IMPORTED_MODULE_4__.VueTabs\n },\n\n data() {\n return {\n isLoading: false,\n requestTimeout: 3 * 60 * 1000,\n errorMessage: '',\n rootDirs: [],\n dirList: [],\n useCustomizeOptions: false,\n promptForSettings: false,\n enableAnimeOptions: true,\n presetShowOptions: {\n subtitles: null,\n status: null,\n statusAfter: null,\n seasonFolders: null,\n anime: null,\n scene: null,\n release: {\n blacklist: [],\n whitelist: []\n },\n quality: {\n allowed: [],\n preferred: []\n },\n showLists: []\n },\n addShowComponents: {},\n // An array of mounted new-show.vue components.\n addedShowQueueItems: []\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_6__.mapState)({\n indexers: state => state.config.indexers,\n indexerDefault: state => state.config.general.indexerDefault,\n queueitems: state => state.shows.queueitems\n }),\n\n selectedRootDirs() {\n return this.rootDirs.filter(rd => rd.selected);\n },\n\n filteredDirList() {\n return this.dirList.filter(dir => !dir.alreadyAdded);\n },\n\n displayPaths() {\n // Mark the root dir as bold in the path\n const appendSepChar = path => {\n const sepChar = (() => {\n if (path.includes('\\\\')) {\n return '\\\\';\n }\n\n if (path.includes('/')) {\n return '/';\n }\n\n return '';\n })();\n\n return path.slice(-1) === sepChar ? path : path + sepChar;\n };\n\n return this.filteredDirList.map(dir => {\n const rootDirObj = this.rootDirs.find(rd => dir.path.startsWith(rd.path));\n\n if (!rootDirObj) {\n return dir.path;\n }\n\n const rootDir = appendSepChar(rootDirObj.path);\n const rdEndIndex = dir.path.indexOf(rootDir) + rootDir.length;\n return '' + dir.path.slice(0, rdEndIndex) + '' + dir.path.slice(rdEndIndex);\n });\n },\n\n showTable() {\n const {\n isLoading,\n selectedRootDirs,\n errorMessage\n } = this;\n return !isLoading && selectedRootDirs.length !== 0 && errorMessage === '';\n },\n\n checkAll: {\n get() {\n const selectedDirList = this.filteredDirList.filter(dir => dir.selected);\n\n if (selectedDirList.length === 0) {\n return false;\n }\n\n return selectedDirList.length === this.filteredDirList.length;\n },\n\n set(newValue) {\n this.dirList = this.dirList.map(dir => {\n dir.selected = newValue;\n return dir;\n });\n }\n\n },\n\n indexerListOptions() {\n const {\n indexers\n } = this;\n const allIndexers = [{\n text: 'All Indexers',\n value: 0\n }];\n const indexerOptions = Object.values(indexers.indexers).map(indexer => ({\n value: indexer.id,\n text: indexer.name\n }));\n return [...allIndexers, ...indexerOptions];\n }\n\n },\n methods: {\n indexExist(index) {\n return this.addShowComponents[`curdirindex-${index}`] === undefined;\n },\n\n /**\n * Transform root dirs paths array, and select all the paths.\n * @param {string[]} paths - The root dir paths\n */\n rootDirsPathsUpdated(paths) {\n this.rootDirs = paths.map(path => {\n return {\n selected: true,\n path\n };\n });\n },\n\n update() {\n const {\n indexerDefault\n } = this;\n\n if (this.isLoading) {\n return;\n }\n\n this.isLoading = true;\n this.errorMessage = '';\n const indices = this.rootDirs.reduce((indices, rd, index) => {\n if (rd.selected) {\n indices.push(index);\n }\n\n return indices;\n }, []);\n\n if (indices.length === 0) {\n this.dirList = [];\n this.isLoading = false;\n return;\n }\n\n const config = {\n params: {\n rootDirs: indices.join(',')\n },\n timeout: this.requestTimeout\n };\n _api__WEBPACK_IMPORTED_MODULE_0__.api.get('internal/existingSeries', config).then(response => {\n const {\n data\n } = response;\n this.dirList = data.map(dir => {\n // Pre-select all dirs not already added\n dir.selected = !dir.alreadyAdded;\n dir.selectedIndexer = dir.metadata.indexer || indexerDefault;\n return dir;\n });\n this.isLoading = false;\n this.$nextTick(() => {\n $('#addRootDirTable').tablesorter({\n widgets: ['zebra'],\n // This fixes the checkAll checkbox getting unbound because this code changes the innerHTML of the \n // https://github.com/Mottie/tablesorter/blob/v2.28.1/js/jquery.tablesorter.js#L566\n headerTemplate: '',\n headers: {\n 0: {\n sorter: false\n },\n 3: {\n sorter: false\n }\n }\n }) // Fixes tablesorter not working after root dirs are refreshed\n .trigger('updateAll');\n });\n }).catch(error => {\n this.errorMessage = error.message;\n this.dirList = [];\n this.isLoading = false;\n });\n },\n\n seriesIndexerUrl(curDir) {\n const {\n showUrl\n } = Object.values(this.indexers.indexers).find(indexer => indexer.id === curDir.metadata.indexer);\n return `${showUrl}${curDir.metadata.seriesId}`;\n },\n\n /**\n * Loop through the selected shows and open an add-show dialog, if needed.\n * Or add unattended if possible.\n *\n * @returns {void}\n */\n submitSeriesDirs() {\n const dirList = this.filteredDirList.filter(dir => dir.selected);\n\n if (dirList.length === 0) {\n return false;\n }\n\n for (const [curDirIndex] of dirList.entries()) {\n // Loop through the existing shows.\n this.openAddNewShow(curDirIndex, true);\n }\n },\n\n updateOptions(options) {\n // Update seleted options from add-show-options.vue @change event.\n this.presetShowOptions.subtitles = options.subtitles;\n this.presetShowOptions.status = options.status;\n this.presetShowOptions.statusAfter = options.statusAfter;\n this.presetShowOptions.seasonFolders = options.seasonFolders;\n this.presetShowOptions.anime = options.anime;\n this.presetShowOptions.scene = options.scene;\n this.presetShowOptions.release.blacklist = options.release.blacklist;\n this.presetShowOptions.release.whitelist = options.release.whitelist;\n this.presetShowOptions.quality.allowed = options.quality.allowed;\n this.presetShowOptions.quality.preferred = options.quality.preferred;\n this.presetShowOptions.showLists = options.showLists;\n },\n\n /**\n * Mount the new-show.vue component and provide nfo info if available.\n * @param {number} curDirIndex - Index of the looped filteredDirList array.\n * @param {boolean} unattended - true if shows should be added without prompting for show options.\n */\n openAddNewShow(curDirIndex, unattended = false) {\n const {\n addShowComponents,\n filteredDirList,\n presetShowOptions,\n promptForSettings\n } = this;\n const curDir = filteredDirList[curDirIndex];\n const providedInfo = {\n use: false,\n showId: 0,\n showName: '',\n showDir: curDir.path,\n indexerId: 0,\n indexerLanguage: 'en',\n curDirIndex,\n // Add so we can return it with the matching queueitem. This allows us to keep track.\n // If promptForSettings is enabled, negate out the unattended flag if enabled.\n unattended: unattended && !promptForSettings // Passed as a flag, to auto add the show if enabled.\n\n };\n\n if (curDir.metadata.indexer) {\n providedInfo.indexerId = curDir.metadata.indexer;\n }\n\n if (curDir.metadata.seriesId) {\n providedInfo.showId = curDir.metadata.seriesId;\n }\n\n if (curDir.metadata.seriesName) {\n providedInfo.showName = curDir.metadata.seriesName;\n }\n\n providedInfo.use = Boolean(providedInfo.indexerId !== 0 && providedInfo.showId !== 0 && providedInfo.showName);\n const propsData = {\n providedInfo\n };\n\n if (this.useCustomizeOptions) {\n // Is useCustomizeOptions is enabled. The preset options are used.\n propsData.presetShowOptions = presetShowOptions;\n propsData.presetShowOptions.use = true;\n }\n\n const NewShowClass = vue__WEBPACK_IMPORTED_MODULE_7__.default.extend(___WEBPACK_IMPORTED_MODULE_2__.NewShow);\n const instance = new NewShowClass({\n propsData,\n parent: this\n }); // Bind the 'added' event, as through that we receive the addShow queueitem.\n\n instance.$on('added', queueitem => {\n this.addedShowQueueItems.push(queueitem);\n this.closeAddShowComponent(queueitem.providedInfo.curDirIndex);\n }); // Need these, because we want it to span the width of the parent table row.\n\n const row = document.createElement('tr');\n row.style.columnSpan = 'all';\n const cell = document.createElement('td');\n cell.setAttribute('colspan', '9999');\n const wrapper = document.createElement('div'); // Just used to mount on.\n\n row.append(cell);\n cell.append(wrapper);\n this.$refs[`curdirindex-${curDirIndex}`][0].after(row);\n instance.$mount(wrapper);\n vue__WEBPACK_IMPORTED_MODULE_7__.default.set(addShowComponents, `curdirindex-${curDirIndex}`, instance);\n },\n\n closeAddShowComponent(index) {\n const {\n addShowComponents\n } = this;\n addShowComponents[`curdirindex-${index}`].$destroy(); // Remove the element from the DOM\n\n addShowComponents[`curdirindex-${index}`].$el.closest('tr').remove();\n vue__WEBPACK_IMPORTED_MODULE_7__.default.set(addShowComponents, `curdirindex-${index}`, undefined);\n }\n\n },\n watch: {\n selectedRootDirs() {\n this.update();\n },\n\n queueitems(queueItem) {\n const {\n addedShowQueueItems\n } = this;\n\n for (const [index, addedItem] of addedShowQueueItems.entries()) {\n const foundItem = queueItem.find(item => item.identifier === addedItem.identifier);\n\n if (foundItem) {\n // Merge the data\n vue__WEBPACK_IMPORTED_MODULE_7__.default.set(this.addedShowQueueItems, index, { ...addedItem,\n ...foundItem\n });\n }\n }\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/new-shows-existing.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended-poster.vue?vue&type=script&lang=js&": +/*!*********************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended-poster.vue?vue&type=script&lang=js& ***! + \*********************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'recommended-poster',\n components: {\n Asset: _helpers__WEBPACK_IMPORTED_MODULE_1__.Asset,\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__.AppLink\n },\n props: {\n show: {\n type: Object,\n required: true\n }\n },\n\n data() {\n return {\n displayPlot: false,\n selectedAddShowOption: 'search'\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapState)({\n traktConfig: state => state.recommended.trakt,\n externals: state => state.recommended.externals\n })\n },\n methods: {\n addShow(show) {\n const {\n selectedAddShowOption\n } = this;\n\n if (selectedAddShowOption === 'search') {\n // Route to the add-new-show.vue component, with the show's title.\n this.$router.push({\n name: 'addNewShow',\n params: {\n providedInfo: {\n showName: show.title\n }\n }\n });\n return;\n }\n\n let showId = null;\n\n if (Object.keys(show.externals).length !== 0 && show.externals[selectedAddShowOption + '_id']) {\n showId = {\n [selectedAddShowOption]: show.externals[selectedAddShowOption + '_id']\n };\n }\n\n if (this.addShowById(showId)) {\n show.showInLibrary = true;\n }\n },\n\n /**\n * Add by show id.\n * @param {number} showId - Show id.\n */\n async addShowById(showId) {\n const {\n enableShowOptions,\n selectedShowOptions\n } = this;\n const options = {};\n\n if (enableShowOptions) {\n options.options = selectedShowOptions;\n }\n\n try {\n await _api__WEBPACK_IMPORTED_MODULE_0__.api.post('series', {\n id: showId,\n options\n });\n this.$snotify.success('Adding new show to library', 'Saved', {\n timeout: 20000\n });\n return true;\n } catch (error) {\n this.$snotify.error('Error while trying to add new show', 'Error');\n }\n\n return false;\n },\n\n blacklistTrakt(show) {\n show.trakt.blacklisted = true;\n (0,_api__WEBPACK_IMPORTED_MODULE_0__.apiRoute)(`addShows/addShowToBlacklist?seriesid=${show.externals.tvdb_id}`);\n },\n\n addShowOptions(show) {\n const {\n externals\n } = show;\n\n if (show.isAnime) {\n return [{\n text: 'Tvdb',\n value: 'tvdb_id'\n }];\n }\n\n const options = []; // Add through the add-new-show.vue component\n\n options.push({\n text: 'search show',\n value: 'search'\n });\n\n for (const external in externals) {\n if (['tvdb_id', 'tmdb_id', 'tvmaze_id'].includes(external)) {\n const externalName = external.split('_')[0];\n options.push({\n text: externalName,\n value: externalName\n });\n }\n }\n\n return options;\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/recommended-poster.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended.vue?vue&type=script&lang=js&": +/*!**************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended.vue?vue&type=script&lang=js& ***! + \**************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vanilla-lazyload */ \"./node_modules/vanilla-lazyload/dist/lazyload.min.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(vanilla_lazyload__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api.js */ \"./src/api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _add_show_options_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./add-show-options.vue */ \"./src/components/add-show-options.vue\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n/* harmony import */ var _recommended_poster_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./recommended-poster.vue */ \"./src/components/recommended-poster.vue\");\n/* harmony import */ var vueisotope__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vueisotope */ \"./node_modules/vueisotope/dist/vue_isotope.min.js\");\n/* harmony import */ var vueisotope__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(vueisotope__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _fortawesome_vue_fontawesome__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @fortawesome/vue-fontawesome */ \"./node_modules/@fortawesome/vue-fontawesome/index.es.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/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'recommended',\n components: {\n AddShowOptions: _add_show_options_vue__WEBPACK_IMPORTED_MODULE_2__.default,\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_3__.ConfigTemplate,\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_3__.ConfigToggleSlider,\n FontAwesomeIcon: _fortawesome_vue_fontawesome__WEBPACK_IMPORTED_MODULE_6__.FontAwesomeIcon,\n RecommendedPoster: _recommended_poster_vue__WEBPACK_IMPORTED_MODULE_4__.default,\n TraktAuthentication: _helpers__WEBPACK_IMPORTED_MODULE_3__.TraktAuthentication,\n Isotope: (vueisotope__WEBPACK_IMPORTED_MODULE_5___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 data() {\n const IMDB = 10;\n const ANIDB = 11;\n const TRAKT = 12;\n const ANILIST = 13;\n const externals = {\n IMDB,\n ANIDB,\n TRAKT,\n ANILIST\n };\n const sourceToString = {\n [externals.IMDB]: 'imdb',\n [externals.ANIDB]: 'anidb',\n [externals.TRAKT]: 'trakt',\n [externals.ANILIST]: 'anilist'\n };\n const sortOptions = [{\n text: 'Name',\n value: 'name'\n }, {\n text: 'Original',\n value: 'original'\n }, {\n text: 'Votes',\n value: 'votes'\n }, {\n text: '% Rating',\n value: 'rating'\n }, {\n text: '% Rating > Votes',\n value: 'rating_votes'\n }];\n const sortDirectionOptions = [{\n text: 'Ascending',\n value: 'asc'\n }, {\n text: 'Descending',\n value: 'desc'\n }];\n return {\n externals,\n sourceToString,\n sortOptions,\n sortDirectionOptions,\n sortOptionsValue: 'original',\n sortDirectionOptionsValue: 'desc',\n filterOption: null,\n filterShows: '',\n configLoaded: false,\n rootDirs: [],\n enableShowOptions: false,\n selectedShowOptions: {\n subtitles: null,\n status: null,\n statusAfter: null,\n seasonFolders: null,\n anime: null,\n scene: null,\n release: {\n blacklist: [],\n whitelist: []\n },\n quality: {\n allowed: [],\n preferred: []\n }\n },\n sourceOptions: [{\n text: 'Anidb',\n value: externals.ANIDB\n }, {\n text: 'IMDB',\n value: externals.IMDB\n }, {\n text: 'Trakt',\n value: externals.TRAKT\n }, {\n text: 'AniList',\n value: externals.ANILIST\n }, {\n text: 'all',\n value: -1\n }],\n selectedSource: 10,\n selectedList: '',\n // Isotope stuff\n selected: null,\n option: {\n getSortData: {\n id: 'seriesId',\n title: itemElem => {\n return itemElem.title.toLowerCase();\n },\n rating: 'rating',\n votes: 'votes'\n },\n getFilterData: {\n filterByText: itemElem => {\n return itemElem.title.toLowerCase().includes(this.filterShows.toLowerCase());\n }\n },\n sortBy: 'votes',\n layoutMode: 'fitRows',\n sortAscending: false\n },\n showTraktAuthDialog: false,\n traktWarning: false,\n traktWarningMessage: '',\n showsLoaded: false\n };\n },\n\n mounted() {\n const {\n getRecommendedShows\n } = this;\n getRecommendedShows().then(() => {\n this.showsLoaded = true;\n this.$nextTick(() => {\n this.isotopeLayout();\n });\n });\n this.$once('loaded', () => {\n this.configLoaded = true;\n });\n this.$watch('recommendedLists', () => {\n this.setSelectedList(this.selectedSource);\n });\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_7__.mapState)({\n config: state => state.config,\n trakt: state => state.config.notifiers.trakt,\n recommendedShows: state => state.recommended.shows,\n traktConfig: state => state.recommended.trakt,\n recommendedLists: state => state.recommended.categories,\n queueitems: state => state.queue.queueitems\n }),\n\n filteredShowsByList() {\n const {\n imgLazyLoad,\n recommendedShows,\n selectedSource,\n selectedList\n } = this;\n let filteredList = null;\n\n if (selectedSource === -1) {\n return recommendedShows;\n }\n\n filteredList = recommendedShows.filter(show => show.source === selectedSource);\n\n if (selectedList) {\n filteredList = filteredList.filter(show => show.subcat === selectedList);\n }\n\n this.$nextTick(() => {\n // This is needed for now.\n imgLazyLoad.update();\n });\n return filteredList;\n },\n\n imgLazyLoad() {\n console.log('imgLazyLoad object constructud!');\n return new (vanilla_lazyload__WEBPACK_IMPORTED_MODULE_0___default())({\n // Example of options object -> see options section\n threshold: 500\n });\n },\n\n listOptions() {\n const {\n recommendedLists,\n selectedSource\n } = this;\n const sourceLists = recommendedLists[selectedSource] || [];\n return sourceLists.map(list => ({\n text: list,\n value: list\n }));\n }\n\n },\n methods: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_7__.mapActions)({\n getRecommendedShows: 'getRecommendedShows'\n }),\n\n containerClass(show) {\n let classes = 'recommended-container default-poster show-row';\n const {\n traktConfig\n } = this;\n const {\n removedFromMedusa\n } = traktConfig;\n\n if (show.showInLibrary) {\n classes += ' show-in-list';\n }\n\n if (removedFromMedusa.includes(show.externals.tvdb_id)) {\n classes += ' removed-from-medusa';\n }\n\n return classes;\n },\n\n isotopeLayout() {\n const {\n imgLazyLoad\n } = this;\n console.log('isotope Layout loaded');\n imgLazyLoad.update();\n },\n\n updateOptions(options) {\n // Update seleted options from add-show-options.vue @change event.\n const {\n anime,\n scene,\n seasonFolders,\n status,\n subtitles,\n statusAfter,\n release,\n quality\n } = options;\n const {\n blacklist,\n whitelist\n } = release;\n const {\n allowed,\n preferred\n } = quality;\n this.selectedShowOptions.subtitles = subtitles;\n this.selectedShowOptions.status = status;\n this.selectedShowOptions.statusAfter = statusAfter;\n this.selectedShowOptions.seasonFolders = seasonFolders;\n this.selectedShowOptions.anime = anime;\n this.selectedShowOptions.scene = scene;\n this.selectedShowOptions.release.blacklist = blacklist;\n this.selectedShowOptions.release.whitelist = whitelist;\n this.selectedShowOptions.quality.allowed = allowed;\n this.selectedShowOptions.quality.preferred = preferred;\n },\n\n sort() {\n const mapped = {\n original: 'original-order',\n rating: 'rating',\n votes: 'votes',\n name: 'title',\n rating_votes: ['rating', 'votes'] // eslint-disable-line camelcase\n\n };\n const {\n option: isotopeOptions,\n sortOptionsValue\n } = this;\n this.option.sortBy = mapped[sortOptionsValue];\n this.$refs.filteredShows.arrange(isotopeOptions);\n },\n\n filter(key) {\n this.$refs.filteredShows.filter(key);\n this.filterOption = key;\n },\n\n sortDirection() {\n const {\n option: isotopeOptions,\n sortDirectionOptionsValue\n } = this;\n this.option.sortAscending = sortDirectionOptionsValue === 'asc';\n this.$refs.filteredShows.arrange(isotopeOptions);\n },\n\n setSelectedList(selectedSource) {\n const {\n recommendedLists,\n selectedList\n } = this;\n const listOptions = recommendedLists[selectedSource];\n\n if (!listOptions) {\n return;\n }\n\n if (selectedList === '' || !listOptions.includes(selectedList)) {\n this.selectedList = listOptions[0];\n }\n },\n\n async searchRecommendedShows() {\n const {\n sourceToString,\n selectedSource\n } = this;\n const source = sourceToString[selectedSource];\n\n try {\n await _api_js__WEBPACK_IMPORTED_MODULE_1__.api.post(`recommended/${source}`);\n this.$snotify.success('Started search for new recommended shows', `Searching ${source}`);\n } catch (error) {\n if (error.response.status === 409) {\n this.$snotify.error(error.response.data.error, 'Error');\n }\n }\n }\n\n },\n watch: {\n selectedSource(newValue) {\n this.setSelectedList(newValue);\n\n if (newValue === this.externals.TRAKT) {\n const {\n trakt\n } = this;\n\n if (!trakt.enabled) {\n this.traktWarning = true;\n this.traktWarningMessage = 'You havent enabled trakt yet.';\n return;\n }\n\n (0,_api_js__WEBPACK_IMPORTED_MODULE_1__.apiRoute)('home/testTrakt').then(result => {\n if (result.data !== 'Test notice sent successfully to Trakt') {\n // Ask user if he wants to setup trakt authentication.\n this.traktWarning = true;\n this.traktWarningMessage = 'We could not authenticate to trakt. Do you want to set this up now?';\n }\n });\n }\n },\n\n queueitems(queueItems) {\n // Check for a new recommended show queue item and refresh results.\n if (queueItems.filter(item => item.name.includes('UPDATE-RECOMMENDED'))) {\n this.getRecommendedShows();\n }\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/recommended.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -939,7 +983,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"AppLink\": () => (/* reexport safe */ _app_link_vue__WEBPACK_IMPORTED_MODULE_0__.default),\n/* harmony export */ \"Asset\": () => (/* reexport safe */ _asset_vue__WEBPACK_IMPORTED_MODULE_1__.default),\n/* harmony export */ \"ConfigSceneExceptions\": () => (/* reexport safe */ _config_scene_exceptions_vue__WEBPACK_IMPORTED_MODULE_2__.default),\n/* harmony export */ \"ConfigTemplate\": () => (/* reexport safe */ _config_template_vue__WEBPACK_IMPORTED_MODULE_3__.default),\n/* harmony export */ \"ConfigTextbox\": () => (/* reexport safe */ _config_textbox_vue__WEBPACK_IMPORTED_MODULE_4__.default),\n/* harmony export */ \"ConfigTextboxNumber\": () => (/* reexport safe */ _config_textbox_number_vue__WEBPACK_IMPORTED_MODULE_5__.default),\n/* harmony export */ \"ConfigToggleSlider\": () => (/* reexport safe */ _config_toggle_slider_vue__WEBPACK_IMPORTED_MODULE_6__.default),\n/* harmony export */ \"ConfigCustomNewznab\": () => (/* reexport safe */ _config_custom_newznab_vue__WEBPACK_IMPORTED_MODULE_7__.default),\n/* harmony export */ \"ConfigCustomProwlarr\": () => (/* reexport safe */ _config_custom_prowlarr_vue__WEBPACK_IMPORTED_MODULE_8__.default),\n/* harmony export */ \"ConfigCustomTorrentrss\": () => (/* reexport safe */ _config_custom_torrentrss_vue__WEBPACK_IMPORTED_MODULE_9__.default),\n/* harmony export */ \"ConfigCustomTorznab\": () => (/* reexport safe */ _config_custom_torznab_vue__WEBPACK_IMPORTED_MODULE_10__.default),\n/* harmony export */ \"ConfigProviderNzb\": () => (/* reexport safe */ _config_provider_nzb_vue__WEBPACK_IMPORTED_MODULE_11__.default),\n/* harmony export */ \"ConfigProviderTorrent\": () => (/* reexport safe */ _config_provider_torrent_vue__WEBPACK_IMPORTED_MODULE_12__.default),\n/* harmony export */ \"CustomLogs\": () => (/* reexport safe */ _custom_logs_vue__WEBPACK_IMPORTED_MODULE_13__.default),\n/* harmony export */ \"FileBrowser\": () => (/* reexport safe */ _file_browser_vue__WEBPACK_IMPORTED_MODULE_14__.default),\n/* harmony export */ \"LanguageSelect\": () => (/* reexport safe */ _language_select_vue__WEBPACK_IMPORTED_MODULE_15__.default),\n/* harmony export */ \"LoadProgressBar\": () => (/* reexport safe */ _load_progress_bar_vue__WEBPACK_IMPORTED_MODULE_16__.default),\n/* harmony export */ \"NamePattern\": () => (/* reexport safe */ _name_pattern_vue__WEBPACK_IMPORTED_MODULE_17__.default),\n/* harmony export */ \"PlotInfo\": () => (/* reexport safe */ _plot_info_vue__WEBPACK_IMPORTED_MODULE_18__.default),\n/* harmony export */ \"ProgressBar\": () => (/* reexport safe */ _progress_bar_vue__WEBPACK_IMPORTED_MODULE_19__.default),\n/* harmony export */ \"PosterSizeSlider\": () => (/* reexport safe */ _poster_size_slider_vue__WEBPACK_IMPORTED_MODULE_20__.default),\n/* harmony export */ \"QualityChooser\": () => (/* reexport safe */ _quality_chooser_vue__WEBPACK_IMPORTED_MODULE_21__.default),\n/* harmony export */ \"QualityPill\": () => (/* reexport safe */ _quality_pill_vue__WEBPACK_IMPORTED_MODULE_22__.default),\n/* harmony export */ \"ScrollButtons\": () => (/* reexport safe */ _scroll_buttons_vue__WEBPACK_IMPORTED_MODULE_23__.default),\n/* harmony export */ \"Search\": () => (/* reexport safe */ _search_vue__WEBPACK_IMPORTED_MODULE_24__.default),\n/* harmony export */ \"SelectList\": () => (/* reexport safe */ _select_list_vue__WEBPACK_IMPORTED_MODULE_25__.default),\n/* harmony export */ \"ShowSelector\": () => (/* reexport safe */ _show_selector_vue__WEBPACK_IMPORTED_MODULE_26__.default),\n/* harmony export */ \"SortedSelectList\": () => (/* reexport safe */ _sorted_select_list_vue__WEBPACK_IMPORTED_MODULE_27__.default),\n/* harmony export */ \"StateSwitch\": () => (/* reexport safe */ _state_switch_vue__WEBPACK_IMPORTED_MODULE_28__.default),\n/* harmony export */ \"TestProvider\": () => (/* reexport safe */ _test_provider_vue__WEBPACK_IMPORTED_MODULE_29__.default)\n/* harmony export */ });\n/* harmony import */ var _app_link_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app-link.vue */ \"./src/components/helpers/app-link.vue\");\n/* harmony import */ var _asset_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./asset.vue */ \"./src/components/helpers/asset.vue\");\n/* harmony import */ var _config_scene_exceptions_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./config-scene-exceptions.vue */ \"./src/components/helpers/config-scene-exceptions.vue\");\n/* harmony import */ var _config_template_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./config-template.vue */ \"./src/components/helpers/config-template.vue\");\n/* harmony import */ var _config_textbox_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./config-textbox.vue */ \"./src/components/helpers/config-textbox.vue\");\n/* harmony import */ var _config_textbox_number_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config-textbox-number.vue */ \"./src/components/helpers/config-textbox-number.vue\");\n/* harmony import */ var _config_toggle_slider_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./config-toggle-slider.vue */ \"./src/components/helpers/config-toggle-slider.vue\");\n/* harmony import */ var _config_custom_newznab_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./config-custom-newznab.vue */ \"./src/components/helpers/config-custom-newznab.vue\");\n/* harmony import */ var _config_custom_prowlarr_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./config-custom-prowlarr.vue */ \"./src/components/helpers/config-custom-prowlarr.vue\");\n/* harmony import */ var _config_custom_torrentrss_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./config-custom-torrentrss.vue */ \"./src/components/helpers/config-custom-torrentrss.vue\");\n/* harmony import */ var _config_custom_torznab_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./config-custom-torznab.vue */ \"./src/components/helpers/config-custom-torznab.vue\");\n/* harmony import */ var _config_provider_nzb_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./config-provider-nzb.vue */ \"./src/components/helpers/config-provider-nzb.vue\");\n/* harmony import */ var _config_provider_torrent_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./config-provider-torrent.vue */ \"./src/components/helpers/config-provider-torrent.vue\");\n/* harmony import */ var _custom_logs_vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./custom-logs.vue */ \"./src/components/helpers/custom-logs.vue\");\n/* harmony import */ var _file_browser_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./file-browser.vue */ \"./src/components/helpers/file-browser.vue\");\n/* harmony import */ var _language_select_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./language-select.vue */ \"./src/components/helpers/language-select.vue\");\n/* harmony import */ var _load_progress_bar_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./load-progress-bar.vue */ \"./src/components/helpers/load-progress-bar.vue\");\n/* harmony import */ var _name_pattern_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./name-pattern.vue */ \"./src/components/helpers/name-pattern.vue\");\n/* harmony import */ var _plot_info_vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./plot-info.vue */ \"./src/components/helpers/plot-info.vue\");\n/* harmony import */ var _progress_bar_vue__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./progress-bar.vue */ \"./src/components/helpers/progress-bar.vue\");\n/* harmony import */ var _poster_size_slider_vue__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./poster-size-slider.vue */ \"./src/components/helpers/poster-size-slider.vue\");\n/* harmony import */ var _quality_chooser_vue__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./quality-chooser.vue */ \"./src/components/helpers/quality-chooser.vue\");\n/* harmony import */ var _quality_pill_vue__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _scroll_buttons_vue__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./scroll-buttons.vue */ \"./src/components/helpers/scroll-buttons.vue\");\n/* harmony import */ var _search_vue__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./search.vue */ \"./src/components/helpers/search.vue\");\n/* harmony import */ var _select_list_vue__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./select-list.vue */ \"./src/components/helpers/select-list.vue\");\n/* harmony import */ var _show_selector_vue__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./show-selector.vue */ \"./src/components/helpers/show-selector.vue\");\n/* harmony import */ var _sorted_select_list_vue__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./sorted-select-list.vue */ \"./src/components/helpers/sorted-select-list.vue\");\n/* harmony import */ var _state_switch_vue__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./state-switch.vue */ \"./src/components/helpers/state-switch.vue\");\n/* harmony import */ var _test_provider_vue__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./test-provider.vue */ \"./src/components/helpers/test-provider.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//# sourceURL=webpack://slim/./src/components/helpers/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"AppLink\": () => (/* reexport safe */ _app_link_vue__WEBPACK_IMPORTED_MODULE_0__.default),\n/* harmony export */ \"Asset\": () => (/* reexport safe */ _asset_vue__WEBPACK_IMPORTED_MODULE_1__.default),\n/* harmony export */ \"ConfigSceneExceptions\": () => (/* reexport safe */ _config_scene_exceptions_vue__WEBPACK_IMPORTED_MODULE_2__.default),\n/* harmony export */ \"ConfigTemplate\": () => (/* reexport safe */ _config_template_vue__WEBPACK_IMPORTED_MODULE_3__.default),\n/* harmony export */ \"ConfigTextbox\": () => (/* reexport safe */ _config_textbox_vue__WEBPACK_IMPORTED_MODULE_4__.default),\n/* harmony export */ \"ConfigTextboxNumber\": () => (/* reexport safe */ _config_textbox_number_vue__WEBPACK_IMPORTED_MODULE_5__.default),\n/* harmony export */ \"ConfigToggleSlider\": () => (/* reexport safe */ _config_toggle_slider_vue__WEBPACK_IMPORTED_MODULE_6__.default),\n/* harmony export */ \"ConfigCustomNewznab\": () => (/* reexport safe */ _config_custom_newznab_vue__WEBPACK_IMPORTED_MODULE_7__.default),\n/* harmony export */ \"ConfigCustomProwlarr\": () => (/* reexport safe */ _config_custom_prowlarr_vue__WEBPACK_IMPORTED_MODULE_8__.default),\n/* harmony export */ \"ConfigCustomTorrentrss\": () => (/* reexport safe */ _config_custom_torrentrss_vue__WEBPACK_IMPORTED_MODULE_9__.default),\n/* harmony export */ \"ConfigCustomTorznab\": () => (/* reexport safe */ _config_custom_torznab_vue__WEBPACK_IMPORTED_MODULE_10__.default),\n/* harmony export */ \"ConfigProviderNzb\": () => (/* reexport safe */ _config_provider_nzb_vue__WEBPACK_IMPORTED_MODULE_11__.default),\n/* harmony export */ \"ConfigProviderTorrent\": () => (/* reexport safe */ _config_provider_torrent_vue__WEBPACK_IMPORTED_MODULE_12__.default),\n/* harmony export */ \"CustomLogs\": () => (/* reexport safe */ _custom_logs_vue__WEBPACK_IMPORTED_MODULE_13__.default),\n/* harmony export */ \"FileBrowser\": () => (/* reexport safe */ _file_browser_vue__WEBPACK_IMPORTED_MODULE_14__.default),\n/* harmony export */ \"LanguageSelect\": () => (/* reexport safe */ _language_select_vue__WEBPACK_IMPORTED_MODULE_15__.default),\n/* harmony export */ \"LoadProgressBar\": () => (/* reexport safe */ _load_progress_bar_vue__WEBPACK_IMPORTED_MODULE_16__.default),\n/* harmony export */ \"NamePattern\": () => (/* reexport safe */ _name_pattern_vue__WEBPACK_IMPORTED_MODULE_17__.default),\n/* harmony export */ \"PlotInfo\": () => (/* reexport safe */ _plot_info_vue__WEBPACK_IMPORTED_MODULE_18__.default),\n/* harmony export */ \"ProgressBar\": () => (/* reexport safe */ _progress_bar_vue__WEBPACK_IMPORTED_MODULE_19__.default),\n/* harmony export */ \"PosterSizeSlider\": () => (/* reexport safe */ _poster_size_slider_vue__WEBPACK_IMPORTED_MODULE_20__.default),\n/* harmony export */ \"QualityChooser\": () => (/* reexport safe */ _quality_chooser_vue__WEBPACK_IMPORTED_MODULE_21__.default),\n/* harmony export */ \"QualityPill\": () => (/* reexport safe */ _quality_pill_vue__WEBPACK_IMPORTED_MODULE_22__.default),\n/* harmony export */ \"ScrollButtons\": () => (/* reexport safe */ _scroll_buttons_vue__WEBPACK_IMPORTED_MODULE_23__.default),\n/* harmony export */ \"Search\": () => (/* reexport safe */ _search_vue__WEBPACK_IMPORTED_MODULE_24__.default),\n/* harmony export */ \"SelectList\": () => (/* reexport safe */ _select_list_vue__WEBPACK_IMPORTED_MODULE_25__.default),\n/* harmony export */ \"SelectTraktLists\": () => (/* reexport safe */ _select_trakt_lists_vue__WEBPACK_IMPORTED_MODULE_26__.default),\n/* harmony export */ \"ShowSelector\": () => (/* reexport safe */ _show_selector_vue__WEBPACK_IMPORTED_MODULE_27__.default),\n/* harmony export */ \"SortedSelectList\": () => (/* reexport safe */ _sorted_select_list_vue__WEBPACK_IMPORTED_MODULE_28__.default),\n/* harmony export */ \"StateSwitch\": () => (/* reexport safe */ _state_switch_vue__WEBPACK_IMPORTED_MODULE_29__.default),\n/* harmony export */ \"TestProvider\": () => (/* reexport safe */ _test_provider_vue__WEBPACK_IMPORTED_MODULE_30__.default),\n/* harmony export */ \"TraktAuthentication\": () => (/* reexport safe */ _trakt_authentication_vue__WEBPACK_IMPORTED_MODULE_31__.default)\n/* harmony export */ });\n/* harmony import */ var _app_link_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app-link.vue */ \"./src/components/helpers/app-link.vue\");\n/* harmony import */ var _asset_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./asset.vue */ \"./src/components/helpers/asset.vue\");\n/* harmony import */ var _config_scene_exceptions_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./config-scene-exceptions.vue */ \"./src/components/helpers/config-scene-exceptions.vue\");\n/* harmony import */ var _config_template_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./config-template.vue */ \"./src/components/helpers/config-template.vue\");\n/* harmony import */ var _config_textbox_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./config-textbox.vue */ \"./src/components/helpers/config-textbox.vue\");\n/* harmony import */ var _config_textbox_number_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config-textbox-number.vue */ \"./src/components/helpers/config-textbox-number.vue\");\n/* harmony import */ var _config_toggle_slider_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./config-toggle-slider.vue */ \"./src/components/helpers/config-toggle-slider.vue\");\n/* harmony import */ var _config_custom_newznab_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./config-custom-newznab.vue */ \"./src/components/helpers/config-custom-newznab.vue\");\n/* harmony import */ var _config_custom_prowlarr_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./config-custom-prowlarr.vue */ \"./src/components/helpers/config-custom-prowlarr.vue\");\n/* harmony import */ var _config_custom_torrentrss_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./config-custom-torrentrss.vue */ \"./src/components/helpers/config-custom-torrentrss.vue\");\n/* harmony import */ var _config_custom_torznab_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./config-custom-torznab.vue */ \"./src/components/helpers/config-custom-torznab.vue\");\n/* harmony import */ var _config_provider_nzb_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./config-provider-nzb.vue */ \"./src/components/helpers/config-provider-nzb.vue\");\n/* harmony import */ var _config_provider_torrent_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./config-provider-torrent.vue */ \"./src/components/helpers/config-provider-torrent.vue\");\n/* harmony import */ var _custom_logs_vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./custom-logs.vue */ \"./src/components/helpers/custom-logs.vue\");\n/* harmony import */ var _file_browser_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./file-browser.vue */ \"./src/components/helpers/file-browser.vue\");\n/* harmony import */ var _language_select_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./language-select.vue */ \"./src/components/helpers/language-select.vue\");\n/* harmony import */ var _load_progress_bar_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./load-progress-bar.vue */ \"./src/components/helpers/load-progress-bar.vue\");\n/* harmony import */ var _name_pattern_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./name-pattern.vue */ \"./src/components/helpers/name-pattern.vue\");\n/* harmony import */ var _plot_info_vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./plot-info.vue */ \"./src/components/helpers/plot-info.vue\");\n/* harmony import */ var _progress_bar_vue__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./progress-bar.vue */ \"./src/components/helpers/progress-bar.vue\");\n/* harmony import */ var _poster_size_slider_vue__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./poster-size-slider.vue */ \"./src/components/helpers/poster-size-slider.vue\");\n/* harmony import */ var _quality_chooser_vue__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./quality-chooser.vue */ \"./src/components/helpers/quality-chooser.vue\");\n/* harmony import */ var _quality_pill_vue__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./quality-pill.vue */ \"./src/components/helpers/quality-pill.vue\");\n/* harmony import */ var _scroll_buttons_vue__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./scroll-buttons.vue */ \"./src/components/helpers/scroll-buttons.vue\");\n/* harmony import */ var _search_vue__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./search.vue */ \"./src/components/helpers/search.vue\");\n/* harmony import */ var _select_list_vue__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./select-list.vue */ \"./src/components/helpers/select-list.vue\");\n/* harmony import */ var _select_trakt_lists_vue__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./select-trakt-lists.vue */ \"./src/components/helpers/select-trakt-lists.vue\");\n/* harmony import */ var _show_selector_vue__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./show-selector.vue */ \"./src/components/helpers/show-selector.vue\");\n/* harmony import */ var _sorted_select_list_vue__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./sorted-select-list.vue */ \"./src/components/helpers/sorted-select-list.vue\");\n/* harmony import */ var _state_switch_vue__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./state-switch.vue */ \"./src/components/helpers/state-switch.vue\");\n/* harmony import */ var _test_provider_vue__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./test-provider.vue */ \"./src/components/helpers/test-provider.vue\");\n/* harmony import */ var _trakt_authentication_vue__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./trakt-authentication.vue */ \"./src/components/helpers/trakt-authentication.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//# sourceURL=webpack://slim/./src/components/helpers/index.js?"); /***/ }), @@ -961,7 +1005,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"AddRecommended\": () => (/* reexport safe */ _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__.default),\n/* harmony export */ \"AddShowOptions\": () => (/* reexport safe */ _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__.default),\n/* harmony export */ \"AddShows\": () => (/* reexport safe */ _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__.default),\n/* harmony export */ \"AnidbReleaseGroupUi\": () => (/* reexport safe */ _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__.default),\n/* harmony export */ \"App\": () => (/* reexport safe */ _app_vue__WEBPACK_IMPORTED_MODULE_4__.default),\n/* harmony export */ \"AppFooter\": () => (/* reexport safe */ _app_footer_vue__WEBPACK_IMPORTED_MODULE_5__.default),\n/* harmony export */ \"AppHeader\": () => (/* reexport safe */ _app_header_vue__WEBPACK_IMPORTED_MODULE_6__.default),\n/* harmony export */ \"Backstretch\": () => (/* reexport safe */ _backstretch_vue__WEBPACK_IMPORTED_MODULE_7__.default),\n/* harmony export */ \"Config\": () => (/* reexport safe */ _config_vue__WEBPACK_IMPORTED_MODULE_8__.default),\n/* harmony export */ \"ConfigAnime\": () => (/* reexport safe */ _config_anime_vue__WEBPACK_IMPORTED_MODULE_9__.default),\n/* harmony export */ \"ConfigGeneral\": () => (/* reexport safe */ _config_general_vue__WEBPACK_IMPORTED_MODULE_10__.default),\n/* harmony export */ \"ConfigPostProcessing\": () => (/* reexport safe */ _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_11__.default),\n/* harmony export */ \"ConfigProviders\": () => (/* reexport safe */ _config_providers_vue__WEBPACK_IMPORTED_MODULE_12__.default),\n/* harmony export */ \"ConfigNotifications\": () => (/* reexport safe */ _config_notifications_vue__WEBPACK_IMPORTED_MODULE_13__.default),\n/* harmony export */ \"ConfigSearch\": () => (/* reexport safe */ _config_search_vue__WEBPACK_IMPORTED_MODULE_14__.default),\n/* harmony export */ \"DisplayShow\": () => (/* reexport safe */ _display_show_vue__WEBPACK_IMPORTED_MODULE_15__.default),\n/* harmony export */ \"CurrentDownloads\": () => (/* reexport safe */ _current_downloads_vue__WEBPACK_IMPORTED_MODULE_16__.default),\n/* harmony export */ \"EditShow\": () => (/* reexport safe */ _edit_show_vue__WEBPACK_IMPORTED_MODULE_17__.default),\n/* harmony export */ \"History\": () => (/* reexport safe */ _history_vue__WEBPACK_IMPORTED_MODULE_18__.default),\n/* harmony export */ \"HistoryCompact\": () => (/* reexport safe */ _history_compact_vue__WEBPACK_IMPORTED_MODULE_19__.default),\n/* harmony export */ \"HistoryDetailed\": () => (/* reexport safe */ _history_detailed_vue__WEBPACK_IMPORTED_MODULE_20__.default),\n/* harmony export */ \"Home\": () => (/* reexport safe */ _home_vue__WEBPACK_IMPORTED_MODULE_21__.default),\n/* harmony export */ \"IRC\": () => (/* reexport safe */ _irc_vue__WEBPACK_IMPORTED_MODULE_22__.default),\n/* harmony export */ \"Login\": () => (/* reexport safe */ _login_vue__WEBPACK_IMPORTED_MODULE_23__.default),\n/* harmony export */ \"Logs\": () => (/* reexport safe */ _logs_vue__WEBPACK_IMPORTED_MODULE_24__.default),\n/* harmony export */ \"manageSearches\": () => (/* reexport safe */ _manage_searches_vue__WEBPACK_IMPORTED_MODULE_25__.default),\n/* harmony export */ \"ManualPostProcess\": () => (/* reexport safe */ _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_26__.default),\n/* harmony export */ \"NewShow\": () => (/* reexport safe */ _new_show_vue__WEBPACK_IMPORTED_MODULE_27__.default),\n/* harmony export */ \"NewShowsExisting\": () => (/* reexport safe */ _new_shows_existing_vue__WEBPACK_IMPORTED_MODULE_28__.default),\n/* harmony export */ \"Restart\": () => (/* reexport safe */ _restart_vue__WEBPACK_IMPORTED_MODULE_29__.default),\n/* harmony export */ \"RootDirs\": () => (/* reexport safe */ _root_dirs_vue__WEBPACK_IMPORTED_MODULE_30__.default),\n/* harmony export */ \"Schedule\": () => (/* reexport safe */ _schedule_vue__WEBPACK_IMPORTED_MODULE_31__.default),\n/* harmony export */ \"ShowHeader\": () => (/* reexport safe */ _show_header_vue__WEBPACK_IMPORTED_MODULE_32__.default),\n/* harmony export */ \"ShowHistory\": () => (/* reexport safe */ _show_history_vue__WEBPACK_IMPORTED_MODULE_33__.default),\n/* harmony export */ \"ShowResults\": () => (/* reexport safe */ _show_results_vue__WEBPACK_IMPORTED_MODULE_34__.default),\n/* harmony export */ \"SnatchSelection\": () => (/* reexport safe */ _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_35__.default),\n/* harmony export */ \"Status\": () => (/* reexport safe */ _status_vue__WEBPACK_IMPORTED_MODULE_36__.default),\n/* harmony export */ \"SubMenu\": () => (/* reexport safe */ _sub_menu_vue__WEBPACK_IMPORTED_MODULE_37__.default),\n/* harmony export */ \"SubtitleSearch\": () => (/* reexport safe */ _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_38__.default),\n/* harmony export */ \"Update\": () => (/* reexport safe */ _update_vue__WEBPACK_IMPORTED_MODULE_39__.default),\n/* harmony export */ \"NotFound\": () => (/* reexport safe */ _http__WEBPACK_IMPORTED_MODULE_40__.NotFound),\n/* harmony export */ \"AppLink\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.AppLink),\n/* harmony export */ \"Asset\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.Asset),\n/* harmony export */ \"ConfigCustomNewznab\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ConfigCustomNewznab),\n/* harmony export */ \"ConfigCustomProwlarr\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ConfigCustomProwlarr),\n/* harmony export */ \"ConfigCustomTorrentrss\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ConfigCustomTorrentrss),\n/* harmony export */ \"ConfigCustomTorznab\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ConfigCustomTorznab),\n/* harmony export */ \"ConfigProviderNzb\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ConfigProviderNzb),\n/* harmony export */ \"ConfigProviderTorrent\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ConfigProviderTorrent),\n/* harmony export */ \"ConfigSceneExceptions\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ConfigSceneExceptions),\n/* harmony export */ \"ConfigTemplate\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ConfigTemplate),\n/* harmony export */ \"ConfigTextbox\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ConfigTextbox),\n/* harmony export */ \"ConfigTextboxNumber\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ConfigTextboxNumber),\n/* harmony export */ \"ConfigToggleSlider\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ConfigToggleSlider),\n/* harmony export */ \"CustomLogs\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.CustomLogs),\n/* harmony export */ \"FileBrowser\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.FileBrowser),\n/* harmony export */ \"LanguageSelect\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.LanguageSelect),\n/* harmony export */ \"LoadProgressBar\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.LoadProgressBar),\n/* harmony export */ \"NamePattern\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.NamePattern),\n/* harmony export */ \"PlotInfo\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.PlotInfo),\n/* harmony export */ \"PosterSizeSlider\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.PosterSizeSlider),\n/* harmony export */ \"ProgressBar\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ProgressBar),\n/* harmony export */ \"QualityChooser\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.QualityChooser),\n/* harmony export */ \"QualityPill\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.QualityPill),\n/* harmony export */ \"ScrollButtons\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ScrollButtons),\n/* harmony export */ \"Search\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.Search),\n/* harmony export */ \"SelectList\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.SelectList),\n/* harmony export */ \"ShowSelector\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.ShowSelector),\n/* harmony export */ \"SortedSelectList\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.SortedSelectList),\n/* harmony export */ \"StateSwitch\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.StateSwitch),\n/* harmony export */ \"TestProvider\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_41__.TestProvider)\n/* harmony export */ });\n/* harmony import */ var _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./add-recommended.vue */ \"./src/components/add-recommended.vue\");\n/* harmony import */ var _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add-show-options.vue */ \"./src/components/add-show-options.vue\");\n/* harmony import */ var _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./add-shows.vue */ \"./src/components/add-shows.vue\");\n/* harmony import */ var _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./anidb-release-group-ui.vue */ \"./src/components/anidb-release-group-ui.vue\");\n/* harmony import */ var _app_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app.vue */ \"./src/components/app.vue\");\n/* harmony import */ var _app_footer_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./app-footer.vue */ \"./src/components/app-footer.vue\");\n/* harmony import */ var _app_header_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./app-header.vue */ \"./src/components/app-header.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony import */ var _config_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./config.vue */ \"./src/components/config.vue\");\n/* harmony import */ var _config_anime_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./config-anime.vue */ \"./src/components/config-anime.vue\");\n/* harmony import */ var _config_general_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./config-general.vue */ \"./src/components/config-general.vue\");\n/* harmony import */ var _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./config-post-processing.vue */ \"./src/components/config-post-processing.vue\");\n/* harmony import */ var _config_providers_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./config-providers.vue */ \"./src/components/config-providers.vue\");\n/* harmony import */ var _config_notifications_vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./config-notifications.vue */ \"./src/components/config-notifications.vue\");\n/* harmony import */ var _config_search_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./config-search.vue */ \"./src/components/config-search.vue\");\n/* harmony import */ var _display_show_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./display-show.vue */ \"./src/components/display-show.vue\");\n/* harmony import */ var _current_downloads_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./current-downloads.vue */ \"./src/components/current-downloads.vue\");\n/* harmony import */ var _edit_show_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./edit-show.vue */ \"./src/components/edit-show.vue\");\n/* harmony import */ var _history_vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./history.vue */ \"./src/components/history.vue\");\n/* harmony import */ var _history_compact_vue__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./history-compact.vue */ \"./src/components/history-compact.vue\");\n/* harmony import */ var _history_detailed_vue__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./history-detailed.vue */ \"./src/components/history-detailed.vue\");\n/* harmony import */ var _home_vue__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./home.vue */ \"./src/components/home.vue\");\n/* harmony import */ var _irc_vue__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./irc.vue */ \"./src/components/irc.vue\");\n/* harmony import */ var _login_vue__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./login.vue */ \"./src/components/login.vue\");\n/* harmony import */ var _logs_vue__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./logs.vue */ \"./src/components/logs.vue\");\n/* harmony import */ var _manage_searches_vue__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./manage-searches.vue */ \"./src/components/manage-searches.vue\");\n/* harmony import */ var _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./manual-post-process.vue */ \"./src/components/manual-post-process.vue\");\n/* harmony import */ var _new_show_vue__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./new-show.vue */ \"./src/components/new-show.vue\");\n/* harmony import */ var _new_shows_existing_vue__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./new-shows-existing.vue */ \"./src/components/new-shows-existing.vue\");\n/* harmony import */ var _restart_vue__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./restart.vue */ \"./src/components/restart.vue\");\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony import */ var _schedule_vue__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./schedule.vue */ \"./src/components/schedule.vue\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _show_results_vue__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./show-results.vue */ \"./src/components/show-results.vue\");\n/* harmony import */ var _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./snatch-selection.vue */ \"./src/components/snatch-selection.vue\");\n/* harmony import */ var _status_vue__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./status.vue */ \"./src/components/status.vue\");\n/* harmony import */ var _sub_menu_vue__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./sub-menu.vue */ \"./src/components/sub-menu.vue\");\n/* harmony import */ var _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./subtitle-search.vue */ \"./src/components/subtitle-search.vue\");\n/* harmony import */ var _update_vue__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./update.vue */ \"./src/components/update.vue\");\n/* harmony import */ var _http__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./http */ \"./src/components/http/index.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_41__ = __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//# sourceURL=webpack://slim/./src/components/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"AddRecommended\": () => (/* reexport safe */ _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__.default),\n/* harmony export */ \"AddShowOptions\": () => (/* reexport safe */ _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__.default),\n/* harmony export */ \"AddShows\": () => (/* reexport safe */ _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__.default),\n/* harmony export */ \"AnidbReleaseGroupUi\": () => (/* reexport safe */ _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__.default),\n/* harmony export */ \"App\": () => (/* reexport safe */ _app_vue__WEBPACK_IMPORTED_MODULE_4__.default),\n/* harmony export */ \"AppFooter\": () => (/* reexport safe */ _app_footer_vue__WEBPACK_IMPORTED_MODULE_5__.default),\n/* harmony export */ \"AppHeader\": () => (/* reexport safe */ _app_header_vue__WEBPACK_IMPORTED_MODULE_6__.default),\n/* harmony export */ \"Backstretch\": () => (/* reexport safe */ _backstretch_vue__WEBPACK_IMPORTED_MODULE_7__.default),\n/* harmony export */ \"Config\": () => (/* reexport safe */ _config_vue__WEBPACK_IMPORTED_MODULE_8__.default),\n/* harmony export */ \"ConfigAnime\": () => (/* reexport safe */ _config_anime_vue__WEBPACK_IMPORTED_MODULE_9__.default),\n/* harmony export */ \"ConfigGeneral\": () => (/* reexport safe */ _config_general_vue__WEBPACK_IMPORTED_MODULE_10__.default),\n/* harmony export */ \"ConfigPostProcessing\": () => (/* reexport safe */ _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_11__.default),\n/* harmony export */ \"ConfigProviders\": () => (/* reexport safe */ _config_providers_vue__WEBPACK_IMPORTED_MODULE_12__.default),\n/* harmony export */ \"ConfigNotifications\": () => (/* reexport safe */ _config_notifications_vue__WEBPACK_IMPORTED_MODULE_13__.default),\n/* harmony export */ \"ConfigSearch\": () => (/* reexport safe */ _config_search_vue__WEBPACK_IMPORTED_MODULE_14__.default),\n/* harmony export */ \"DisplayShow\": () => (/* reexport safe */ _display_show_vue__WEBPACK_IMPORTED_MODULE_15__.default),\n/* harmony export */ \"CurrentDownloads\": () => (/* reexport safe */ _current_downloads_vue__WEBPACK_IMPORTED_MODULE_16__.default),\n/* harmony export */ \"EditShow\": () => (/* reexport safe */ _edit_show_vue__WEBPACK_IMPORTED_MODULE_17__.default),\n/* harmony export */ \"History\": () => (/* reexport safe */ _history_vue__WEBPACK_IMPORTED_MODULE_18__.default),\n/* harmony export */ \"HistoryCompact\": () => (/* reexport safe */ _history_compact_vue__WEBPACK_IMPORTED_MODULE_19__.default),\n/* harmony export */ \"HistoryDetailed\": () => (/* reexport safe */ _history_detailed_vue__WEBPACK_IMPORTED_MODULE_20__.default),\n/* harmony export */ \"Home\": () => (/* reexport safe */ _home_vue__WEBPACK_IMPORTED_MODULE_21__.default),\n/* harmony export */ \"IRC\": () => (/* reexport safe */ _irc_vue__WEBPACK_IMPORTED_MODULE_22__.default),\n/* harmony export */ \"Login\": () => (/* reexport safe */ _login_vue__WEBPACK_IMPORTED_MODULE_23__.default),\n/* harmony export */ \"Logs\": () => (/* reexport safe */ _logs_vue__WEBPACK_IMPORTED_MODULE_24__.default),\n/* harmony export */ \"manageSearches\": () => (/* reexport safe */ _manage_searches_vue__WEBPACK_IMPORTED_MODULE_25__.default),\n/* harmony export */ \"ManualPostProcess\": () => (/* reexport safe */ _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_26__.default),\n/* harmony export */ \"NewShow\": () => (/* reexport safe */ _new_show_vue__WEBPACK_IMPORTED_MODULE_27__.default),\n/* harmony export */ \"NewShowsExisting\": () => (/* reexport safe */ _new_shows_existing_vue__WEBPACK_IMPORTED_MODULE_28__.default),\n/* harmony export */ \"Recommended\": () => (/* reexport safe */ _recommended_vue__WEBPACK_IMPORTED_MODULE_29__.default),\n/* harmony export */ \"RecommendedPoster\": () => (/* reexport safe */ _recommended_poster_vue__WEBPACK_IMPORTED_MODULE_30__.default),\n/* harmony export */ \"Restart\": () => (/* reexport safe */ _restart_vue__WEBPACK_IMPORTED_MODULE_31__.default),\n/* harmony export */ \"RootDirs\": () => (/* reexport safe */ _root_dirs_vue__WEBPACK_IMPORTED_MODULE_32__.default),\n/* harmony export */ \"Schedule\": () => (/* reexport safe */ _schedule_vue__WEBPACK_IMPORTED_MODULE_33__.default),\n/* harmony export */ \"ShowHeader\": () => (/* reexport safe */ _show_header_vue__WEBPACK_IMPORTED_MODULE_34__.default),\n/* harmony export */ \"ShowHistory\": () => (/* reexport safe */ _show_history_vue__WEBPACK_IMPORTED_MODULE_35__.default),\n/* harmony export */ \"ShowResults\": () => (/* reexport safe */ _show_results_vue__WEBPACK_IMPORTED_MODULE_36__.default),\n/* harmony export */ \"SnatchSelection\": () => (/* reexport safe */ _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_37__.default),\n/* harmony export */ \"Status\": () => (/* reexport safe */ _status_vue__WEBPACK_IMPORTED_MODULE_38__.default),\n/* harmony export */ \"SubMenu\": () => (/* reexport safe */ _sub_menu_vue__WEBPACK_IMPORTED_MODULE_39__.default),\n/* harmony export */ \"SubtitleSearch\": () => (/* reexport safe */ _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_40__.default),\n/* harmony export */ \"Update\": () => (/* reexport safe */ _update_vue__WEBPACK_IMPORTED_MODULE_41__.default),\n/* harmony export */ \"NotFound\": () => (/* reexport safe */ _http__WEBPACK_IMPORTED_MODULE_42__.NotFound),\n/* harmony export */ \"AppLink\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.AppLink),\n/* harmony export */ \"Asset\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.Asset),\n/* harmony export */ \"ConfigCustomNewznab\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ConfigCustomNewznab),\n/* harmony export */ \"ConfigCustomProwlarr\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ConfigCustomProwlarr),\n/* harmony export */ \"ConfigCustomTorrentrss\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ConfigCustomTorrentrss),\n/* harmony export */ \"ConfigCustomTorznab\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ConfigCustomTorznab),\n/* harmony export */ \"ConfigProviderNzb\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ConfigProviderNzb),\n/* harmony export */ \"ConfigProviderTorrent\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ConfigProviderTorrent),\n/* harmony export */ \"ConfigSceneExceptions\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ConfigSceneExceptions),\n/* harmony export */ \"ConfigTemplate\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ConfigTemplate),\n/* harmony export */ \"ConfigTextbox\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ConfigTextbox),\n/* harmony export */ \"ConfigTextboxNumber\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ConfigTextboxNumber),\n/* harmony export */ \"ConfigToggleSlider\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ConfigToggleSlider),\n/* harmony export */ \"CustomLogs\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.CustomLogs),\n/* harmony export */ \"FileBrowser\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.FileBrowser),\n/* harmony export */ \"LanguageSelect\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.LanguageSelect),\n/* harmony export */ \"LoadProgressBar\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.LoadProgressBar),\n/* harmony export */ \"NamePattern\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.NamePattern),\n/* harmony export */ \"PlotInfo\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.PlotInfo),\n/* harmony export */ \"PosterSizeSlider\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.PosterSizeSlider),\n/* harmony export */ \"ProgressBar\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ProgressBar),\n/* harmony export */ \"QualityChooser\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.QualityChooser),\n/* harmony export */ \"QualityPill\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.QualityPill),\n/* harmony export */ \"ScrollButtons\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ScrollButtons),\n/* harmony export */ \"Search\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.Search),\n/* harmony export */ \"SelectList\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.SelectList),\n/* harmony export */ \"SelectTraktLists\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.SelectTraktLists),\n/* harmony export */ \"ShowSelector\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.ShowSelector),\n/* harmony export */ \"SortedSelectList\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.SortedSelectList),\n/* harmony export */ \"StateSwitch\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.StateSwitch),\n/* harmony export */ \"TestProvider\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.TestProvider),\n/* harmony export */ \"TraktAuthentication\": () => (/* reexport safe */ _helpers__WEBPACK_IMPORTED_MODULE_43__.TraktAuthentication)\n/* harmony export */ });\n/* harmony import */ var _add_recommended_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./add-recommended.vue */ \"./src/components/add-recommended.vue\");\n/* harmony import */ var _add_show_options_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add-show-options.vue */ \"./src/components/add-show-options.vue\");\n/* harmony import */ var _add_shows_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./add-shows.vue */ \"./src/components/add-shows.vue\");\n/* harmony import */ var _anidb_release_group_ui_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./anidb-release-group-ui.vue */ \"./src/components/anidb-release-group-ui.vue\");\n/* harmony import */ var _app_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app.vue */ \"./src/components/app.vue\");\n/* harmony import */ var _app_footer_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./app-footer.vue */ \"./src/components/app-footer.vue\");\n/* harmony import */ var _app_header_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./app-header.vue */ \"./src/components/app-header.vue\");\n/* harmony import */ var _backstretch_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./backstretch.vue */ \"./src/components/backstretch.vue\");\n/* harmony import */ var _config_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./config.vue */ \"./src/components/config.vue\");\n/* harmony import */ var _config_anime_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./config-anime.vue */ \"./src/components/config-anime.vue\");\n/* harmony import */ var _config_general_vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./config-general.vue */ \"./src/components/config-general.vue\");\n/* harmony import */ var _config_post_processing_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./config-post-processing.vue */ \"./src/components/config-post-processing.vue\");\n/* harmony import */ var _config_providers_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./config-providers.vue */ \"./src/components/config-providers.vue\");\n/* harmony import */ var _config_notifications_vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./config-notifications.vue */ \"./src/components/config-notifications.vue\");\n/* harmony import */ var _config_search_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./config-search.vue */ \"./src/components/config-search.vue\");\n/* harmony import */ var _display_show_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./display-show.vue */ \"./src/components/display-show.vue\");\n/* harmony import */ var _current_downloads_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./current-downloads.vue */ \"./src/components/current-downloads.vue\");\n/* harmony import */ var _edit_show_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./edit-show.vue */ \"./src/components/edit-show.vue\");\n/* harmony import */ var _history_vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./history.vue */ \"./src/components/history.vue\");\n/* harmony import */ var _history_compact_vue__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./history-compact.vue */ \"./src/components/history-compact.vue\");\n/* harmony import */ var _history_detailed_vue__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./history-detailed.vue */ \"./src/components/history-detailed.vue\");\n/* harmony import */ var _home_vue__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./home.vue */ \"./src/components/home.vue\");\n/* harmony import */ var _irc_vue__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./irc.vue */ \"./src/components/irc.vue\");\n/* harmony import */ var _login_vue__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./login.vue */ \"./src/components/login.vue\");\n/* harmony import */ var _logs_vue__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./logs.vue */ \"./src/components/logs.vue\");\n/* harmony import */ var _manage_searches_vue__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./manage-searches.vue */ \"./src/components/manage-searches.vue\");\n/* harmony import */ var _manual_post_process_vue__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./manual-post-process.vue */ \"./src/components/manual-post-process.vue\");\n/* harmony import */ var _new_show_vue__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./new-show.vue */ \"./src/components/new-show.vue\");\n/* harmony import */ var _new_shows_existing_vue__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./new-shows-existing.vue */ \"./src/components/new-shows-existing.vue\");\n/* harmony import */ var _recommended_vue__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./recommended.vue */ \"./src/components/recommended.vue\");\n/* harmony import */ var _recommended_poster_vue__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./recommended-poster.vue */ \"./src/components/recommended-poster.vue\");\n/* harmony import */ var _restart_vue__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./restart.vue */ \"./src/components/restart.vue\");\n/* harmony import */ var _root_dirs_vue__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./root-dirs.vue */ \"./src/components/root-dirs.vue\");\n/* harmony import */ var _schedule_vue__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./schedule.vue */ \"./src/components/schedule.vue\");\n/* harmony import */ var _show_header_vue__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./show-header.vue */ \"./src/components/show-header.vue\");\n/* harmony import */ var _show_history_vue__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./show-history.vue */ \"./src/components/show-history.vue\");\n/* harmony import */ var _show_results_vue__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./show-results.vue */ \"./src/components/show-results.vue\");\n/* harmony import */ var _snatch_selection_vue__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./snatch-selection.vue */ \"./src/components/snatch-selection.vue\");\n/* harmony import */ var _status_vue__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./status.vue */ \"./src/components/status.vue\");\n/* harmony import */ var _sub_menu_vue__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./sub-menu.vue */ \"./src/components/sub-menu.vue\");\n/* harmony import */ var _subtitle_search_vue__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./subtitle-search.vue */ \"./src/components/subtitle-search.vue\");\n/* harmony import */ var _update_vue__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./update.vue */ \"./src/components/update.vue\");\n/* harmony import */ var _http__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./http */ \"./src/components/http/index.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_43__ = __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//# sourceURL=webpack://slim/./src/components/index.js?"); /***/ }), @@ -983,7 +1027,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"registerGlobalComponents\": () => (/* binding */ registerGlobalComponents),\n/* harmony export */ \"registerPlugins\": () => (/* binding */ registerPlugins),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vue_async_computed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-async-computed */ \"./node_modules/vue-async-computed/dist/vue-async-computed.esm.js\");\n/* harmony import */ var vue_meta__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-meta */ \"./node_modules/vue-meta/dist/vue-meta.esm.js\");\n/* harmony import */ var vue_snotify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-snotify */ \"./node_modules/vue-snotify/vue-snotify.esm.js\");\n/* harmony import */ var vue_cookies__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-cookies */ \"./node_modules/vue-cookies/vue-cookies.js\");\n/* harmony import */ var vue_cookies__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vue_cookies__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var vue_js_modal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vue-js-modal */ \"./node_modules/vue-js-modal/dist/index.js\");\n/* harmony import */ var vue_js_modal__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vue_js_modal__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var v_tooltip__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! v-tooltip */ \"./node_modules/v-tooltip/dist/v-tooltip.esm.js\");\n/* harmony import */ var _fortawesome_fontawesome_svg_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @fortawesome/fontawesome-svg-core */ \"./node_modules/@fortawesome/fontawesome-svg-core/index.es.js\");\n/* harmony import */ var _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @fortawesome/free-solid-svg-icons */ \"./node_modules/@fortawesome/free-solid-svg-icons/index.es.js\");\n/* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components */ \"./src/components/index.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/core */ \"./src/utils/core.js\");\n// @TODO: Remove this file before v1.0.0\n\n\n\n\n\n\n\n\n\n_fortawesome_fontawesome_svg_core__WEBPACK_IMPORTED_MODULE_6__.library.add([_fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_7__.faAlignJustify, _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_7__.faImages]);\n\n\n\n/**\n * Register global components and x-template components.\n */\n\nconst registerGlobalComponents = () => {\n // Start with the x-template components\n let {\n components = []\n } = window; // Add global components (in use by `main.mako`)\n // @TODO: These should be registered in an `App.vue` component when possible,\n // along with some of the `main.mako` template\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_8__.App, _components__WEBPACK_IMPORTED_MODULE_8__.AppFooter, _components__WEBPACK_IMPORTED_MODULE_8__.AppHeader, _components__WEBPACK_IMPORTED_MODULE_8__.ScrollButtons, _components__WEBPACK_IMPORTED_MODULE_8__.SubMenu]); // Add global components (in use by pages/components that are not SFCs yet)\n // Use this when it's not possible to use `components: { ... }` in a component's definition.\n // If a component that uses any of these is a SFC, please use the `components` key when defining it.\n // @TODO: Instead of globally registering these,\n // they should be registered in each component that uses them\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_8__.AddShowOptions, _components__WEBPACK_IMPORTED_MODULE_8__.AnidbReleaseGroupUi, _components__WEBPACK_IMPORTED_MODULE_8__.AppLink, _components__WEBPACK_IMPORTED_MODULE_8__.Asset, _components__WEBPACK_IMPORTED_MODULE_8__.Backstretch, _components__WEBPACK_IMPORTED_MODULE_8__.ConfigTemplate, _components__WEBPACK_IMPORTED_MODULE_8__.ConfigTextbox, _components__WEBPACK_IMPORTED_MODULE_8__.ConfigTextboxNumber, _components__WEBPACK_IMPORTED_MODULE_8__.ConfigToggleSlider, _components__WEBPACK_IMPORTED_MODULE_8__.FileBrowser, _components__WEBPACK_IMPORTED_MODULE_8__.LanguageSelect, _components__WEBPACK_IMPORTED_MODULE_8__.LoadProgressBar, _components__WEBPACK_IMPORTED_MODULE_8__.PlotInfo, _components__WEBPACK_IMPORTED_MODULE_8__.QualityChooser, _components__WEBPACK_IMPORTED_MODULE_8__.QualityPill, // @FIXME: (sharkykh) Used in a hack/workaround in `static/js/ajax-episode-search.js`\n _components__WEBPACK_IMPORTED_MODULE_8__.RootDirs, _components__WEBPACK_IMPORTED_MODULE_8__.SelectList, _components__WEBPACK_IMPORTED_MODULE_8__.ShowSelector, _components__WEBPACK_IMPORTED_MODULE_8__.StateSwitch]); // Add components for pages that use `pageComponent`\n // @TODO: These need to be converted to Vue SFCs\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_8__.Schedule]); // Register the components globally\n\n components.forEach(component => {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_10__.isDevelopment) {\n console.debug(`Registering ${component.name}`);\n }\n\n vue__WEBPACK_IMPORTED_MODULE_11__.default.component(component.name, component);\n });\n};\n/**\n * Register plugins.\n */\n\nconst registerPlugins = () => {\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use(vue_async_computed__WEBPACK_IMPORTED_MODULE_0__.default);\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use(vue_meta__WEBPACK_IMPORTED_MODULE_1__.default);\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use(vue_snotify__WEBPACK_IMPORTED_MODULE_2__.default);\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use((vue_cookies__WEBPACK_IMPORTED_MODULE_3___default()));\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use((vue_js_modal__WEBPACK_IMPORTED_MODULE_4___default()), {\n dynamicDefault: {\n height: 'auto'\n }\n });\n vue__WEBPACK_IMPORTED_MODULE_11__.default.use(v_tooltip__WEBPACK_IMPORTED_MODULE_5__.VTooltip); // Set default cookie expire time\n\n vue__WEBPACK_IMPORTED_MODULE_11__.default.$cookies.config('10y');\n};\n/**\n * Apply the global Vue shim.\n */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (() => {\n const warningTemplate = (name, state) => `${name} is using the global Vuex '${state}' state, ` + `please replace that with a local one using: mapState(['${state}'])`;\n\n vue__WEBPACK_IMPORTED_MODULE_11__.default.mixin({\n data() {\n // These are only needed for the root Vue\n if (this.$root === this) {\n return {\n globalLoading: true,\n pageComponent: false,\n showsLoading: false\n };\n }\n\n return {};\n },\n\n mounted() {\n if (this.$root === this && !window.location.pathname.includes('/login')) {\n const {\n username\n } = window;\n Promise.all([\n /* This is used by the `app-header` component\n to only show the logout button if a username is set */\n _store__WEBPACK_IMPORTED_MODULE_9__.default.dispatch('login', {\n username\n }), _store__WEBPACK_IMPORTED_MODULE_9__.default.dispatch('getConfig'), _store__WEBPACK_IMPORTED_MODULE_9__.default.dispatch('getStats')]).then(([_, config]) => {\n this.$root.$emit('loaded'); // Legacy - send config.general to jQuery (received by index.js)\n\n const event = new CustomEvent('medusa-config-loaded', {\n detail: {\n general: config.main,\n layout: config.layout\n }\n });\n window.dispatchEvent(event);\n }).catch(error => {\n console.debug(error);\n alert('Unable to connect to Medusa!'); // eslint-disable-line no-alert\n });\n }\n\n this.$root.$once('loaded', () => {\n this.$root.globalLoading = false;\n });\n },\n\n // Make auth and config accessible to all components\n // @TODO: Remove this completely\n computed: {\n // Deprecate the global `Vuex.mapState(['auth', 'config'])`\n auth() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_10__.isDevelopment && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'auth'));\n }\n\n return this.$store.state.auth;\n },\n\n config() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_10__.isDevelopment && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'config'));\n }\n\n return this.$store.state.config;\n }\n\n }\n });\n\n if (_utils_core__WEBPACK_IMPORTED_MODULE_10__.isDevelopment) {\n console.debug('Loading local Vue');\n }\n\n registerPlugins();\n registerGlobalComponents();\n});\n\n//# sourceURL=webpack://slim/./src/global-vue-shim.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"registerGlobalComponents\": () => (/* binding */ registerGlobalComponents),\n/* harmony export */ \"registerPlugins\": () => (/* binding */ registerPlugins),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vue_async_computed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-async-computed */ \"./node_modules/vue-async-computed/dist/vue-async-computed.esm.js\");\n/* harmony import */ var vue_meta__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-meta */ \"./node_modules/vue-meta/dist/vue-meta.esm.js\");\n/* harmony import */ var vue_snotify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-snotify */ \"./node_modules/vue-snotify/vue-snotify.esm.js\");\n/* harmony import */ var vue_cookies__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-cookies */ \"./node_modules/vue-cookies/vue-cookies.js\");\n/* harmony import */ var vue_cookies__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vue_cookies__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var vue_js_modal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vue-js-modal */ \"./node_modules/vue-js-modal/dist/index.js\");\n/* harmony import */ var vue_js_modal__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(vue_js_modal__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var v_tooltip__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! v-tooltip */ \"./node_modules/v-tooltip/dist/v-tooltip.esm.js\");\n/* harmony import */ var _fortawesome_fontawesome_svg_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @fortawesome/fontawesome-svg-core */ \"./node_modules/@fortawesome/fontawesome-svg-core/index.es.js\");\n/* harmony import */ var _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @fortawesome/free-solid-svg-icons */ \"./node_modules/@fortawesome/free-solid-svg-icons/index.es.js\");\n/* harmony import */ var _fortawesome_free_regular_svg_icons__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @fortawesome/free-regular-svg-icons */ \"./node_modules/@fortawesome/free-regular-svg-icons/index.es.js\");\n/* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./components */ \"./src/components/index.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./store */ \"./src/store/index.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/core */ \"./src/utils/core.js\");\n// @TODO: Remove this file before v1.0.0\n\n\n\n\n\n\n\n\n\n\n_fortawesome_fontawesome_svg_core__WEBPACK_IMPORTED_MODULE_6__.library.add([_fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_7__.faAlignJustify, _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_7__.faImages, _fortawesome_free_regular_svg_icons__WEBPACK_IMPORTED_MODULE_8__.faTimesCircle]);\n\n\n\n/**\n * Register global components and x-template components.\n */\n\nconst registerGlobalComponents = () => {\n // Start with the x-template components\n let {\n components = []\n } = window; // Add global components (in use by `main.mako`)\n // @TODO: These should be registered in an `App.vue` component when possible,\n // along with some of the `main.mako` template\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_9__.App, _components__WEBPACK_IMPORTED_MODULE_9__.AppFooter, _components__WEBPACK_IMPORTED_MODULE_9__.AppHeader, _components__WEBPACK_IMPORTED_MODULE_9__.ScrollButtons, _components__WEBPACK_IMPORTED_MODULE_9__.SubMenu]); // Add global components (in use by pages/components that are not SFCs yet)\n // Use this when it's not possible to use `components: { ... }` in a component's definition.\n // If a component that uses any of these is a SFC, please use the `components` key when defining it.\n // @TODO: Instead of globally registering these,\n // they should be registered in each component that uses them\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_9__.AddShowOptions, _components__WEBPACK_IMPORTED_MODULE_9__.AnidbReleaseGroupUi, _components__WEBPACK_IMPORTED_MODULE_9__.AppLink, _components__WEBPACK_IMPORTED_MODULE_9__.Asset, _components__WEBPACK_IMPORTED_MODULE_9__.Backstretch, _components__WEBPACK_IMPORTED_MODULE_9__.ConfigTemplate, _components__WEBPACK_IMPORTED_MODULE_9__.ConfigTextbox, _components__WEBPACK_IMPORTED_MODULE_9__.ConfigTextboxNumber, _components__WEBPACK_IMPORTED_MODULE_9__.ConfigToggleSlider, _components__WEBPACK_IMPORTED_MODULE_9__.FileBrowser, _components__WEBPACK_IMPORTED_MODULE_9__.LanguageSelect, _components__WEBPACK_IMPORTED_MODULE_9__.LoadProgressBar, _components__WEBPACK_IMPORTED_MODULE_9__.PlotInfo, _components__WEBPACK_IMPORTED_MODULE_9__.QualityChooser, _components__WEBPACK_IMPORTED_MODULE_9__.QualityPill, // @FIXME: (sharkykh) Used in a hack/workaround in `static/js/ajax-episode-search.js`\n _components__WEBPACK_IMPORTED_MODULE_9__.RootDirs, _components__WEBPACK_IMPORTED_MODULE_9__.SelectList, _components__WEBPACK_IMPORTED_MODULE_9__.ShowSelector, _components__WEBPACK_IMPORTED_MODULE_9__.StateSwitch]); // Add components for pages that use `pageComponent`\n // @TODO: These need to be converted to Vue SFCs\n\n components = components.concat([_components__WEBPACK_IMPORTED_MODULE_9__.Schedule]); // Register the components globally\n\n components.forEach(component => {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_11__.isDevelopment) {\n console.debug(`Registering ${component.name}`);\n }\n\n vue__WEBPACK_IMPORTED_MODULE_12__.default.component(component.name, component);\n });\n};\n/**\n * Register plugins.\n */\n\nconst registerPlugins = () => {\n vue__WEBPACK_IMPORTED_MODULE_12__.default.use(vue_async_computed__WEBPACK_IMPORTED_MODULE_0__.default);\n vue__WEBPACK_IMPORTED_MODULE_12__.default.use(vue_meta__WEBPACK_IMPORTED_MODULE_1__.default);\n vue__WEBPACK_IMPORTED_MODULE_12__.default.use(vue_snotify__WEBPACK_IMPORTED_MODULE_2__.default);\n vue__WEBPACK_IMPORTED_MODULE_12__.default.use((vue_cookies__WEBPACK_IMPORTED_MODULE_3___default()));\n vue__WEBPACK_IMPORTED_MODULE_12__.default.use((vue_js_modal__WEBPACK_IMPORTED_MODULE_4___default()), {\n dynamicDefault: {\n height: 'auto'\n }\n });\n vue__WEBPACK_IMPORTED_MODULE_12__.default.use(v_tooltip__WEBPACK_IMPORTED_MODULE_5__.VTooltip); // Set default cookie expire time\n\n vue__WEBPACK_IMPORTED_MODULE_12__.default.$cookies.config('10y');\n};\n/**\n * Apply the global Vue shim.\n */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (() => {\n const warningTemplate = (name, state) => `${name} is using the global Vuex '${state}' state, ` + `please replace that with a local one using: mapState(['${state}'])`;\n\n vue__WEBPACK_IMPORTED_MODULE_12__.default.mixin({\n data() {\n // These are only needed for the root Vue\n if (this.$root === this) {\n return {\n globalLoading: true,\n pageComponent: false,\n showsLoading: false\n };\n }\n\n return {};\n },\n\n mounted() {\n if (this.$root === this && !window.location.pathname.includes('/login')) {\n const {\n username\n } = window;\n Promise.all([\n /* This is used by the `app-header` component\n to only show the logout button if a username is set */\n _store__WEBPACK_IMPORTED_MODULE_10__.default.dispatch('login', {\n username\n }), _store__WEBPACK_IMPORTED_MODULE_10__.default.dispatch('getConfig'), _store__WEBPACK_IMPORTED_MODULE_10__.default.dispatch('getStats')]).then(([_, config]) => {\n this.$root.$emit('loaded'); // Legacy - send config.general to jQuery (received by index.js)\n\n const event = new CustomEvent('medusa-config-loaded', {\n detail: {\n general: config.main,\n layout: config.layout\n }\n });\n window.dispatchEvent(event);\n }).catch(error => {\n console.debug(error);\n alert('Unable to connect to Medusa!'); // eslint-disable-line no-alert\n });\n }\n\n this.$root.$once('loaded', () => {\n this.$root.globalLoading = false;\n });\n },\n\n // Make auth and config accessible to all components\n // @TODO: Remove this completely\n computed: {\n // Deprecate the global `Vuex.mapState(['auth', 'config'])`\n auth() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_11__.isDevelopment && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'auth'));\n }\n\n return this.$store.state.auth;\n },\n\n config() {\n if (_utils_core__WEBPACK_IMPORTED_MODULE_11__.isDevelopment && !this.__VUE_DEVTOOLS_UID__) {\n console.warn(warningTemplate(this._name, 'config'));\n }\n\n return this.$store.state.config;\n }\n\n }\n });\n\n if (_utils_core__WEBPACK_IMPORTED_MODULE_11__.isDevelopment) {\n console.debug('Loading local Vue');\n }\n\n registerPlugins();\n registerGlobalComponents();\n});\n\n//# sourceURL=webpack://slim/./src/global-vue-shim.js?"); /***/ }), @@ -1027,7 +1071,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _sub_menus__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sub-menus */ \"./src/router/sub-menus.js\");\n\n/** @type {import('.').Route[]} */\n\nconst homeRoutes = [{\n path: '/home',\n name: 'home',\n meta: {\n title: 'Home',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/home.vue */ \"./src/components/home.vue\"))\n}, {\n path: '/home/editShow',\n name: 'editShow',\n meta: {\n topMenu: 'home',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.showSubMenu,\n converted: true,\n nocache: true // Use this flag, to have the router-view use :key=\"$route.fullPath\"\n\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/edit-show.vue */ \"./src/components/edit-show.vue\"))\n}, {\n path: '/home/displayShow',\n name: 'show',\n meta: {\n topMenu: 'home',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.showSubMenu,\n converted: true,\n nocache: true // Use this flag, to have the router-view use :key=\"$route.fullPath\"\n\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/display-show.vue */ \"./src/components/display-show.vue\"))\n}, {\n path: '/home/snatchSelection',\n name: 'snatchSelection',\n meta: {\n topMenu: 'home',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.showSubMenu,\n converted: true,\n nocache: true // Use this flag, to have the router-view use :key=\"$route.fullPath\"\n\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/snatch-selection.vue */ \"./src/components/snatch-selection.vue\"))\n}, {\n path: '/home/testRename',\n name: 'testRename',\n meta: {\n title: 'Preview Rename',\n header: 'Preview Rename',\n topMenu: 'home'\n }\n}, {\n path: '/home/postprocess',\n name: 'postprocess',\n meta: {\n title: 'Manual Post-Processing',\n header: 'Manual Post-Processing',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/manual-post-process.vue */ \"./src/components/manual-post-process.vue\"))\n}, {\n path: '/home/status',\n name: 'status',\n meta: {\n title: 'Status',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/status.vue */ \"./src/components/status.vue\"))\n}, {\n path: '/home/restart',\n name: 'restart',\n meta: {\n title: 'Restarting...',\n header: 'Performing Restart',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/restart.vue */ \"./src/components/restart.vue\"))\n}, {\n path: '/home/shutdown',\n name: 'shutdown',\n meta: {\n header: 'Shutting down',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/restart.vue */ \"./src/components/restart.vue\")),\n props: {\n shutdown: true\n }\n}, {\n path: '/home/update',\n name: 'update',\n meta: {\n header: 'Update Medusa',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/update.vue */ \"./src/components/update.vue\"))\n}];\n/** @type {import('.').Route[]} */\n\nconst configRoutes = [{\n path: '/config',\n name: 'config',\n meta: {\n title: 'Help & Info',\n header: 'Medusa Configuration',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config.vue */ \"./src/components/config.vue\"))\n}, {\n path: '/config/anime',\n name: 'configAnime',\n meta: {\n title: 'Config - Anime',\n header: 'Anime',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-anime.vue */ \"./src/components/config-anime.vue\"))\n}, {\n path: '/config/backuprestore',\n name: 'configBackupRestore',\n meta: {\n title: 'Config - Backup/Restore',\n header: 'Backup/Restore',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu\n }\n}, {\n path: '/config/general',\n name: 'configGeneral',\n meta: {\n title: 'Config - General',\n header: 'General Configuration',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-general.vue */ \"./src/components/config-general.vue\"))\n}, {\n path: '/config/notifications',\n name: 'configNotifications',\n meta: {\n title: 'Config - Notifications',\n header: 'Notifications',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-notifications.vue */ \"./src/components/config-notifications.vue\"))\n}, {\n path: '/config/postProcessing',\n name: 'configPostProcessing',\n meta: {\n title: 'Config - Post-Processing',\n header: 'Post-Processing',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-post-processing.vue */ \"./src/components/config-post-processing.vue\"))\n}, {\n path: '/config/providers',\n name: 'configSearchProviders',\n meta: {\n title: 'Config - Providers',\n header: 'Search Providers',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-providers.vue */ \"./src/components/config-providers.vue\"))\n}, {\n path: '/config/search',\n name: 'configSearchSettings',\n meta: {\n title: 'Config - Episode Search',\n header: 'Search Settings',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-search.vue */ \"./src/components/config-search.vue\"))\n}, {\n path: '/config/subtitles',\n name: 'configSubtitles',\n meta: {\n title: 'Config - Subtitles',\n header: 'Subtitles',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu\n }\n}];\n/** @type {import('.').Route[]} */\n\nconst addShowRoutes = [{\n path: '/addShows',\n name: 'addShows',\n meta: {\n title: 'Add Shows',\n header: 'Add Shows',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/add-shows.vue */ \"./src/components/add-shows.vue\"))\n}, {\n path: '/addShows/existingShows',\n name: 'addExistingShows',\n meta: {\n title: 'Add Existing Shows',\n header: 'Add Existing Shows',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/new-shows-existing.vue */ \"./src/components/new-shows-existing.vue\"))\n}, {\n path: '/addShows/newShow',\n name: 'addNewShow',\n meta: {\n title: 'Add New Show',\n header: 'Add New Show',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/new-show.vue */ \"./src/components/new-show.vue\"))\n}, {\n path: '/addShows/trendingShows',\n name: 'addTrendingShows',\n meta: {\n topMenu: 'home'\n }\n}, {\n path: '/addShows/popularShows',\n name: 'addPopularShows',\n meta: {\n title: 'Popular Shows',\n header: 'Popular Shows',\n topMenu: 'home'\n }\n}, {\n path: '/addShows/popularAnime',\n name: 'addPopularAnime',\n meta: {\n title: 'Popular Anime Shows',\n header: 'Popular Anime Shows',\n topMenu: 'home'\n }\n}];\n/** @type {import('.').Route} */\n\nconst loginRoute = {\n path: '/login',\n name: 'login',\n meta: {\n title: 'Login'\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/login.vue */ \"./src/components/login.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst addRecommendedRoute = {\n path: '/addRecommended',\n name: 'addRecommended',\n meta: {\n title: 'Add Recommended Shows',\n header: 'Add Recommended Shows',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/add-recommended.vue */ \"./src/components/add-recommended.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst scheduleRoute = {\n path: '/schedule',\n name: 'schedule',\n meta: {\n title: 'Schedule',\n header: 'Schedule',\n topMenu: 'schedule',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/schedule.vue */ \"./src/components/schedule.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst historyRoute = {\n path: '/history',\n name: 'history',\n meta: {\n title: 'History',\n header: 'History',\n topMenu: 'history',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.historySubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/history.vue */ \"./src/components/history.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst downloadsRoute = {\n path: '/downloads',\n name: 'downloads',\n meta: {\n title: 'Downloads',\n header: 'Downloads',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/current-downloads.vue */ \"./src/components/current-downloads.vue\"))\n};\n/** @type {import('.').Route[]} */\n\nconst manageRoutes = [{\n path: '/manage',\n name: 'manage',\n meta: {\n title: 'Mass Update',\n header: 'Mass Update',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/backlogOverview',\n name: 'manageBacklogOverview',\n meta: {\n title: 'Backlog Overview',\n header: 'Backlog Overview',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/episodeStatuses',\n name: 'manageEpisodeOverview',\n meta: {\n title: 'Episode Overview',\n header: 'Episode Overview',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/failedDownloads',\n name: 'manageFailedDownloads',\n meta: {\n title: 'Failed Downloads',\n header: 'Failed Downloads',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/manageSearches',\n name: 'manageManageSearches',\n meta: {\n title: 'Manage Searches',\n header: 'Manage Searches',\n topMenu: 'manage',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/manage-searches.vue */ \"./src/components/manage-searches.vue\"))\n}, {\n path: '/manage/massEdit',\n name: 'manageMassEdit',\n meta: {\n title: 'Mass Edit',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/subtitleMissed',\n name: 'manageSubtitleMissed',\n meta: {\n title: 'Missing Subtitles',\n header: 'Missing Subtitles',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/subtitleMissedPP',\n name: 'manageSubtitleMissedPP',\n meta: {\n title: 'Missing Subtitles in Post-Process folder',\n header: 'Missing Subtitles in Post-Process folder',\n topMenu: 'manage'\n }\n}];\n/** @type {import('.').Route[]} */\n\nconst errorLogsRoutes = [{\n path: '/errorlogs',\n name: 'errorlogs',\n meta: {\n title: 'Logs & Errors',\n topMenu: 'system',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.errorlogsSubMenu\n }\n}, {\n path: '/errorlogs/viewlog',\n name: 'viewlog',\n meta: {\n title: 'Logs',\n header: 'Log File',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/logs.vue */ \"./src/components/logs.vue\"))\n}];\n/** @type {import('.').Route} */\n\nconst newsRoute = {\n path: '/news',\n name: 'news',\n meta: {\n title: 'News',\n header: 'News',\n topMenu: 'system'\n }\n};\n/** @type {import('.').Route} */\n\nconst changesRoute = {\n path: '/changes',\n name: 'changes',\n meta: {\n title: 'Changelog',\n header: 'Changelog',\n topMenu: 'system'\n }\n};\n/** @type {import('.').Route} */\n\nconst ircRoute = {\n path: '/IRC',\n name: 'IRC',\n meta: {\n title: 'IRC',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/irc.vue */ \"./src/components/irc.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst notFoundRoute = {\n path: '/not-found',\n name: 'not-found',\n meta: {\n title: '404',\n header: '404 - page not found'\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/http/404.vue */ \"./src/components/http/404.vue\"))\n}; // @NOTE: Redirect can only be added once all routes are vue\n\n/*\n/** @type {import('.').Route} *-/\nconst notFoundRedirect = {\n path: '*',\n redirect: '/not-found'\n};\n*/\n\n/** @type {import('.').Route[]} */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ([...homeRoutes, ...configRoutes, ...addShowRoutes, loginRoute, addRecommendedRoute, scheduleRoute, historyRoute, downloadsRoute, ...manageRoutes, ...errorLogsRoutes, newsRoute, changesRoute, ircRoute, notFoundRoute]);\n\n//# sourceURL=webpack://slim/./src/router/routes.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _sub_menus__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sub-menus */ \"./src/router/sub-menus.js\");\n\n/** @type {import('.').Route[]} */\n\nconst homeRoutes = [{\n path: '/home',\n name: 'home',\n meta: {\n title: 'Home',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/home.vue */ \"./src/components/home.vue\"))\n}, {\n path: '/home/editShow',\n name: 'editShow',\n meta: {\n topMenu: 'home',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.showSubMenu,\n converted: true,\n nocache: true // Use this flag, to have the router-view use :key=\"$route.fullPath\"\n\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/edit-show.vue */ \"./src/components/edit-show.vue\"))\n}, {\n path: '/home/displayShow',\n name: 'show',\n meta: {\n topMenu: 'home',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.showSubMenu,\n converted: true,\n nocache: true // Use this flag, to have the router-view use :key=\"$route.fullPath\"\n\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/display-show.vue */ \"./src/components/display-show.vue\"))\n}, {\n path: '/home/snatchSelection',\n name: 'snatchSelection',\n meta: {\n topMenu: 'home',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.showSubMenu,\n converted: true,\n nocache: true // Use this flag, to have the router-view use :key=\"$route.fullPath\"\n\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/snatch-selection.vue */ \"./src/components/snatch-selection.vue\"))\n}, {\n path: '/home/testRename',\n name: 'testRename',\n meta: {\n title: 'Preview Rename',\n header: 'Preview Rename',\n topMenu: 'home'\n }\n}, {\n path: '/home/postprocess',\n name: 'postprocess',\n meta: {\n title: 'Manual Post-Processing',\n header: 'Manual Post-Processing',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/manual-post-process.vue */ \"./src/components/manual-post-process.vue\"))\n}, {\n path: '/home/status',\n name: 'status',\n meta: {\n title: 'Status',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/status.vue */ \"./src/components/status.vue\"))\n}, {\n path: '/home/restart',\n name: 'restart',\n meta: {\n title: 'Restarting...',\n header: 'Performing Restart',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/restart.vue */ \"./src/components/restart.vue\"))\n}, {\n path: '/home/shutdown',\n name: 'shutdown',\n meta: {\n header: 'Shutting down',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/restart.vue */ \"./src/components/restart.vue\")),\n props: {\n shutdown: true\n }\n}, {\n path: '/home/update',\n name: 'update',\n meta: {\n header: 'Update Medusa',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/update.vue */ \"./src/components/update.vue\"))\n}];\n/** @type {import('.').Route[]} */\n\nconst configRoutes = [{\n path: '/config',\n name: 'config',\n meta: {\n title: 'Help & Info',\n header: 'Medusa Configuration',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config.vue */ \"./src/components/config.vue\"))\n}, {\n path: '/config/anime',\n name: 'configAnime',\n meta: {\n title: 'Config - Anime',\n header: 'Anime',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-anime.vue */ \"./src/components/config-anime.vue\"))\n}, {\n path: '/config/backuprestore',\n name: 'configBackupRestore',\n meta: {\n title: 'Config - Backup/Restore',\n header: 'Backup/Restore',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu\n }\n}, {\n path: '/config/general',\n name: 'configGeneral',\n meta: {\n title: 'Config - General',\n header: 'General Configuration',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-general.vue */ \"./src/components/config-general.vue\"))\n}, {\n path: '/config/notifications',\n name: 'configNotifications',\n meta: {\n title: 'Config - Notifications',\n header: 'Notifications',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-notifications.vue */ \"./src/components/config-notifications.vue\"))\n}, {\n path: '/config/postProcessing',\n name: 'configPostProcessing',\n meta: {\n title: 'Config - Post-Processing',\n header: 'Post-Processing',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-post-processing.vue */ \"./src/components/config-post-processing.vue\"))\n}, {\n path: '/config/providers',\n name: 'configSearchProviders',\n meta: {\n title: 'Config - Providers',\n header: 'Search Providers',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-providers.vue */ \"./src/components/config-providers.vue\"))\n}, {\n path: '/config/search',\n name: 'configSearchSettings',\n meta: {\n title: 'Config - Episode Search',\n header: 'Search Settings',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/config-search.vue */ \"./src/components/config-search.vue\"))\n}, {\n path: '/config/subtitles',\n name: 'configSubtitles',\n meta: {\n title: 'Config - Subtitles',\n header: 'Subtitles',\n topMenu: 'config',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.configSubMenu\n }\n}];\n/** @type {import('.').Route[]} */\n\nconst addShowRoutes = [{\n path: '/addShows',\n name: 'addShows',\n meta: {\n title: 'Add Shows',\n header: 'Add Shows',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/add-shows.vue */ \"./src/components/add-shows.vue\"))\n}, {\n path: '/addShows/existingShows',\n name: 'addExistingShows',\n meta: {\n title: 'Add Existing Shows',\n header: 'Add Existing Shows',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/new-shows-existing.vue */ \"./src/components/new-shows-existing.vue\"))\n}, {\n path: '/addShows/newShow',\n name: 'addNewShow',\n meta: {\n title: 'Add New Show',\n header: 'Add New Show',\n topMenu: 'home',\n converted: true\n },\n props: route => ({ ...route.params\n }),\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/new-show.vue */ \"./src/components/new-show.vue\"))\n}, {\n path: '/addShows/trendingShows',\n name: 'addTrendingShows',\n meta: {\n topMenu: 'home'\n }\n}, {\n path: '/addShows/popularShows',\n name: 'addPopularShows',\n meta: {\n title: 'Popular Shows',\n header: 'Popular Shows',\n topMenu: 'home'\n }\n}, {\n path: '/addShows/popularAnime',\n name: 'addPopularAnime',\n meta: {\n title: 'Popular Anime Shows',\n header: 'Popular Anime Shows',\n topMenu: 'home'\n }\n}];\n/** @type {import('.').Route} */\n\nconst loginRoute = {\n path: '/login',\n name: 'login',\n meta: {\n title: 'Login'\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/login.vue */ \"./src/components/login.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst addRecommendedRoute = {\n path: '/addRecommended',\n name: 'addRecommended',\n meta: {\n title: 'Add Recommended Shows',\n header: 'Add Recommended Shows',\n topMenu: 'home',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/recommended.vue */ \"./src/components/recommended.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst scheduleRoute = {\n path: '/schedule',\n name: 'schedule',\n meta: {\n title: 'Schedule',\n header: 'Schedule',\n topMenu: 'schedule',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/schedule.vue */ \"./src/components/schedule.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst historyRoute = {\n path: '/history',\n name: 'history',\n meta: {\n title: 'History',\n header: 'History',\n topMenu: 'history',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.historySubMenu,\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/history.vue */ \"./src/components/history.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst downloadsRoute = {\n path: '/downloads',\n name: 'downloads',\n meta: {\n title: 'Downloads',\n header: 'Downloads',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/current-downloads.vue */ \"./src/components/current-downloads.vue\"))\n};\n/** @type {import('.').Route[]} */\n\nconst manageRoutes = [{\n path: '/manage',\n name: 'manage',\n meta: {\n title: 'Mass Update',\n header: 'Mass Update',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/backlogOverview',\n name: 'manageBacklogOverview',\n meta: {\n title: 'Backlog Overview',\n header: 'Backlog Overview',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/episodeStatuses',\n name: 'manageEpisodeOverview',\n meta: {\n title: 'Episode Overview',\n header: 'Episode Overview',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/failedDownloads',\n name: 'manageFailedDownloads',\n meta: {\n title: 'Failed Downloads',\n header: 'Failed Downloads',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/manageSearches',\n name: 'manageManageSearches',\n meta: {\n title: 'Manage Searches',\n header: 'Manage Searches',\n topMenu: 'manage',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/manage-searches.vue */ \"./src/components/manage-searches.vue\"))\n}, {\n path: '/manage/massEdit',\n name: 'manageMassEdit',\n meta: {\n title: 'Mass Edit',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/subtitleMissed',\n name: 'manageSubtitleMissed',\n meta: {\n title: 'Missing Subtitles',\n header: 'Missing Subtitles',\n topMenu: 'manage'\n }\n}, {\n path: '/manage/subtitleMissedPP',\n name: 'manageSubtitleMissedPP',\n meta: {\n title: 'Missing Subtitles in Post-Process folder',\n header: 'Missing Subtitles in Post-Process folder',\n topMenu: 'manage'\n }\n}];\n/** @type {import('.').Route[]} */\n\nconst errorLogsRoutes = [{\n path: '/errorlogs',\n name: 'errorlogs',\n meta: {\n title: 'Logs & Errors',\n topMenu: 'system',\n subMenu: _sub_menus__WEBPACK_IMPORTED_MODULE_0__.errorlogsSubMenu\n }\n}, {\n path: '/errorlogs/viewlog',\n name: 'viewlog',\n meta: {\n title: 'Logs',\n header: 'Log File',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/logs.vue */ \"./src/components/logs.vue\"))\n}];\n/** @type {import('.').Route} */\n\nconst newsRoute = {\n path: '/news',\n name: 'news',\n meta: {\n title: 'News',\n header: 'News',\n topMenu: 'system'\n }\n};\n/** @type {import('.').Route} */\n\nconst changesRoute = {\n path: '/changes',\n name: 'changes',\n meta: {\n title: 'Changelog',\n header: 'Changelog',\n topMenu: 'system'\n }\n};\n/** @type {import('.').Route} */\n\nconst ircRoute = {\n path: '/IRC',\n name: 'IRC',\n meta: {\n title: 'IRC',\n topMenu: 'system',\n converted: true\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/irc.vue */ \"./src/components/irc.vue\"))\n};\n/** @type {import('.').Route} */\n\nconst notFoundRoute = {\n path: '/not-found',\n name: 'not-found',\n meta: {\n title: '404',\n header: '404 - page not found'\n },\n component: () => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../components/http/404.vue */ \"./src/components/http/404.vue\"))\n}; // @NOTE: Redirect can only be added once all routes are vue\n\n/*\n/** @type {import('.').Route} *-/\nconst notFoundRedirect = {\n path: '*',\n redirect: '/not-found'\n};\n*/\n\n/** @type {import('.').Route[]} */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ([...homeRoutes, ...configRoutes, ...addShowRoutes, loginRoute, addRecommendedRoute, scheduleRoute, historyRoute, downloadsRoute, ...manageRoutes, ...errorLogsRoutes, newsRoute, changesRoute, ircRoute, notFoundRoute]);\n\n//# sourceURL=webpack://slim/./src/router/routes.js?"); /***/ }), @@ -1049,7 +1093,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-native-websocket */ \"./node_modules/vue-native-websocket/dist/build.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(vue_native_websocket__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _modules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules */ \"./src/store/modules/index.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\nvue__WEBPACK_IMPORTED_MODULE_3__.default.use(vuex__WEBPACK_IMPORTED_MODULE_4__.default);\nconst store = new vuex__WEBPACK_IMPORTED_MODULE_4__.Store({\n modules: {\n auth: _modules__WEBPACK_IMPORTED_MODULE_1__.auth,\n config: _modules__WEBPACK_IMPORTED_MODULE_1__.config,\n defaults: _modules__WEBPACK_IMPORTED_MODULE_1__.defaults,\n history: _modules__WEBPACK_IMPORTED_MODULE_1__.history,\n notifications: _modules__WEBPACK_IMPORTED_MODULE_1__.notifications,\n provider: _modules__WEBPACK_IMPORTED_MODULE_1__.provider,\n schedule: _modules__WEBPACK_IMPORTED_MODULE_1__.schedule,\n shows: _modules__WEBPACK_IMPORTED_MODULE_1__.shows,\n socket: _modules__WEBPACK_IMPORTED_MODULE_1__.socket,\n stats: _modules__WEBPACK_IMPORTED_MODULE_1__.stats,\n queue: _modules__WEBPACK_IMPORTED_MODULE_1__.queue\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 if (event === 'QueueItemShowAdd') {\n this.store.dispatch('updateShowQueueItem', data);\n } else if (event === 'QueueItemShowRemove') {\n this.store.dispatch('removeShow', data);\n } else if (event === 'historyUpdate') {\n this.store.dispatch('updateHistory', 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_3__.default.use((vue_native_websocket__WEBPACK_IMPORTED_MODULE_0___default()), 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_2__.SOCKET_ONOPEN,\n SOCKET_ONCLOSE: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONCLOSE,\n SOCKET_ONERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONERROR,\n SOCKET_ONMESSAGE: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONMESSAGE,\n SOCKET_RECONNECT: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_RECONNECT,\n SOCKET_RECONNECT_ERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_RECONNECT_ERROR\n }\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (store);\n\n//# sourceURL=webpack://slim/./src/store/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-native-websocket */ \"./node_modules/vue-native-websocket/dist/build.js\");\n/* harmony import */ var vue_native_websocket__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(vue_native_websocket__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _modules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules */ \"./src/store/modules/index.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\nvue__WEBPACK_IMPORTED_MODULE_3__.default.use(vuex__WEBPACK_IMPORTED_MODULE_4__.default);\nconst store = new vuex__WEBPACK_IMPORTED_MODULE_4__.Store({\n modules: {\n auth: _modules__WEBPACK_IMPORTED_MODULE_1__.auth,\n config: _modules__WEBPACK_IMPORTED_MODULE_1__.config,\n defaults: _modules__WEBPACK_IMPORTED_MODULE_1__.defaults,\n history: _modules__WEBPACK_IMPORTED_MODULE_1__.history,\n notifications: _modules__WEBPACK_IMPORTED_MODULE_1__.notifications,\n provider: _modules__WEBPACK_IMPORTED_MODULE_1__.provider,\n recommended: _modules__WEBPACK_IMPORTED_MODULE_1__.recommended,\n schedule: _modules__WEBPACK_IMPORTED_MODULE_1__.schedule,\n shows: _modules__WEBPACK_IMPORTED_MODULE_1__.shows,\n socket: _modules__WEBPACK_IMPORTED_MODULE_1__.socket,\n stats: _modules__WEBPACK_IMPORTED_MODULE_1__.stats,\n queue: _modules__WEBPACK_IMPORTED_MODULE_1__.queue\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 if (event === 'QueueItemShowAdd') {\n this.store.dispatch('updateShowQueueItem', data);\n } else if (event === 'QueueItemShowRemove') {\n this.store.dispatch('removeShow', data);\n } else if (event === 'historyUpdate') {\n this.store.dispatch('updateHistory', 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_3__.default.use((vue_native_websocket__WEBPACK_IMPORTED_MODULE_0___default()), 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_2__.SOCKET_ONOPEN,\n SOCKET_ONCLOSE: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONCLOSE,\n SOCKET_ONERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONERROR,\n SOCKET_ONMESSAGE: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_ONMESSAGE,\n SOCKET_RECONNECT: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_RECONNECT,\n SOCKET_RECONNECT_ERROR: _mutation_types__WEBPACK_IMPORTED_MODULE_2__.SOCKET_RECONNECT_ERROR\n }\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (store);\n\n//# sourceURL=webpack://slim/./src/store/index.js?"); /***/ }), @@ -1104,7 +1148,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../mutation-types */ \"./src/store/mutation-types.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/core */ \"./src/utils/core.js\");\n\n\n\nconst state = {\n addTitleWithYear: null,\n wikiUrl: null,\n donationsUrl: null,\n namingForceFolders: null,\n sourceUrl: null,\n rootDirs: [],\n subtitles: {\n enabled: null\n },\n brokenProviders: [],\n logs: {\n debug: null,\n dbDebug: null,\n loggingLevels: {},\n numErrors: null,\n numWarnings: null,\n actualLogDir: null,\n nr: null,\n size: null,\n subliminalLog: null,\n privacyLevel: null,\n custom: {}\n },\n cpuPreset: null,\n subtitlesMulti: null,\n anonRedirect: null,\n recentShows: [],\n randomShowSlug: null,\n // @TODO: Recreate this in Vue when the webapp has a reliable list of shows to choose from.\n showDefaults: {\n status: null,\n statusAfter: null,\n quality: null,\n subtitles: null,\n seasonFolders: null,\n anime: null,\n scene: null,\n showLists: null\n },\n launchBrowser: null,\n defaultPage: null,\n trashRemoveShow: null,\n indexerDefaultLanguage: null,\n showUpdateHour: null,\n indexerTimeout: null,\n indexerDefault: null,\n plexFallBack: {\n enable: null,\n notifications: null,\n timeout: null\n },\n versionNotify: null,\n autoUpdate: null,\n updateFrequency: null,\n notifyOnUpdate: null,\n availableThemes: null,\n timePresets: [],\n datePresets: [],\n webInterface: {\n apiKey: null,\n log: null,\n username: null,\n password: null,\n port: null,\n host: null,\n notifyOnLogin: null,\n ipv6: null,\n httpsEnable: null,\n httpsCert: null,\n httpsKey: null,\n handleReverseProxy: null\n },\n sslVerify: null,\n sslCaBundle: null,\n noRestart: null,\n encryptionVersion: null,\n calendarUnprotected: null,\n calendarIcons: null,\n proxySetting: null,\n proxyProviders: null,\n proxyClients: null,\n proxyIndexers: null,\n proxyOthers: null,\n skipRemovedFiles: null,\n epDefaultDeletedStatus: null,\n developer: null,\n experimental: null,\n git: {\n username: null,\n password: null,\n token: null,\n authType: null,\n remote: null,\n path: null,\n org: null,\n reset: null,\n resetBranches: null,\n url: null\n },\n // Remove backlogOverview after manage_backlogOverview.mako is gone.\n backlogOverview: {\n status: null,\n period: null\n },\n // Remove themeName when we get fully rid of MEDUSA.config.\n themeName: null,\n providers: {\n prowlarr: {\n url: null,\n apikey: null\n }\n }\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_CONFIG](state, {\n section,\n config\n }) {\n if (section === 'main') {\n state = Object.assign(state, config);\n }\n },\n\n addRecentShow(state, {\n show\n }) {\n state.recentShows = state.recentShows.filter(filterShow => !(filterShow.showSlug === show.showSlug && filterShow.name === show.name));\n state.recentShows.unshift(show); // Add the new show object to the start of the array.\n\n state.recentShows = state.recentShows.slice(0, 5); // Cut the array of at 5 items.\n }\n\n};\nconst getters = {\n effectiveIgnored: (state, _, rootState) => series => {\n const seriesIgnored = series.config.release.ignoredWords.map(x => x.toLowerCase());\n const globalIgnored = rootState.config.search.filters.ignored.map(x => x.toLowerCase());\n\n if (!series.config.release.ignoredWordsExclude) {\n return (0,_utils_core__WEBPACK_IMPORTED_MODULE_2__.arrayUnique)(globalIgnored.concat(seriesIgnored));\n }\n\n return (0,_utils_core__WEBPACK_IMPORTED_MODULE_2__.arrayExclude)(globalIgnored, seriesIgnored);\n },\n effectiveRequired: (state, _, rootState) => series => {\n const seriesRequired = series.config.release.requiredWords.map(x => x.toLowerCase());\n const globalRequired = rootState.config.search.filters.required.map(x => x.toLowerCase());\n\n if (!series.config.release.requiredWordsExclude) {\n return (0,_utils_core__WEBPACK_IMPORTED_MODULE_2__.arrayUnique)(globalRequired.concat(seriesRequired));\n }\n\n return (0,_utils_core__WEBPACK_IMPORTED_MODULE_2__.arrayExclude)(globalRequired, seriesRequired);\n }\n};\nconst actions = {\n getConfig(context, section) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_0__.api.get('/config/' + (section || '')).then(res => {\n if (section) {\n const config = res.data;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_CONFIG, {\n section,\n config\n });\n return config;\n }\n\n const sections = res.data;\n Object.keys(sections).forEach(section => {\n const config = sections[section];\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_CONFIG, {\n section,\n config\n });\n });\n return sections;\n });\n },\n\n setConfig(context, {\n section,\n config\n }) {\n return _api__WEBPACK_IMPORTED_MODULE_0__.api.patch(`config/${section}`, config);\n },\n\n updateConfig(context, {\n section,\n config\n }) {\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_CONFIG, {\n section,\n config\n });\n },\n\n getApiKey(context) {\n const {\n commit\n } = context;\n const section = 'main';\n const config = {\n webInterface: {\n apiKey: ''\n }\n };\n return _api__WEBPACK_IMPORTED_MODULE_0__.apiRoute.get('config/general/generate_api_key').then(response => {\n config.webInterface.apiKey = response.data;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_CONFIG, {\n section,\n config\n });\n });\n },\n\n setRecentShow({\n commit,\n state\n }, show) {\n commit('addRecentShow', {\n show\n });\n const config = {\n recentShows: state.recentShows\n };\n return _api__WEBPACK_IMPORTED_MODULE_0__.api.patch('config/main', config);\n },\n\n setCustomLogs({\n commit\n }, logs) {\n // Convert back to object.\n const reducedLogs = logs.reduce((obj, item) => ({ ...obj,\n [item.identifier]: item.level\n }), {});\n return _api__WEBPACK_IMPORTED_MODULE_0__.api.patch('config/main', {\n logs: {\n custom: logs\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_CONFIG, {\n section: 'main',\n config: {\n logs: {\n custom: reducedLogs\n }\n }\n });\n });\n }\n\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/config/general.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../mutation-types */ \"./src/store/mutation-types.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/core */ \"./src/utils/core.js\");\n\n\n\nconst state = {\n addTitleWithYear: null,\n wikiUrl: null,\n donationsUrl: null,\n namingForceFolders: null,\n sourceUrl: null,\n rootDirs: [],\n subtitles: {\n enabled: null\n },\n brokenProviders: [],\n logs: {\n debug: null,\n dbDebug: null,\n loggingLevels: {},\n numErrors: null,\n numWarnings: null,\n actualLogDir: null,\n nr: null,\n size: null,\n subliminalLog: null,\n privacyLevel: null,\n custom: {}\n },\n cpuPreset: null,\n subtitlesMulti: null,\n anonRedirect: null,\n recentShows: [],\n randomShowSlug: null,\n // @TODO: Recreate this in Vue when the webapp has a reliable list of shows to choose from.\n showDefaults: {\n status: null,\n statusAfter: null,\n quality: null,\n subtitles: null,\n seasonFolders: null,\n anime: null,\n scene: null,\n showLists: null\n },\n launchBrowser: null,\n defaultPage: null,\n trashRemoveShow: null,\n indexerDefaultLanguage: null,\n showUpdateHour: null,\n indexerTimeout: null,\n indexerDefault: null,\n plexFallBack: {\n enable: null,\n notifications: null,\n timeout: null\n },\n recommended: {\n cache: {\n shows: null,\n trakt: null,\n imdb: null,\n anidb: null,\n anilist: null\n },\n trakt: {\n selectedLists: [],\n availableLists: []\n }\n },\n versionNotify: null,\n autoUpdate: null,\n updateFrequency: null,\n notifyOnUpdate: null,\n availableThemes: null,\n timePresets: [],\n datePresets: [],\n webInterface: {\n apiKey: null,\n log: null,\n username: null,\n password: null,\n port: null,\n host: null,\n notifyOnLogin: null,\n ipv6: null,\n httpsEnable: null,\n httpsCert: null,\n httpsKey: null,\n handleReverseProxy: null\n },\n sslVerify: null,\n sslCaBundle: null,\n noRestart: null,\n encryptionVersion: null,\n calendarUnprotected: null,\n calendarIcons: null,\n proxySetting: null,\n proxyProviders: null,\n proxyClients: null,\n proxyIndexers: null,\n proxyOthers: null,\n skipRemovedFiles: null,\n epDefaultDeletedStatus: null,\n developer: null,\n experimental: null,\n git: {\n username: null,\n password: null,\n token: null,\n authType: null,\n remote: null,\n path: null,\n org: null,\n reset: null,\n resetBranches: null,\n url: null\n },\n // Remove backlogOverview after manage_backlogOverview.mako is gone.\n backlogOverview: {\n status: null,\n period: null\n },\n // Remove themeName when we get fully rid of MEDUSA.config.\n themeName: null,\n providers: {\n prowlarr: {\n url: null,\n apikey: null\n }\n }\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_CONFIG](state, {\n section,\n config\n }) {\n if (section === 'main') {\n state = Object.assign(state, config);\n }\n },\n\n addRecentShow(state, {\n show\n }) {\n state.recentShows = state.recentShows.filter(filterShow => !(filterShow.showSlug === show.showSlug && filterShow.name === show.name));\n state.recentShows.unshift(show); // Add the new show object to the start of the array.\n\n state.recentShows = state.recentShows.slice(0, 5); // Cut the array of at 5 items.\n },\n\n updateTraktSelectedLists(state, selectedLists) {\n state.recommended.trakt.selectedLists = selectedLists;\n }\n\n};\nconst getters = {\n effectiveIgnored: (state, _, rootState) => series => {\n const seriesIgnored = series.config.release.ignoredWords.map(x => x.toLowerCase());\n const globalIgnored = rootState.config.search.filters.ignored.map(x => x.toLowerCase());\n\n if (!series.config.release.ignoredWordsExclude) {\n return (0,_utils_core__WEBPACK_IMPORTED_MODULE_2__.arrayUnique)(globalIgnored.concat(seriesIgnored));\n }\n\n return (0,_utils_core__WEBPACK_IMPORTED_MODULE_2__.arrayExclude)(globalIgnored, seriesIgnored);\n },\n effectiveRequired: (state, _, rootState) => series => {\n const seriesRequired = series.config.release.requiredWords.map(x => x.toLowerCase());\n const globalRequired = rootState.config.search.filters.required.map(x => x.toLowerCase());\n\n if (!series.config.release.requiredWordsExclude) {\n return (0,_utils_core__WEBPACK_IMPORTED_MODULE_2__.arrayUnique)(globalRequired.concat(seriesRequired));\n }\n\n return (0,_utils_core__WEBPACK_IMPORTED_MODULE_2__.arrayExclude)(globalRequired, seriesRequired);\n }\n};\nconst actions = {\n getConfig(context, section) {\n const {\n commit\n } = context;\n return _api__WEBPACK_IMPORTED_MODULE_0__.api.get('/config/' + (section || '')).then(res => {\n if (section) {\n const config = res.data;\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_CONFIG, {\n section,\n config\n });\n return config;\n }\n\n const sections = res.data;\n Object.keys(sections).forEach(section => {\n const config = sections[section];\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_CONFIG, {\n section,\n config\n });\n });\n return sections;\n });\n },\n\n setConfig(context, {\n section,\n config\n }) {\n return _api__WEBPACK_IMPORTED_MODULE_0__.api.patch(`config/${section}`, config);\n },\n\n updateConfig(context, {\n section,\n config\n }) {\n const {\n commit\n } = context;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_CONFIG, {\n section,\n config\n });\n },\n\n getApiKey(context) {\n const {\n commit\n } = context;\n const section = 'main';\n const config = {\n webInterface: {\n apiKey: ''\n }\n };\n return _api__WEBPACK_IMPORTED_MODULE_0__.apiRoute.get('config/general/generate_api_key').then(response => {\n config.webInterface.apiKey = response.data;\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_CONFIG, {\n section,\n config\n });\n });\n },\n\n setRecentShow({\n commit,\n state\n }, show) {\n commit('addRecentShow', {\n show\n });\n const config = {\n recentShows: state.recentShows\n };\n return _api__WEBPACK_IMPORTED_MODULE_0__.api.patch('config/main', config);\n },\n\n setCustomLogs({\n commit\n }, logs) {\n // Convert back to object.\n const reducedLogs = logs.reduce((obj, item) => ({ ...obj,\n [item.identifier]: item.level\n }), {});\n return _api__WEBPACK_IMPORTED_MODULE_0__.api.patch('config/main', {\n logs: {\n custom: logs\n }\n }).then(() => {\n return commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_CONFIG, {\n section: 'main',\n config: {\n logs: {\n custom: reducedLogs\n }\n }\n });\n });\n },\n\n setTraktSelectedLists({\n commit\n }, selectedLists) {\n return _api__WEBPACK_IMPORTED_MODULE_0__.api.patch('config/main', {\n recommended: {\n trakt: {\n selectedLists\n }\n }\n }).then(() => {\n return commit('updateTraktSelectedLists', selectedLists);\n });\n }\n\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/config/general.js?"); /***/ }), @@ -1126,7 +1170,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../mutation-types */ \"./src/store/mutation-types.js\");\n\nconst state = {\n main: {\n externalMappings: {},\n statusMap: {},\n traktIndexers: {},\n validLanguages: [],\n langabbvToId: {}\n },\n indexers: {\n tvdb: {\n apiParams: {\n useZip: null,\n language: null\n },\n baseUrl: null,\n enabled: null,\n icon: null,\n id: null,\n identifier: null,\n mappedTo: null,\n name: null,\n scene_loc: null,\n // eslint-disable-line camelcase\n showUrl: null,\n xemOrigin: null\n },\n tmdb: {\n apiParams: {\n useZip: null,\n language: null\n },\n baseUrl: null,\n enabled: null,\n icon: null,\n id: null,\n identifier: null,\n mappedTo: null,\n name: null,\n scene_loc: null,\n // eslint-disable-line camelcase\n showUrl: null,\n xemOrigin: null\n },\n tvmaze: {\n apiParams: {\n useZip: null,\n language: null\n },\n baseUrl: null,\n enabled: null,\n icon: null,\n id: null,\n identifier: null,\n mappedTo: null,\n name: null,\n scene_loc: null,\n // eslint-disable-line camelcase\n showUrl: null,\n xemOrigin: null\n }\n }\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_0__.ADD_CONFIG](state, {\n section,\n config\n }) {\n if (section === 'indexers') {\n state = Object.assign(state, config);\n }\n }\n\n};\nconst getters = {\n // Get an indexer's name using its ID.\n indexerIdToName: state => indexerId => {\n if (!indexerId) {\n return undefined;\n }\n\n const {\n indexers\n } = state;\n return Object.keys(indexers).find(name => indexers[name].id === Number.parseInt(indexerId, 10));\n },\n // Get an indexer's ID using its name.\n indexerNameToId: state => indexerName => {\n const {\n indexers\n } = state;\n\n if (!indexerName || !indexers) {\n return undefined;\n }\n\n return indexers[indexerName].id;\n },\n\n /**\n * Return the indexers showUrl.\n * @param {object} state - State object.\n * @returns {string|undefined} Indexers show url or undefined if not found.\n */\n getIndexer: state => indexerId => {\n return Object.values(state.indexers).find(indexer => indexer.id === indexerId);\n }\n};\nconst actions = {};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/config/indexers.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../mutation-types */ \"./src/store/mutation-types.js\");\n\nconst state = {\n main: {\n externalMappings: {},\n statusMap: {},\n traktIndexers: {},\n validLanguages: [],\n langabbvToId: {},\n recommendedLists: {}\n },\n indexers: {\n tvdb: {\n apiParams: {\n useZip: null,\n language: null\n },\n baseUrl: null,\n enabled: null,\n icon: null,\n id: null,\n identifier: null,\n mappedTo: null,\n name: null,\n scene_loc: null,\n // eslint-disable-line camelcase\n showUrl: null,\n xemOrigin: null\n },\n tmdb: {\n apiParams: {\n useZip: null,\n language: null\n },\n baseUrl: null,\n enabled: null,\n icon: null,\n id: null,\n identifier: null,\n mappedTo: null,\n name: null,\n scene_loc: null,\n // eslint-disable-line camelcase\n showUrl: null,\n xemOrigin: null\n },\n tvmaze: {\n apiParams: {\n useZip: null,\n language: null\n },\n baseUrl: null,\n enabled: null,\n icon: null,\n id: null,\n identifier: null,\n mappedTo: null,\n name: null,\n scene_loc: null,\n // eslint-disable-line camelcase\n showUrl: null,\n xemOrigin: null\n }\n }\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_0__.ADD_CONFIG](state, {\n section,\n config\n }) {\n if (section === 'indexers') {\n state = Object.assign(state, config);\n }\n }\n\n};\nconst getters = {\n // Get an indexer's name using its ID.\n indexerIdToName: state => indexerId => {\n if (!indexerId) {\n return undefined;\n }\n\n const {\n indexers\n } = state;\n return Object.keys(indexers).find(name => indexers[name].id === Number.parseInt(indexerId, 10));\n },\n // Get an indexer's ID using its name.\n indexerNameToId: state => indexerName => {\n const {\n indexers\n } = state;\n\n if (!indexerName || !indexers) {\n return undefined;\n }\n\n return indexers[indexerName].id;\n },\n\n /**\n * Return the indexers showUrl.\n * @param {object} state - State object.\n * @returns {string|undefined} Indexers show url or undefined if not found.\n */\n getIndexer: state => indexerId => {\n return Object.values(state.indexers).find(indexer => indexer.id === indexerId);\n }\n};\nconst actions = {};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/config/indexers.js?"); /***/ }), @@ -1478,7 +1522,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"auth\": () => (/* reexport safe */ _auth__WEBPACK_IMPORTED_MODULE_0__.default),\n/* harmony export */ \"defaults\": () => (/* reexport safe */ _defaults__WEBPACK_IMPORTED_MODULE_1__.default),\n/* harmony export */ \"history\": () => (/* reexport safe */ _history__WEBPACK_IMPORTED_MODULE_2__.default),\n/* harmony export */ \"notifications\": () => (/* reexport safe */ _notifications__WEBPACK_IMPORTED_MODULE_3__.default),\n/* harmony export */ \"provider\": () => (/* reexport safe */ _provider__WEBPACK_IMPORTED_MODULE_4__.default),\n/* harmony export */ \"shows\": () => (/* reexport safe */ _shows__WEBPACK_IMPORTED_MODULE_5__.default),\n/* harmony export */ \"schedule\": () => (/* reexport safe */ _schedule__WEBPACK_IMPORTED_MODULE_6__.default),\n/* harmony export */ \"socket\": () => (/* reexport safe */ _socket__WEBPACK_IMPORTED_MODULE_7__.default),\n/* harmony export */ \"stats\": () => (/* reexport safe */ _stats__WEBPACK_IMPORTED_MODULE_8__.default),\n/* harmony export */ \"config\": () => (/* reexport safe */ _config__WEBPACK_IMPORTED_MODULE_9__.default),\n/* harmony export */ \"queue\": () => (/* reexport safe */ _queue__WEBPACK_IMPORTED_MODULE_10__.default)\n/* harmony export */ });\n/* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./auth */ \"./src/store/modules/auth.js\");\n/* harmony import */ var _defaults__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaults */ \"./src/store/modules/defaults.js\");\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./history */ \"./src/store/modules/history.js\");\n/* harmony import */ var _notifications__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./notifications */ \"./src/store/modules/notifications.js\");\n/* harmony import */ var _provider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./provider */ \"./src/store/modules/provider.js\");\n/* harmony import */ var _shows__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./shows */ \"./src/store/modules/shows.js\");\n/* harmony import */ var _schedule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./schedule */ \"./src/store/modules/schedule.js\");\n/* harmony import */ var _socket__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./socket */ \"./src/store/modules/socket.js\");\n/* harmony import */ var _stats__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./stats */ \"./src/store/modules/stats.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./config */ \"./src/store/modules/config/index.js\");\n/* harmony import */ var _queue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./queue */ \"./src/store/modules/queue.js\");\n\n\n\n\n\n\n\n\n\n\n // Export * from './configs/index.js';\n\n//# sourceURL=webpack://slim/./src/store/modules/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"auth\": () => (/* reexport safe */ _auth__WEBPACK_IMPORTED_MODULE_0__.default),\n/* harmony export */ \"defaults\": () => (/* reexport safe */ _defaults__WEBPACK_IMPORTED_MODULE_1__.default),\n/* harmony export */ \"history\": () => (/* reexport safe */ _history__WEBPACK_IMPORTED_MODULE_2__.default),\n/* harmony export */ \"notifications\": () => (/* reexport safe */ _notifications__WEBPACK_IMPORTED_MODULE_3__.default),\n/* harmony export */ \"provider\": () => (/* reexport safe */ _provider__WEBPACK_IMPORTED_MODULE_4__.default),\n/* harmony export */ \"recommended\": () => (/* reexport safe */ _recommended__WEBPACK_IMPORTED_MODULE_5__.default),\n/* harmony export */ \"shows\": () => (/* reexport safe */ _shows__WEBPACK_IMPORTED_MODULE_6__.default),\n/* harmony export */ \"schedule\": () => (/* reexport safe */ _schedule__WEBPACK_IMPORTED_MODULE_7__.default),\n/* harmony export */ \"socket\": () => (/* reexport safe */ _socket__WEBPACK_IMPORTED_MODULE_8__.default),\n/* harmony export */ \"stats\": () => (/* reexport safe */ _stats__WEBPACK_IMPORTED_MODULE_9__.default),\n/* harmony export */ \"config\": () => (/* reexport safe */ _config__WEBPACK_IMPORTED_MODULE_10__.default),\n/* harmony export */ \"queue\": () => (/* reexport safe */ _queue__WEBPACK_IMPORTED_MODULE_11__.default)\n/* harmony export */ });\n/* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./auth */ \"./src/store/modules/auth.js\");\n/* harmony import */ var _defaults__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaults */ \"./src/store/modules/defaults.js\");\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./history */ \"./src/store/modules/history.js\");\n/* harmony import */ var _notifications__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./notifications */ \"./src/store/modules/notifications.js\");\n/* harmony import */ var _provider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./provider */ \"./src/store/modules/provider.js\");\n/* harmony import */ var _recommended__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./recommended */ \"./src/store/modules/recommended.js\");\n/* harmony import */ var _shows__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./shows */ \"./src/store/modules/shows.js\");\n/* harmony import */ var _schedule__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./schedule */ \"./src/store/modules/schedule.js\");\n/* harmony import */ var _socket__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./socket */ \"./src/store/modules/socket.js\");\n/* harmony import */ var _stats__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./stats */ \"./src/store/modules/stats.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./config */ \"./src/store/modules/config/index.js\");\n/* harmony import */ var _queue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./queue */ \"./src/store/modules/queue.js\");\n\n\n\n\n\n\n\n\n\n\n\n // Export * from './configs/index.js';\n\n//# sourceURL=webpack://slim/./src/store/modules/index.js?"); /***/ }), @@ -1515,6 +1559,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/store/modules/recommended.js": +/*!******************************************!*\ + !*** ./src/store/modules/recommended.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _mutation_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mutation-types */ \"./src/store/mutation-types.js\");\n\n\n\nconst IMDB = 10;\nconst ANIDB = 11;\nconst TRAKT = 12;\nconst ANILIST = 13;\nconst state = {\n shows: [],\n trakt: {\n removedFromMedusa: [],\n blacklistEnabled: false,\n availableLists: []\n },\n categories: {},\n externals: {\n IMDB,\n ANIDB,\n TRAKT,\n ANILIST\n }\n};\nconst mutations = {\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.ADD_RECOMMENDED_SHOW](state, show) {\n const existingShow = state.shows.find(({\n seriesId,\n source\n }) => Number(show.seriesId[show.source]) === Number(seriesId[source]));\n\n if (!existingShow) {\n console.debug(`Adding ${show.title || show.source + String(show.seriesId)} as it wasn't found in the shows array`, show);\n state.shows.push(show);\n return;\n } // Merge new recommended 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.source + String(show.seriesId)} in shows array attempting merge`);\n const newShow = { ...existingShow,\n ...show\n }; // Update state\n\n vue__WEBPACK_IMPORTED_MODULE_2__.default.set(state.shows, state.shows.indexOf(existingShow), newShow);\n console.debug(`Merged ${newShow.title || newShow.source + String(newShow.seriesId)}`, newShow);\n },\n\n [_mutation_types__WEBPACK_IMPORTED_MODULE_1__.SET_RECOMMENDED_SHOWS](state, data) {\n state.trakt.removedFromMedusa = data.trakt.removedFromMedusa;\n state.trakt.blacklistEnabled = data.trakt.blacklistEnabled;\n state.trakt.availableLists = data.trakt.availableLists;\n state.categories = data.categories;\n state.shows = data.shows;\n }\n\n};\nconst getters = {};\nconst actions = {\n /**\n * Get recommended shows from API and commit them to the store.\n *\n * @param {*} context - The store context.\n * @param {String} identifier - Identifier for the recommended shows list.\n * @Param {String} params - Filter params, for getting a specific recommended list type.\n * @returns {(undefined|Promise)} undefined if `shows` was provided or the API response if not.\n */\n getRecommendedShows({\n commit\n }, identifier, params) {\n params = {};\n identifier = identifier ? identifier : '';\n return _api__WEBPACK_IMPORTED_MODULE_0__.api.get(`/recommended/${identifier}`, {\n params\n }).then(response => {\n commit(_mutation_types__WEBPACK_IMPORTED_MODULE_1__.SET_RECOMMENDED_SHOWS, response.data);\n });\n }\n\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n state,\n mutations,\n getters,\n actions\n});\n\n//# sourceURL=webpack://slim/./src/store/modules/recommended.js?"); + +/***/ }), + /***/ "./src/store/modules/schedule.js": /*!***************************************!*\ !*** ./src/store/modules/schedule.js ***! @@ -1566,7 +1621,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"LOGIN_PENDING\": () => (/* binding */ LOGIN_PENDING),\n/* harmony export */ \"LOGIN_SUCCESS\": () => (/* binding */ LOGIN_SUCCESS),\n/* harmony export */ \"LOGIN_FAILED\": () => (/* binding */ LOGIN_FAILED),\n/* harmony export */ \"LOGOUT\": () => (/* binding */ LOGOUT),\n/* harmony export */ \"REFRESH_TOKEN\": () => (/* binding */ REFRESH_TOKEN),\n/* harmony export */ \"REMOVE_AUTH_ERROR\": () => (/* binding */ REMOVE_AUTH_ERROR),\n/* harmony export */ \"SOCKET_ONOPEN\": () => (/* binding */ SOCKET_ONOPEN),\n/* harmony export */ \"SOCKET_ONCLOSE\": () => (/* binding */ SOCKET_ONCLOSE),\n/* harmony export */ \"SOCKET_ONERROR\": () => (/* binding */ SOCKET_ONERROR),\n/* harmony export */ \"SOCKET_ONMESSAGE\": () => (/* binding */ SOCKET_ONMESSAGE),\n/* harmony export */ \"SOCKET_RECONNECT\": () => (/* binding */ SOCKET_RECONNECT),\n/* harmony export */ \"SOCKET_RECONNECT_ERROR\": () => (/* binding */ SOCKET_RECONNECT_ERROR),\n/* harmony export */ \"NOTIFICATIONS_ENABLED\": () => (/* binding */ NOTIFICATIONS_ENABLED),\n/* harmony export */ \"NOTIFICATIONS_DISABLED\": () => (/* binding */ NOTIFICATIONS_DISABLED),\n/* harmony export */ \"ADD_CONFIG\": () => (/* binding */ ADD_CONFIG),\n/* harmony export */ \"UPDATE_LAYOUT_LOCAL\": () => (/* binding */ UPDATE_LAYOUT_LOCAL),\n/* harmony export */ \"ADD_HISTORY\": () => (/* binding */ ADD_HISTORY),\n/* harmony export */ \"ADD_HISTORY_ROW\": () => (/* binding */ ADD_HISTORY_ROW),\n/* harmony export */ \"ADD_SHOW\": () => (/* binding */ ADD_SHOW),\n/* harmony export */ \"ADD_SHOW_CONFIG\": () => (/* binding */ ADD_SHOW_CONFIG),\n/* harmony export */ \"ADD_SHOWS\": () => (/* binding */ ADD_SHOWS),\n/* harmony export */ \"ADD_SHOW_EPISODE\": () => (/* binding */ ADD_SHOW_EPISODE),\n/* harmony export */ \"ADD_STATS\": () => (/* binding */ ADD_STATS),\n/* harmony export */ \"ADD_REMOTE_BRANCHES\": () => (/* binding */ ADD_REMOTE_BRANCHES),\n/* harmony export */ \"SET_STATS\": () => (/* binding */ SET_STATS),\n/* harmony export */ \"SET_MAX_DOWNLOAD_COUNT\": () => (/* binding */ SET_MAX_DOWNLOAD_COUNT),\n/* harmony export */ \"ADD_SHOW_SCENE_EXCEPTION\": () => (/* binding */ ADD_SHOW_SCENE_EXCEPTION),\n/* harmony export */ \"REMOVE_SHOW_SCENE_EXCEPTION\": () => (/* binding */ REMOVE_SHOW_SCENE_EXCEPTION),\n/* harmony export */ \"ADD_SHOW_HISTORY\": () => (/* binding */ ADD_SHOW_HISTORY),\n/* harmony export */ \"ADD_SHOW_EPISODE_HISTORY\": () => (/* binding */ ADD_SHOW_EPISODE_HISTORY),\n/* harmony export */ \"ADD_PROVIDER\": () => (/* binding */ ADD_PROVIDER),\n/* harmony export */ \"ADD_PROVIDERS\": () => (/* binding */ ADD_PROVIDERS),\n/* harmony export */ \"ADD_PROVIDER_CACHE\": () => (/* binding */ ADD_PROVIDER_CACHE),\n/* harmony export */ \"ADD_SEARCH_RESULTS\": () => (/* binding */ ADD_SEARCH_RESULTS),\n/* harmony export */ \"ADD_QUEUE_ITEM\": () => (/* binding */ ADD_QUEUE_ITEM),\n/* harmony export */ \"ADD_SHOW_QUEUE_ITEM\": () => (/* binding */ ADD_SHOW_QUEUE_ITEM),\n/* harmony export */ \"REMOVE_SHOW\": () => (/* binding */ REMOVE_SHOW),\n/* harmony export */ \"REMOVE_PROVIDER\": () => (/* binding */ REMOVE_PROVIDER),\n/* harmony export */ \"UPDATE_SHOWLIST_DEFAULT\": () => (/* binding */ UPDATE_SHOWLIST_DEFAULT),\n/* harmony export */ \"ADD_SCHEDULE\": () => (/* binding */ ADD_SCHEDULE)\n/* harmony export */ });\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 UPDATE_LAYOUT_LOCAL = '⚙️ Local layout updated in store';\nconst ADD_REMOTE_BRANCHES = '⚙️ Add git remote branches to store';\nconst ADD_SHOW = '📺 Show added to store';\nconst ADD_SHOW_CONFIG = '📺 Show config updated in store';\nconst ADD_SHOWS = '📺 Multiple Shows added to store in bulk';\nconst ADD_SHOW_EPISODE = '📺 Shows season with episodes added to store';\nconst ADD_STATS = 'ℹ️ Statistics added to store';\nconst SET_STATS = 'SET_STATS';\nconst SET_MAX_DOWNLOAD_COUNT = 'SET_MAX_DOWNLOAD_COUNT';\nconst ADD_SHOW_SCENE_EXCEPTION = '📺 Add a scene exception';\nconst REMOVE_SHOW_SCENE_EXCEPTION = '📺 Remove a scene exception';\nconst ADD_HISTORY = '📺 History added to store';\nconst ADD_HISTORY_ROW = '📺 History row added to store';\nconst ADD_SHOW_HISTORY = '📺 Show specific History added to store';\nconst ADD_SHOW_EPISODE_HISTORY = \"📺 Show's episode specific History added to store\";\nconst ADD_PROVIDER = '⛽ Provider added to store';\nconst ADD_PROVIDERS = '⛽ Provider list added to store';\nconst ADD_PROVIDER_CACHE = '⛽ Provider cache results added to store';\nconst ADD_SEARCH_RESULTS = '⛽ New search results added for provider';\nconst ADD_QUEUE_ITEM = '🔍 Search queue item updated';\nconst ADD_SHOW_QUEUE_ITEM = '📺 Show queue item added to store';\nconst REMOVE_SHOW = '📺 Show removed from store';\nconst REMOVE_PROVIDER = '⛽ Provider removed';\nconst UPDATE_SHOWLIST_DEFAULT = '⚙️ Anime config showlist default updated';\nconst ADD_SCHEDULE = '📅 Schedule information added';\n\n\n//# sourceURL=webpack://slim/./src/store/mutation-types.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"LOGIN_PENDING\": () => (/* binding */ LOGIN_PENDING),\n/* harmony export */ \"LOGIN_SUCCESS\": () => (/* binding */ LOGIN_SUCCESS),\n/* harmony export */ \"LOGIN_FAILED\": () => (/* binding */ LOGIN_FAILED),\n/* harmony export */ \"LOGOUT\": () => (/* binding */ LOGOUT),\n/* harmony export */ \"REFRESH_TOKEN\": () => (/* binding */ REFRESH_TOKEN),\n/* harmony export */ \"REMOVE_AUTH_ERROR\": () => (/* binding */ REMOVE_AUTH_ERROR),\n/* harmony export */ \"SOCKET_ONOPEN\": () => (/* binding */ SOCKET_ONOPEN),\n/* harmony export */ \"SOCKET_ONCLOSE\": () => (/* binding */ SOCKET_ONCLOSE),\n/* harmony export */ \"SOCKET_ONERROR\": () => (/* binding */ SOCKET_ONERROR),\n/* harmony export */ \"SOCKET_ONMESSAGE\": () => (/* binding */ SOCKET_ONMESSAGE),\n/* harmony export */ \"SOCKET_RECONNECT\": () => (/* binding */ SOCKET_RECONNECT),\n/* harmony export */ \"SOCKET_RECONNECT_ERROR\": () => (/* binding */ SOCKET_RECONNECT_ERROR),\n/* harmony export */ \"NOTIFICATIONS_ENABLED\": () => (/* binding */ NOTIFICATIONS_ENABLED),\n/* harmony export */ \"NOTIFICATIONS_DISABLED\": () => (/* binding */ NOTIFICATIONS_DISABLED),\n/* harmony export */ \"ADD_CONFIG\": () => (/* binding */ ADD_CONFIG),\n/* harmony export */ \"UPDATE_LAYOUT_LOCAL\": () => (/* binding */ UPDATE_LAYOUT_LOCAL),\n/* harmony export */ \"ADD_HISTORY\": () => (/* binding */ ADD_HISTORY),\n/* harmony export */ \"ADD_HISTORY_ROW\": () => (/* binding */ ADD_HISTORY_ROW),\n/* harmony export */ \"ADD_SHOW\": () => (/* binding */ ADD_SHOW),\n/* harmony export */ \"ADD_STATS\": () => (/* binding */ ADD_STATS),\n/* harmony export */ \"ADD_SHOW_CONFIG\": () => (/* binding */ ADD_SHOW_CONFIG),\n/* harmony export */ \"ADD_RECOMMENDED_SHOW\": () => (/* binding */ ADD_RECOMMENDED_SHOW),\n/* harmony export */ \"SET_RECOMMENDED_SHOWS\": () => (/* binding */ SET_RECOMMENDED_SHOWS),\n/* harmony export */ \"ADD_SHOWS\": () => (/* binding */ ADD_SHOWS),\n/* harmony export */ \"ADD_SHOW_EPISODE\": () => (/* binding */ ADD_SHOW_EPISODE),\n/* harmony export */ \"ADD_REMOTE_BRANCHES\": () => (/* binding */ ADD_REMOTE_BRANCHES),\n/* harmony export */ \"SET_STATS\": () => (/* binding */ SET_STATS),\n/* harmony export */ \"SET_MAX_DOWNLOAD_COUNT\": () => (/* binding */ SET_MAX_DOWNLOAD_COUNT),\n/* harmony export */ \"ADD_SHOW_SCENE_EXCEPTION\": () => (/* binding */ ADD_SHOW_SCENE_EXCEPTION),\n/* harmony export */ \"REMOVE_SHOW_SCENE_EXCEPTION\": () => (/* binding */ REMOVE_SHOW_SCENE_EXCEPTION),\n/* harmony export */ \"ADD_SHOW_HISTORY\": () => (/* binding */ ADD_SHOW_HISTORY),\n/* harmony export */ \"ADD_SHOW_EPISODE_HISTORY\": () => (/* binding */ ADD_SHOW_EPISODE_HISTORY),\n/* harmony export */ \"ADD_PROVIDER\": () => (/* binding */ ADD_PROVIDER),\n/* harmony export */ \"ADD_PROVIDERS\": () => (/* binding */ ADD_PROVIDERS),\n/* harmony export */ \"ADD_PROVIDER_CACHE\": () => (/* binding */ ADD_PROVIDER_CACHE),\n/* harmony export */ \"ADD_SEARCH_RESULTS\": () => (/* binding */ ADD_SEARCH_RESULTS),\n/* harmony export */ \"ADD_QUEUE_ITEM\": () => (/* binding */ ADD_QUEUE_ITEM),\n/* harmony export */ \"ADD_SHOW_QUEUE_ITEM\": () => (/* binding */ ADD_SHOW_QUEUE_ITEM),\n/* harmony export */ \"REMOVE_SHOW\": () => (/* binding */ REMOVE_SHOW),\n/* harmony export */ \"REMOVE_PROVIDER\": () => (/* binding */ REMOVE_PROVIDER),\n/* harmony export */ \"UPDATE_SHOWLIST_DEFAULT\": () => (/* binding */ UPDATE_SHOWLIST_DEFAULT),\n/* harmony export */ \"ADD_SCHEDULE\": () => (/* binding */ ADD_SCHEDULE)\n/* harmony export */ });\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 UPDATE_LAYOUT_LOCAL = '⚙️ Local layout updated in store';\nconst ADD_REMOTE_BRANCHES = '⚙️ Add git remote branches to store';\nconst ADD_SHOW = '📺 Show added to store';\nconst ADD_SHOW_CONFIG = '📺 Show config updated in store';\nconst ADD_SHOWS = '📺 Multiple Shows added to store in bulk';\nconst ADD_SHOW_EPISODE = '📺 Shows season with episodes added to store';\nconst ADD_STATS = 'ℹ️ Statistics added to store';\nconst ADD_RECOMMENDED_SHOW = '📺 Recommended Show added to store';\nconst SET_RECOMMENDED_SHOWS = '📺 Recommended Shows added to store';\nconst SET_STATS = 'SET_STATS';\nconst SET_MAX_DOWNLOAD_COUNT = 'SET_MAX_DOWNLOAD_COUNT';\nconst ADD_SHOW_SCENE_EXCEPTION = '📺 Add a scene exception';\nconst REMOVE_SHOW_SCENE_EXCEPTION = '📺 Remove a scene exception';\nconst ADD_HISTORY = '📺 History added to store';\nconst ADD_HISTORY_ROW = '📺 History row added to store';\nconst ADD_SHOW_HISTORY = '📺 Show specific History added to store';\nconst ADD_SHOW_EPISODE_HISTORY = \"📺 Show's episode specific History added to store\";\nconst ADD_PROVIDER = '⛽ Provider added to store';\nconst ADD_PROVIDERS = '⛽ Provider list added to store';\nconst ADD_PROVIDER_CACHE = '⛽ Provider cache results added to store';\nconst ADD_SEARCH_RESULTS = '⛽ New search results added for provider';\nconst ADD_QUEUE_ITEM = '🔍 Search queue item updated';\nconst ADD_SHOW_QUEUE_ITEM = '📺 Show queue item added to store';\nconst REMOVE_SHOW = '📺 Show removed from store';\nconst REMOVE_PROVIDER = '⛽ Provider removed';\nconst UPDATE_SHOWLIST_DEFAULT = '⚙️ Anime config showlist default updated';\nconst ADD_SCHEDULE = '📅 Schedule information added';\n\n\n//# sourceURL=webpack://slim/./src/store/mutation-types.js?"); /***/ }), @@ -1659,7 +1714,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. \****************************************************************************************************************************************************************************************************************************************************************************/ /***/ ((module, __unused_webpack_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\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/*\\n@NOTE: This fixes the header blocking elements when using a hash link\\ne.g. displayShow?showslug=tvdb83462#season-5\\n*/\\n[false-link]::before {\\n content: '';\\n display: block;\\n position: absolute;\\n height: 100px;\\n margin-top: -100px;\\n z-index: -100;\\n}\\n.router-link,\\n.router-link-active {\\n cursor: pointer;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/components/helpers/app-link.vue?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??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\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/*\\n@NOTE: This fixes the header blocking elements when using a hash link\\ne.g. displayShow?showslug=tvdb83462#season-5\\n*/\\n[false-link]::before {\\n content: '';\\n display: block;\\n position: absolute;\\n height: 100px;\\n margin-top: -100px;\\n z-index: -100;\\n}\\n.router-link,\\n.router-link-active {\\n cursor: pointer;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/components/helpers/app-link.vue?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -1863,6 +1918,16 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /***/ }), +/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/select-trakt-lists.vue?vue&type=style&index=0&id=38f4c8dd&scoped=true&lang=css&": +/*!**************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/select-trakt-lists.vue?vue&type=style&index=0&id=38f4c8dd&scoped=true&lang=css& ***! + \**************************************************************************************************************************************************************************************************************************************************************************************************************/ +/***/ ((module, __unused_webpack_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\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\nul[data-v-38f4c8dd] {\\n padding-left: 0;\\n}\\nli[data-v-38f4c8dd] {\\n list-style-type: none;\\n}\\n.trakt-list-group[data-v-38f4c8dd] {\\n display: inline-flex;\\n height: 25px;\\n}\\ninput[data-v-38f4c8dd] {\\n display: inline-block;\\n box-sizing: border-box;\\n}\\ninput.available-list[data-v-38f4c8dd] {\\n height: 22px;\\n}\\ninput[type=checkbox][data-v-38f4c8dd] {\\n width: 20px;\\n height: 20px;\\n}\\n.max-width[data-v-38f4c8dd] {\\n max-width: 450px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/components/helpers/select-trakt-lists.vue?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/show-selector.vue?vue&type=style&index=0&lang=css&": /*!*********************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/show-selector.vue?vue&type=style&index=0&lang=css& ***! @@ -1943,6 +2008,16 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /***/ }), +/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/manage-searches.vue?vue&type=style&index=0&id=30b442de&scoped=true&lang=css&": +/*!***************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/manage-searches.vue?vue&type=style&index=0&id=30b442de&scoped=true&lang=css& ***! + \***************************************************************************************************************************************************************************************************************************************************************************************************/ +/***/ ((module, __unused_webpack_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\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.recommended-list span[data-v-30b442de] {\\n cursor: pointer;\\n color: #337ab7;\\n text-decoration: none;\\n}\\n.recommended-list span[data-v-30b442de]:focus,\\n.recommended-list span[data-v-30b442de]:hover {\\n text-decoration: underline;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/components/manage-searches.vue?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/modals/existing-show-dialog.vue?vue&type=style&index=0&id=a2035302&scoped=true&lang=css&": /*!***************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/modals/existing-show-dialog.vue?vue&type=style&index=0&id=a2035302&scoped=true&lang=css& ***! @@ -1973,6 +2048,26 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../. /***/ }), +/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended-poster.vue?vue&type=style&index=0&id=61ca7b8f&scoped=true&lang=css&": +/*!******************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended-poster.vue?vue&type=style&index=0&id=61ca7b8f&scoped=true&lang=css& ***! + \******************************************************************************************************************************************************************************************************************************************************************************************************/ +/***/ ((module, __unused_webpack_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\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.tag-container[data-v-61ca7b8f] {\\n opacity: 0;\\n position: absolute;\\n top: 3px;\\n right: 0;\\n -webkit-transition: opacity 0.2s ease-in-out;\\n -moz-transition: opacity 0.2s ease-in-out;\\n -ms-transition: opacity 0.2s ease-in-out;\\n -o-transition: opacity 0.2s ease-in-out;\\n transition: opacity 0.2s ease-in-out;\\n}\\n.recommended-image[data-v-61ca7b8f]:hover {\\n opacity: 0.9;\\n}\\n.recommended-image:hover .tag-container[data-v-61ca7b8f] {\\n display: block;\\n opacity: 0.9;\\n}\\nul.genre-tags[data-v-61ca7b8f] {\\n margin-right: 2px;\\n}\\nul.genre-tags > li[data-v-61ca7b8f] {\\n margin-right: 1px;\\n margin-bottom: 2px;\\n padding: 2px 4px;\\n background: rgb(21, 82, 143);\\n border-radius: 1px;\\n border: 1px solid rgb(17, 17, 17);\\n color: rgb(255, 255, 255);\\n font: 14px/18px \\\"Open Sans\\\", \\\"Helvetica Neue\\\", Helvetica, Arial, Geneva, sans-serif;\\n text-shadow: 0 1px rgb(0 0 0 / 80%);\\n float: right;\\n list-style: none;\\n}\\nselect.max-width[data-v-61ca7b8f] {\\n max-width: 430px;\\n}\\n.plot-overlay[data-v-61ca7b8f] {\\n opacity: 0.9;\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n bottom: 0;\\n overflow-y: auto;\\n background-color: rgb(51, 51, 51);\\n scrollbar-color: rgb(65, 0, 181) darkgrey;\\n scrollbar-width: thin;\\n}\\n.plot-overlay > span[data-v-61ca7b8f] {\\n padding: 2px 5px;\\n height: 100%;\\n display: block;\\n font-size: 11px;\\n}\\n.plot-overlay[data-v-61ca7b8f]::-webkit-scrollbar {\\n width: 6px; /* width of the entire scrollbar */\\n}\\n.plot-overlay[data-v-61ca7b8f]::-webkit-scrollbar-track {\\n background: darkgrey; /* color of the tracking area */\\n}\\n.plot-overlay[data-v-61ca7b8f]::-webkit-scrollbar-thumb {\\n background-color: rgb(65, 0, 181); /* color of the scroll thumb */\\n border-radius: 1px; /* roundness of the scroll thumb */\\n border: 0 solid rgb(5, 36, 249); /* creates padding around scroll thumb */\\n}\\n.recommended-image[data-v-61ca7b8f] {\\n position: relative;\\n overflow: hidden;\\n}\\n.recommended-image[data-v-61ca7b8f] .show-image {\\n height: 100%;\\n}\\n.show-image[data-v-61ca7b8f] {\\n height: 100%;\\n border-top-left-radius: 5px;\\n border-top-right-radius: 5px;\\n}\\n.toggle-plot[data-v-61ca7b8f] {\\n position: absolute;\\n right: 0;\\n top: 0;\\n z-index: 9999;\\n text-decoration: underline;\\n cursor: pointer;\\n background-color: rgb(51, 51, 51);\\n padding: 0 2px;\\n}\\n.plot-enter-active[data-v-61ca7b8f],\\n.plot-leave-active[data-v-61ca7b8f] {\\n -moz-transition-duration: 0.3s;\\n -webkit-transition-duration: 0.3s;\\n -o-transition-duration: 0.3s;\\n transition-duration: 0.3s;\\n -moz-transition-timing-function: ease-in;\\n -webkit-transition-timing-function: ease-in;\\n -o-transition-timing-function: ease-in;\\n transition-timing-function: ease-in;\\n}\\n.plot-enter-to[data-v-61ca7b8f],\\n.plot-leave[data-v-61ca7b8f] {\\n bottom: 0;\\n}\\n.plot-enter[data-v-61ca7b8f],\\n.plot-leave-to[data-v-61ca7b8f] {\\n bottom: -100%;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/components/recommended-poster.vue?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended.vue?vue&type=style&index=0&id=7226820a&scoped=true&lang=css&": +/*!***********************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended.vue?vue&type=style&index=0&id=7226820a&scoped=true&lang=css& ***! + \***********************************************************************************************************************************************************************************************************************************************************************************************/ +/***/ ((module, __unused_webpack_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\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.trakt-auth-container[data-v-7226820a] {\\n padding: 10px;\\n border: 1px solid rgb(255 255 255);\\n box-shadow: 5px 5px dimgrey;\\n}\\n.trakt-auth-container > .close-container[data-v-7226820a] {\\n position: absolute;\\n top: -24px;\\n right: 15px;\\n color: red;\\n}\\nspan.trakt-warning[data-v-7226820a] {\\n margin: 0 0 14px 0;\\n display: block;\\n color: red;\\n}\\n\\n\", \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___;\n\n\n//# sourceURL=webpack://slim/./src/components/recommended.vue?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3%5B0%5D.rules%5B0%5D.use%5B1%5D!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/root-dirs.vue?vue&type=style&index=0&lang=css&": /*!*********************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/root-dirs.vue?vue&type=style&index=0&lang=css& ***! @@ -2619,6 +2714,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/components/helpers/select-trakt-lists.vue": +/*!*******************************************************!*\ + !*** ./src/components/helpers/select-trakt-lists.vue ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _select_trakt_lists_vue_vue_type_template_id_38f4c8dd_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./select-trakt-lists.vue?vue&type=template&id=38f4c8dd&scoped=true& */ \"./src/components/helpers/select-trakt-lists.vue?vue&type=template&id=38f4c8dd&scoped=true&\");\n/* harmony import */ var _select_trakt_lists_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./select-trakt-lists.vue?vue&type=script&lang=js& */ \"./src/components/helpers/select-trakt-lists.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _select_trakt_lists_vue_vue_type_style_index_0_id_38f4c8dd_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./select-trakt-lists.vue?vue&type=style&index=0&id=38f4c8dd&scoped=true&lang=css& */ \"./src/components/helpers/select-trakt-lists.vue?vue&type=style&index=0&id=38f4c8dd&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n;\n\n\n/* normalize component */\n\nvar component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__.default)(\n _select_trakt_lists_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__.default,\n _select_trakt_lists_vue_vue_type_template_id_38f4c8dd_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render,\n _select_trakt_lists_vue_vue_type_template_id_38f4c8dd_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns,\n false,\n null,\n \"38f4c8dd\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/components/helpers/select-trakt-lists.vue\"\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports);\n\n//# sourceURL=webpack://slim/./src/components/helpers/select-trakt-lists.vue?"); + +/***/ }), + /***/ "./src/components/helpers/show-selector.vue": /*!**************************************************!*\ !*** ./src/components/helpers/show-selector.vue ***! @@ -2663,6 +2769,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/components/helpers/trakt-authentication.vue": +/*!*********************************************************!*\ + !*** ./src/components/helpers/trakt-authentication.vue ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _trakt_authentication_vue_vue_type_template_id_cd53d81a_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./trakt-authentication.vue?vue&type=template&id=cd53d81a&scoped=true& */ \"./src/components/helpers/trakt-authentication.vue?vue&type=template&id=cd53d81a&scoped=true&\");\n/* harmony import */ var _trakt_authentication_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./trakt-authentication.vue?vue&type=script&lang=js& */ \"./src/components/helpers/trakt-authentication.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n;\nvar component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__.default)(\n _trakt_authentication_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__.default,\n _trakt_authentication_vue_vue_type_template_id_cd53d81a_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render,\n _trakt_authentication_vue_vue_type_template_id_cd53d81a_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns,\n false,\n null,\n \"cd53d81a\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/components/helpers/trakt-authentication.vue\"\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports);\n\n//# sourceURL=webpack://slim/./src/components/helpers/trakt-authentication.vue?"); + +/***/ }), + /***/ "./src/components/history-compact.vue": /*!********************************************!*\ !*** ./src/components/history-compact.vue ***! @@ -2758,7 +2875,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _manage_searches_vue_vue_type_template_id_30b442de_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./manage-searches.vue?vue&type=template&id=30b442de&scoped=true& */ \"./src/components/manage-searches.vue?vue&type=template&id=30b442de&scoped=true&\");\n/* harmony import */ var _manage_searches_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./manage-searches.vue?vue&type=script&lang=js& */ \"./src/components/manage-searches.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n;\nvar component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__.default)(\n _manage_searches_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__.default,\n _manage_searches_vue_vue_type_template_id_30b442de_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render,\n _manage_searches_vue_vue_type_template_id_30b442de_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns,\n false,\n null,\n \"30b442de\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/components/manage-searches.vue\"\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports);\n\n//# sourceURL=webpack://slim/./src/components/manage-searches.vue?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _manage_searches_vue_vue_type_template_id_30b442de_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./manage-searches.vue?vue&type=template&id=30b442de&scoped=true& */ \"./src/components/manage-searches.vue?vue&type=template&id=30b442de&scoped=true&\");\n/* harmony import */ var _manage_searches_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./manage-searches.vue?vue&type=script&lang=js& */ \"./src/components/manage-searches.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _manage_searches_vue_vue_type_style_index_0_id_30b442de_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./manage-searches.vue?vue&type=style&index=0&id=30b442de&scoped=true&lang=css& */ \"./src/components/manage-searches.vue?vue&type=style&index=0&id=30b442de&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n;\n\n\n/* normalize component */\n\nvar component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__.default)(\n _manage_searches_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__.default,\n _manage_searches_vue_vue_type_template_id_30b442de_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render,\n _manage_searches_vue_vue_type_template_id_30b442de_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns,\n false,\n null,\n \"30b442de\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/components/manage-searches.vue\"\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports);\n\n//# sourceURL=webpack://slim/./src/components/manage-searches.vue?"); /***/ }), @@ -2806,6 +2923,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/components/recommended-poster.vue": +/*!***********************************************!*\ + !*** ./src/components/recommended-poster.vue ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _recommended_poster_vue_vue_type_template_id_61ca7b8f_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./recommended-poster.vue?vue&type=template&id=61ca7b8f&scoped=true& */ \"./src/components/recommended-poster.vue?vue&type=template&id=61ca7b8f&scoped=true&\");\n/* harmony import */ var _recommended_poster_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./recommended-poster.vue?vue&type=script&lang=js& */ \"./src/components/recommended-poster.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _recommended_poster_vue_vue_type_style_index_0_id_61ca7b8f_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./recommended-poster.vue?vue&type=style&index=0&id=61ca7b8f&scoped=true&lang=css& */ \"./src/components/recommended-poster.vue?vue&type=style&index=0&id=61ca7b8f&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n;\n\n\n/* normalize component */\n\nvar component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__.default)(\n _recommended_poster_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__.default,\n _recommended_poster_vue_vue_type_template_id_61ca7b8f_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render,\n _recommended_poster_vue_vue_type_template_id_61ca7b8f_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns,\n false,\n null,\n \"61ca7b8f\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/components/recommended-poster.vue\"\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports);\n\n//# sourceURL=webpack://slim/./src/components/recommended-poster.vue?"); + +/***/ }), + +/***/ "./src/components/recommended.vue": +/*!****************************************!*\ + !*** ./src/components/recommended.vue ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _recommended_vue_vue_type_template_id_7226820a_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./recommended.vue?vue&type=template&id=7226820a&scoped=true& */ \"./src/components/recommended.vue?vue&type=template&id=7226820a&scoped=true&\");\n/* harmony import */ var _recommended_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./recommended.vue?vue&type=script&lang=js& */ \"./src/components/recommended.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _recommended_vue_vue_type_style_index_0_id_7226820a_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./recommended.vue?vue&type=style&index=0&id=7226820a&scoped=true&lang=css& */ \"./src/components/recommended.vue?vue&type=style&index=0&id=7226820a&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n;\n\n\n/* normalize component */\n\nvar component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__.default)(\n _recommended_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__.default,\n _recommended_vue_vue_type_template_id_7226820a_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render,\n _recommended_vue_vue_type_template_id_7226820a_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns,\n false,\n null,\n \"7226820a\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/components/recommended.vue\"\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports);\n\n//# sourceURL=webpack://slim/./src/components/recommended.vue?"); + +/***/ }), + /***/ "./src/components/restart.vue": /*!************************************!*\ !*** ./src/components/restart.vue ***! @@ -3532,6 +3671,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/components/helpers/select-trakt-lists.vue?vue&type=script&lang=js&": +/*!********************************************************************************!*\ + !*** ./src/components/helpers/select-trakt-lists.vue?vue&type=script&lang=js& ***! + \********************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_1_0_rules_0_node_modules_vue_loader_lib_index_js_vue_loader_options_select_trakt_lists_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./select-trakt-lists.vue?vue&type=script&lang=js& */ \"./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/select-trakt-lists.vue?vue&type=script&lang=js&\");\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_babel_loader_lib_index_js_clonedRuleSet_1_0_rules_0_node_modules_vue_loader_lib_index_js_vue_loader_options_select_trakt_lists_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__.default); \n\n//# sourceURL=webpack://slim/./src/components/helpers/select-trakt-lists.vue?"); + +/***/ }), + /***/ "./src/components/helpers/show-selector.vue?vue&type=script&lang=js&": /*!***************************************************************************!*\ !*** ./src/components/helpers/show-selector.vue?vue&type=script&lang=js& ***! @@ -3576,6 +3726,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/components/helpers/trakt-authentication.vue?vue&type=script&lang=js&": +/*!**********************************************************************************!*\ + !*** ./src/components/helpers/trakt-authentication.vue?vue&type=script&lang=js& ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_1_0_rules_0_node_modules_vue_loader_lib_index_js_vue_loader_options_trakt_authentication_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./trakt-authentication.vue?vue&type=script&lang=js& */ \"./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/trakt-authentication.vue?vue&type=script&lang=js&\");\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_babel_loader_lib_index_js_clonedRuleSet_1_0_rules_0_node_modules_vue_loader_lib_index_js_vue_loader_options_trakt_authentication_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__.default); \n\n//# sourceURL=webpack://slim/./src/components/helpers/trakt-authentication.vue?"); + +/***/ }), + /***/ "./src/components/history-compact.vue?vue&type=script&lang=js&": /*!*********************************************************************!*\ !*** ./src/components/history-compact.vue?vue&type=script&lang=js& ***! @@ -3719,6 +3880,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/components/recommended-poster.vue?vue&type=script&lang=js&": +/*!************************************************************************!*\ + !*** ./src/components/recommended-poster.vue?vue&type=script&lang=js& ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_1_0_rules_0_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_poster_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./recommended-poster.vue?vue&type=script&lang=js& */ \"./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended-poster.vue?vue&type=script&lang=js&\");\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_babel_loader_lib_index_js_clonedRuleSet_1_0_rules_0_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_poster_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__.default); \n\n//# sourceURL=webpack://slim/./src/components/recommended-poster.vue?"); + +/***/ }), + +/***/ "./src/components/recommended.vue?vue&type=script&lang=js&": +/*!*****************************************************************!*\ + !*** ./src/components/recommended.vue?vue&type=script&lang=js& ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_1_0_rules_0_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./recommended.vue?vue&type=script&lang=js& */ \"./node_modules/babel-loader/lib/index.js??clonedRuleSet-1[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended.vue?vue&type=script&lang=js&\");\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_babel_loader_lib_index_js_clonedRuleSet_1_0_rules_0_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__.default); \n\n//# sourceURL=webpack://slim/./src/components/recommended.vue?"); + +/***/ }), + /***/ "./src/components/restart.vue?vue&type=script&lang=js&": /*!*************************************************************!*\ !*** ./src/components/restart.vue?vue&type=script&lang=js& ***! @@ -4445,6 +4628,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/components/helpers/select-trakt-lists.vue?vue&type=template&id=38f4c8dd&scoped=true&": +/*!**************************************************************************************************!*\ + !*** ./src/components/helpers/select-trakt-lists.vue?vue&type=template&id=38f4c8dd&scoped=true& ***! + \**************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_select_trakt_lists_vue_vue_type_template_id_38f4c8dd_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render),\n/* harmony export */ \"staticRenderFns\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_select_trakt_lists_vue_vue_type_template_id_38f4c8dd_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns)\n/* harmony export */ });\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_select_trakt_lists_vue_vue_type_template_id_38f4c8dd_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./select-trakt-lists.vue?vue&type=template&id=38f4c8dd&scoped=true& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/select-trakt-lists.vue?vue&type=template&id=38f4c8dd&scoped=true&\");\n\n\n//# sourceURL=webpack://slim/./src/components/helpers/select-trakt-lists.vue?"); + +/***/ }), + /***/ "./src/components/helpers/show-selector.vue?vue&type=template&id=6e81af76&": /*!*********************************************************************************!*\ !*** ./src/components/helpers/show-selector.vue?vue&type=template&id=6e81af76& ***! @@ -4489,6 +4683,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/components/helpers/trakt-authentication.vue?vue&type=template&id=cd53d81a&scoped=true&": +/*!****************************************************************************************************!*\ + !*** ./src/components/helpers/trakt-authentication.vue?vue&type=template&id=cd53d81a&scoped=true& ***! + \****************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_trakt_authentication_vue_vue_type_template_id_cd53d81a_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render),\n/* harmony export */ \"staticRenderFns\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_trakt_authentication_vue_vue_type_template_id_cd53d81a_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns)\n/* harmony export */ });\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_trakt_authentication_vue_vue_type_template_id_cd53d81a_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./trakt-authentication.vue?vue&type=template&id=cd53d81a&scoped=true& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/trakt-authentication.vue?vue&type=template&id=cd53d81a&scoped=true&\");\n\n\n//# sourceURL=webpack://slim/./src/components/helpers/trakt-authentication.vue?"); + +/***/ }), + /***/ "./src/components/history-compact.vue?vue&type=template&id=899ba7ec&scoped=true&": /*!***************************************************************************************!*\ !*** ./src/components/history-compact.vue?vue&type=template&id=899ba7ec&scoped=true& ***! @@ -4632,6 +4837,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/components/recommended-poster.vue?vue&type=template&id=61ca7b8f&scoped=true&": +/*!******************************************************************************************!*\ + !*** ./src/components/recommended-poster.vue?vue&type=template&id=61ca7b8f&scoped=true& ***! + \******************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_poster_vue_vue_type_template_id_61ca7b8f_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render),\n/* harmony export */ \"staticRenderFns\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_poster_vue_vue_type_template_id_61ca7b8f_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns)\n/* harmony export */ });\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_poster_vue_vue_type_template_id_61ca7b8f_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./recommended-poster.vue?vue&type=template&id=61ca7b8f&scoped=true& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended-poster.vue?vue&type=template&id=61ca7b8f&scoped=true&\");\n\n\n//# sourceURL=webpack://slim/./src/components/recommended-poster.vue?"); + +/***/ }), + +/***/ "./src/components/recommended.vue?vue&type=template&id=7226820a&scoped=true&": +/*!***********************************************************************************!*\ + !*** ./src/components/recommended.vue?vue&type=template&id=7226820a&scoped=true& ***! + \***********************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_vue_vue_type_template_id_7226820a_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render),\n/* harmony export */ \"staticRenderFns\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_vue_vue_type_template_id_7226820a_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns)\n/* harmony export */ });\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_vue_vue_type_template_id_7226820a_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./recommended.vue?vue&type=template&id=7226820a&scoped=true& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended.vue?vue&type=template&id=7226820a&scoped=true&\");\n\n\n//# sourceURL=webpack://slim/./src/components/recommended.vue?"); + +/***/ }), + /***/ "./src/components/restart.vue?vue&type=template&id=625a88af&": /*!*******************************************************************!*\ !*** ./src/components/restart.vue?vue&type=template&id=625a88af& ***! @@ -5149,6 +5376,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod /***/ }), +/***/ "./src/components/helpers/select-trakt-lists.vue?vue&type=style&index=0&id=38f4c8dd&scoped=true&lang=css&": +/*!****************************************************************************************************************!*\ + !*** ./src/components/helpers/select-trakt-lists.vue?vue&type=style&index=0&id=38f4c8dd&scoped=true&lang=css& ***! + \****************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_select_trakt_lists_vue_vue_type_style_index_0_id_38f4c8dd_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-style-loader/index.js!../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./select-trakt-lists.vue?vue&type=style&index=0&id=38f4c8dd&scoped=true&lang=css& */ \"./node_modules/vue-style-loader/index.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/select-trakt-lists.vue?vue&type=style&index=0&id=38f4c8dd&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_select_trakt_lists_vue_vue_type_style_index_0_id_38f4c8dd_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_select_trakt_lists_vue_vue_type_style_index_0_id_38f4c8dd_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_select_trakt_lists_vue_vue_type_style_index_0_id_38f4c8dd_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== \"default\") __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_select_trakt_lists_vue_vue_type_style_index_0_id_38f4c8dd_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n\n\n//# sourceURL=webpack://slim/./src/components/helpers/select-trakt-lists.vue?"); + +/***/ }), + /***/ "./src/components/helpers/show-selector.vue?vue&type=style&index=0&lang=css&": /*!***********************************************************************************!*\ !*** ./src/components/helpers/show-selector.vue?vue&type=style&index=0&lang=css& ***! @@ -5237,6 +5475,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod /***/ }), +/***/ "./src/components/manage-searches.vue?vue&type=style&index=0&id=30b442de&scoped=true&lang=css&": +/*!*****************************************************************************************************!*\ + !*** ./src/components/manage-searches.vue?vue&type=style&index=0&id=30b442de&scoped=true&lang=css& ***! + \*****************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_manage_searches_vue_vue_type_style_index_0_id_30b442de_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-style-loader/index.js!../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./manage-searches.vue?vue&type=style&index=0&id=30b442de&scoped=true&lang=css& */ \"./node_modules/vue-style-loader/index.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/manage-searches.vue?vue&type=style&index=0&id=30b442de&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_manage_searches_vue_vue_type_style_index_0_id_30b442de_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_manage_searches_vue_vue_type_style_index_0_id_30b442de_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_manage_searches_vue_vue_type_style_index_0_id_30b442de_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== \"default\") __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_manage_searches_vue_vue_type_style_index_0_id_30b442de_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n\n\n//# sourceURL=webpack://slim/./src/components/manage-searches.vue?"); + +/***/ }), + /***/ "./src/components/modals/existing-show-dialog.vue?vue&type=style&index=0&id=a2035302&scoped=true&lang=css&": /*!*****************************************************************************************************************!*\ !*** ./src/components/modals/existing-show-dialog.vue?vue&type=style&index=0&id=a2035302&scoped=true&lang=css& ***! @@ -5270,6 +5519,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod /***/ }), +/***/ "./src/components/recommended-poster.vue?vue&type=style&index=0&id=61ca7b8f&scoped=true&lang=css&": +/*!********************************************************************************************************!*\ + !*** ./src/components/recommended-poster.vue?vue&type=style&index=0&id=61ca7b8f&scoped=true&lang=css& ***! + \********************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_poster_vue_vue_type_style_index_0_id_61ca7b8f_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-style-loader/index.js!../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./recommended-poster.vue?vue&type=style&index=0&id=61ca7b8f&scoped=true&lang=css& */ \"./node_modules/vue-style-loader/index.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended-poster.vue?vue&type=style&index=0&id=61ca7b8f&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_poster_vue_vue_type_style_index_0_id_61ca7b8f_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_poster_vue_vue_type_style_index_0_id_61ca7b8f_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_poster_vue_vue_type_style_index_0_id_61ca7b8f_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== \"default\") __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_poster_vue_vue_type_style_index_0_id_61ca7b8f_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n\n\n//# sourceURL=webpack://slim/./src/components/recommended-poster.vue?"); + +/***/ }), + +/***/ "./src/components/recommended.vue?vue&type=style&index=0&id=7226820a&scoped=true&lang=css&": +/*!*************************************************************************************************!*\ + !*** ./src/components/recommended.vue?vue&type=style&index=0&id=7226820a&scoped=true&lang=css& ***! + \*************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_vue_vue_type_style_index_0_id_7226820a_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-style-loader/index.js!../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./recommended.vue?vue&type=style&index=0&id=7226820a&scoped=true&lang=css& */ \"./node_modules/vue-style-loader/index.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-3[0].rules[0].use[1]!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended.vue?vue&type=style&index=0&id=7226820a&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_vue_vue_type_style_index_0_id_7226820a_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_vue_vue_type_style_index_0_id_7226820a_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_vue_vue_type_style_index_0_id_7226820a_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== \"default\") __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _node_modules_vue_style_loader_index_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_3_0_rules_0_use_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_recommended_vue_vue_type_style_index_0_id_7226820a_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n\n\n//# sourceURL=webpack://slim/./src/components/recommended.vue?"); + +/***/ }), + /***/ "./src/components/root-dirs.vue?vue&type=style&index=0&lang=css&": /*!***********************************************************************!*\ !*** ./src/components/root-dirs.vue?vue&type=style&index=0&lang=css& ***! @@ -5519,7 +5790,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\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-genaral\" } },\n [\n _c(\"div\", { attrs: { id: \"config-content\" } }, [\n _c(\n \"form\",\n {\n attrs: { id: \"configForm\", method: \"post\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.save()\n }\n }\n },\n [\n _c(\"div\", { attrs: { id: \"config-components\" } }, [\n _c(\"ul\", [\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#misc\" } }, [\n _vm._v(\"Misc\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#interface\" } }, [\n _vm._v(\"Interface\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#advanced-settings\" } }, [\n _vm._v(\"Advanced Settings\")\n ])\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"misc\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Launch browser\",\n id: \"launch_browser\"\n },\n model: {\n value: _vm.general.launchBrowser,\n callback: function($$v) {\n _vm.$set(_vm.general, \"launchBrowser\", $$v)\n },\n expression: \"general.launchBrowser\"\n }\n },\n [\n _c(\"span\", [\n _vm._v(\"open the Medusa home page on startup\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"default_page\",\n label: \"Initial page\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.defaultPage,\n expression: \"general.defaultPage\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"default_page\",\n name: \"default_page\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.general,\n \"defaultPage\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.defaultPageOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"when launching Medusa interface\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trash_remove_show\",\n label: \"Send to trash for actions\"\n }\n },\n [\n _c(\n \"label\",\n {\n staticClass: \"nextline-block\",\n attrs: { for: \"trash_remove_show\" }\n },\n [\n _c(\"toggle-button\", {\n attrs: {\n width: 45,\n height: 22,\n id: \"trash_remove_show\",\n name: \"trash_remove_show\",\n sync: \"\"\n },\n model: {\n value: _vm.general.trashRemoveShow,\n callback: function($$v) {\n _vm.$set(\n _vm.general,\n \"trashRemoveShow\",\n $$v\n )\n },\n expression: \"general.trashRemoveShow\"\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n 'when using show \"Remove\" and delete files'\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"label\",\n {\n staticClass: \"nextline-block\",\n attrs: { for: \"trash_rotate_logs\" }\n },\n [\n _c(\"toggle-button\", {\n attrs: {\n width: 45,\n height: 22,\n id: \"trash_rotate_logs\",\n name: \"trash_rotate_logs\",\n sync: \"\"\n },\n model: {\n value: _vm.general.trashRotateLogs,\n callback: function($$v) {\n _vm.$set(\n _vm.general,\n \"trashRotateLogs\",\n $$v\n )\n },\n expression: \"general.trashRotateLogs\"\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"on scheduled deletes of the oldest log files\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"selected actions use trash (recycle bin) instead of the default permanent delete\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Location for Log files\",\n id: \"log_id\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.general.logs.actualLogDir,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"actualLogDir\", $$v)\n },\n expression: \"general.logs.actualLogDir\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Number of Log files saved\",\n id: \"log_nr\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.general.logs.nr,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"nr\", $$v)\n },\n expression: \"general.logs.nr\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"number of log files saved when rotating logs (default: 5) \"\n ),\n _c(\"b\", [_vm._v(\"(REQUIRES RESTART)\")])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Size of Log files saved\",\n id: \"log_size\",\n min: 0.5,\n step: 0.1\n },\n model: {\n value: _vm.general.logs.size,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"size\", $$v)\n },\n expression: \"general.logs.size\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"maximum size in MB of the log file (default: 1MB) \"\n ),\n _c(\"b\", [_vm._v(\"(REQUIRES RESTART)\")])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"show_root_dir\",\n label: \"Show root directories\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"where the files of shows are located\")\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\"These changes are automatically saved!\")\n ]),\n _vm._v(\" \"),\n _c(\"root-dirs\")\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Append (year) to each show title\",\n id: \"add_title_year\"\n },\n model: {\n value: _vm.general.addTitleWithYear,\n callback: function($$v) {\n _vm.$set(_vm.general, \"addTitleWithYear\", $$v)\n },\n expression: \"general.addTitleWithYear\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Make sure that each show title is added with (year) appended to it\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"The show title with year is only used for show folder creation as representation in the UI.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(1),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"show_root_dir\",\n label: \"Default Indexer Language\"\n }\n },\n [\n _c(\"language-select\", {\n ref: \"indexerLanguage\",\n staticClass:\n \"form-control form-control-inline input-sm\",\n attrs: {\n language: _vm.general.indexerDefaultLanguage,\n available: _vm.indexers.main.validLanguages.join(\n \",\"\n )\n },\n on: {\n \"update-language\": function($event) {\n _vm.general.indexerDefaultLanguage = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"for adding shows and metadata providers\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Choose hour to update shows\",\n id: \"showupdate_hour\",\n min: 0,\n max: 23,\n step: 1\n },\n model: {\n value: _vm.general.showUpdateHour,\n callback: function($$v) {\n _vm.$set(_vm.general, \"showUpdateHour\", $$v)\n },\n expression: \"general.showUpdateHour\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"with information such as next air dates, show ended, etc. Use 15 for 3pm, 4 for 4am etc.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" minutes are randomized each time Medusa is started\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Timeout show indexer at\",\n id: \"indexer_timeout\",\n min: 10,\n step: 1\n },\n model: {\n value: _vm.general.indexerTimeout,\n callback: function($$v) {\n _vm.$set(_vm.general, \"indexerTimeout\", $$v)\n },\n expression: \"general.indexerTimeout\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"seconds of inactivity when finding new shows (default:20)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"indexer_default\",\n label: \"Use initial indexer set to\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.indexerDefault,\n expression: \"indexerDefault\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"indexer_default\",\n name: \"indexer_default\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.indexerDefault = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.indexerListOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable fallback to plex\",\n id: \"fallback_plex_enable\"\n },\n model: {\n value: _vm.general.plexFallBack.enable,\n callback: function($$v) {\n _vm.$set(\n _vm.general.plexFallBack,\n \"enable\",\n $$v\n )\n },\n expression: \"general.plexFallBack.enable\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Plex provides a tvdb mirror, that can be utilized when Tvdb's api is unavailable.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable fallback notifications\",\n id: \"fallback_plex_notifications\"\n },\n model: {\n value: _vm.general.plexFallBack.notifications,\n callback: function($$v) {\n _vm.$set(\n _vm.general.plexFallBack,\n \"notifications\",\n $$v\n )\n },\n expression: \"general.plexFallBack.notifications\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"When this settings has been enabled, you may receive frequent notifications when falling back to the plex mirror.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Timeout show indexer at\",\n id: \"Fallback duration\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.general.plexFallBack.timeout,\n callback: function($$v) {\n _vm.$set(\n _vm.general.plexFallBack,\n \"timeout\",\n $$v\n )\n },\n expression: \"general.plexFallBack.timeout\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Amount of hours after we try to revert back to the thetvdb.com api url (default:3).\"\n )\n ])\n ]\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(2),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Check software updates\",\n id: \"version_notify\"\n },\n model: {\n value: _vm.general.versionNotify,\n callback: function($$v) {\n _vm.$set(_vm.general, \"versionNotify\", $$v)\n },\n expression: \"general.versionNotify\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"and display notifications when updates are available.\\n Checks are run on startup and at the frequency set below*\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Automatically update\",\n id: \"auto_update\"\n },\n model: {\n value: _vm.general.autoUpdate,\n callback: function($$v) {\n _vm.$set(_vm.general, \"autoUpdate\", $$v)\n },\n expression: \"general.autoUpdate\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"fetch and install software updates.\\n Updates are run on startup and in the background at the frequency set below*\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Check the server every*\",\n id: \"update_frequency duration\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.general.updateFrequency,\n callback: function($$v) {\n _vm.$set(_vm.general, \"updateFrequency\", $$v)\n },\n expression: \"general.updateFrequency\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"hours for software updates (default:1)\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Notify on software update\",\n id: \"notify_on_update\"\n },\n model: {\n value: _vm.general.notifyOnUpdate,\n callback: function($$v) {\n _vm.$set(_vm.general, \"notifyOnUpdate\", $$v)\n },\n expression: \"general.notifyOnUpdate\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"send a message to all enabled notifiers when Medusa has been updated\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: {\n type: \"submit\",\n value: \"Save Changes\",\n disabled: _vm.saving\n }\n })\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"interface\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(3),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"theme_name\",\n label: \"Display theme\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.themeName,\n expression: \"layout.themeName\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: { id: \"theme_name\", name: \"theme_name\" },\n on: {\n change: [\n function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(\n o\n ) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.layout,\n \"themeName\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n },\n function($event) {\n return _vm.changeTheme(\n _vm.layout.themeName\n )\n }\n ]\n }\n },\n _vm._l(_vm.availableThemesOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use wider layout\",\n id: \"layout_wide\"\n },\n model: {\n value: _vm.layout.wide,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"wide\", $$v)\n },\n expression: \"layout.wide\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"uses all available space in the page\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Show fanart in the background\",\n id: \"fanart_background\"\n },\n model: {\n value: _vm.layout.fanartBackground,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"fanartBackground\", $$v)\n },\n expression: \"layout.fanartBackground\"\n }\n },\n [_c(\"p\", [_vm._v(\"on the show summary page\")])]\n ),\n _vm._v(\" \"),\n _vm.layout.fanartBackground\n ? _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Fanart transparency\",\n id: \"fanart_background_opacity duration\",\n step: 0.1,\n min: 0.1,\n max: 1.0\n },\n model: {\n value: _vm.layout.fanartBackgroundOpacity,\n callback: function($$v) {\n _vm.$set(\n _vm.layout,\n \"fanartBackgroundOpacity\",\n $$v\n )\n },\n expression: \"layout.fanartBackgroundOpacity\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Transparency of the fanart in the background\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Sort with 'The' 'A', 'An'\",\n id: \"sort_article\"\n },\n model: {\n value: _vm.layout.sortArticle,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"sortArticle\", $$v)\n },\n expression: \"layout.sortArticle\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'include articles (\"The\", \"A\", \"An\") when sorting show lists'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"show_list_order\",\n label: \"show lists\"\n }\n },\n [\n _c(\"sorted-select-list\", {\n attrs: {\n \"list-items\": _vm.layout.show.showListOrder\n },\n on: { change: _vm.saveShowListOrder }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Create and order different categories for your shows.\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Split home in tabs\",\n id: \"split_home_in_tabs\"\n },\n model: {\n value: _vm.layout.splitHomeInTabs,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"splitHomeInTabs\", $$v)\n },\n expression: \"layout.splitHomeInTabs\"\n }\n },\n [\n _c(\"span\", { staticClass: \"component-desc\" }, [\n _vm._v(\"Use tabs when splitting show lists\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Missed episodes range\",\n id: \"coming_eps_missed_range duration\",\n step: 1,\n min: 7\n },\n model: {\n value: _vm.layout.comingEps.missedRange,\n callback: function($$v) {\n _vm.$set(\n _vm.layout.comingEps,\n \"missedRange\",\n $$v\n )\n },\n expression: \"layout.comingEps.missedRange\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Set the range in days of the missed episodes in the Schedule page\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Display fuzzy dates\",\n id: \"fuzzy_dating\"\n },\n model: {\n value: _vm.layout.fuzzyDating,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"fuzzyDating\", $$v)\n },\n expression: \"layout.fuzzyDating\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'move absolute dates into tooltips and display e.g. \"Last Thu\", \"On Tue\"'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Trim zero padding\",\n id: \"trim_zero\"\n },\n model: {\n value: _vm.layout.trimZero,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"trimZero\", $$v)\n },\n expression: \"layout.trimZero\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'remove the leading number \"0\" shown on hour of day, and date of month'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"date_preset\",\n label: \"Date style\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.dateStyle,\n expression: \"layout.dateStyle\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"date_preset\",\n name: \"date_preset\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.layout,\n \"dateStyle\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.datePresetOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"time_preset\",\n label: \"Time style\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.timeStyle,\n expression: \"layout.timeStyle\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"time_preset\",\n name: \"time_preset\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.layout,\n \"timeStyle\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.timePresetOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" seconds are only shown on the History page\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"timezone_display\",\n label: \"Timezone\"\n }\n },\n [\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.timezoneDisplay,\n expression: \"layout.timezoneDisplay\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"timezone_display_local\",\n id: \"timezone_display_local\",\n value: \"local\"\n },\n domProps: {\n checked: _vm._q(\n _vm.layout.timezoneDisplay,\n \"local\"\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.layout,\n \"timezoneDisplay\",\n \"local\"\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"local\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.timezoneDisplay,\n expression: \"layout.timezoneDisplay\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"timezone_display_network\",\n id: \"timezone_display_network\",\n value: \"network\"\n },\n domProps: {\n checked: _vm._q(\n _vm.layout.timezoneDisplay,\n \"network\"\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.layout,\n \"timezoneDisplay\",\n \"network\"\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"network\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"display dates and times in either your timezone or the shows network timezone\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Use local timezone to start searching for episodes minutes after show ends (depends on your dailysearch frequency)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Use table pagination\",\n id: \"show_pagination\"\n },\n model: {\n value: _vm.layout.show.pagination.enable,\n callback: function($$v) {\n _vm.$set(\n _vm.layout.show.pagination,\n \"enable\",\n $$v\n )\n },\n expression: \"layout.show.pagination.enable\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(4),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"API key\",\n id: \"api_key\",\n readonly: \"readonly\"\n },\n model: {\n value: _vm.general.webInterface.apiKey,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"apiKey\",\n $$v\n )\n },\n expression: \"general.webInterface.apiKey\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n id: \"generate_new_apikey\",\n value: \"Generate\"\n },\n on: { click: _vm.generateApiKey }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"used to give 3rd party programs limited access to Medusa\"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"p\",\n [\n _vm._v(\n \"you can try all the features of the legacy API (v1) \"\n ),\n _c(\n \"app-link\",\n { attrs: { href: \"apibuilder/\" } },\n [_vm._v(\"here\")]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"HTTP logs\", id: \"web_log\" },\n model: {\n value: _vm.general.webInterface.log,\n callback: function($$v) {\n _vm.$set(_vm.general.webInterface, \"log\", $$v)\n },\n expression: \"general.webInterface.log\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable logs from the internal Tornado web server\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTP username\",\n id: \"web_username\",\n autocomplete: \"no\"\n },\n model: {\n value: _vm.general.webInterface.username,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"username\",\n $$v\n )\n },\n expression: \"general.webInterface.username\"\n }\n },\n [_c(\"p\", [_vm._v(\"set blank for no login\")])]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTP password\",\n id: \"web_password\",\n type: \"password\",\n autocomplete: \"no\"\n },\n model: {\n value: _vm.general.webInterface.password,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"password\",\n $$v\n )\n },\n expression: \"general.webInterface.password\"\n }\n },\n [_c(\"p\", [_vm._v(\"blank = no authentication\")])]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"HTTP port\",\n id: \"web_port\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.general.webInterface.port,\n callback: function($$v) {\n _vm.$set(_vm.general.webInterface, \"port\", $$v)\n },\n expression: \"general.webInterface.port\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"web port to browse and access Medusa (default:8081)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Notify on login\",\n id: \"notify_on_login\"\n },\n model: {\n value: _vm.general.webInterface.notifyOnLogin,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"notifyOnLogin\",\n $$v\n )\n },\n expression: \"general.webInterface.notifyOnLogin\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable to be notified when a new login happens in webserver\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Listen on IPv6\", id: \"web_ipv6\" },\n model: {\n value: _vm.general.webInterface.ipv6,\n callback: function($$v) {\n _vm.$set(_vm.general.webInterface, \"ipv6\", $$v)\n },\n expression: \"general.webInterface.ipv6\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable to be notified when a new login happens in webserver\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable HTTPS\",\n id: \"enable_https\"\n },\n model: {\n value: _vm.general.webInterface.httpsEnable,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"httpsEnable\",\n $$v\n )\n },\n expression: \"general.webInterface.httpsEnable\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable access to the web interface using a HTTPS address\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.general.webInterface.httpsEnable\n ? _c(\n \"div\",\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTPS certificate\",\n id: \"https_cert\"\n },\n model: {\n value: _vm.general.webInterface.httpsCert,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"httpsCert\",\n $$v\n )\n },\n expression:\n \"general.webInterface.httpsCert\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"file name or path to HTTPS certificate\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTPS key\",\n id: \"https_key\"\n },\n model: {\n value: _vm.general.webInterface.httpsKey,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"httpsKey\",\n $$v\n )\n },\n expression:\n \"general.webInterface.httpsKey\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"file name or path to HTTPS key\")\n ])\n ]\n )\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Reverse proxy headers\",\n id: \"handle_reverse_proxy\"\n },\n model: {\n value:\n _vm.general.webInterface.handleReverseProxy,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"handleReverseProxy\",\n $$v\n )\n },\n expression:\n \"general.webInterface.handleReverseProxy\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"accept the following reverse proxy headers (advanced)...\"\n ),\n _c(\"br\"),\n _vm._v(\n \"(X-Forwarded-For, X-Forwarded-Host, and X-Forwarded-Proto)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTP web root\",\n id: \"web_root\",\n autocomplete: \"no\"\n },\n model: {\n value: _vm.general.webRoot,\n callback: function($$v) {\n _vm.$set(_vm.general, \"webRoot\", $$v)\n },\n expression: \"general.webRoot\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Set a base URL, for use in reverse proxies.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"blank = disabled\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Must restart to have effect. Keep in mind that any previously configured base URLs won't work, after this change.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"advanced-settings\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(5),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"cpu_presets\",\n label: \"CPU throttling\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.cpuPreset,\n expression: \"general.cpuPreset\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"cpu_presets\",\n name: \"cpu_presets\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.general,\n \"cpuPreset\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.cpuPresetOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"Normal (default). High is lower and Low is higher CPU use\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Anonymous redirect\",\n id: \"anon_redirect\"\n },\n model: {\n value: _vm.general.anonRedirect,\n callback: function($$v) {\n _vm.$set(_vm.general, \"anonRedirect\", $$v)\n },\n expression: \"general.anonRedirect\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'backlink protection via anonymizer service, must end in \"?\"'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Verify SSL Certs\",\n id: \"ssl_verify\"\n },\n model: {\n value: _vm.general.sslVerify,\n callback: function($$v) {\n _vm.$set(_vm.general, \"sslVerify\", $$v)\n },\n expression: \"general.sslVerify\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Verify SSL Certificates (Disable this for broken SSL installs (Like QNAP))\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"SSL CA Bundle\",\n id: \"ssl_ca_bundle\"\n },\n model: {\n value: _vm.general.sslCaBundle,\n callback: function($$v) {\n _vm.$set(_vm.general, \"sslCaBundle\", $$v)\n },\n expression: \"general.sslCaBundle\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Path to an SSL CA Bundle. Will replace default bundle(certifi) with the one specified.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" This only apply to call made using Medusa's Requests implementation.\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"No Restart\", id: \"no_restart\" },\n model: {\n value: _vm.general.noRestart,\n callback: function($$v) {\n _vm.$set(_vm.general, \"noRestart\", $$v)\n },\n expression: \"general.noRestart\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Only shutdown when restarting Medusa.\\n Only select this when you have external software restarting Medusa automatically when it stops (like FireDaemon)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Encrypt passwords\",\n id: \"encryption_version\"\n },\n model: {\n value: _vm.general.encryptionVersion,\n callback: function($$v) {\n _vm.$set(_vm.general, \"encryptionVersion\", $$v)\n },\n expression: \"general.encryptionVersion\"\n }\n },\n [\n _c(\n \"p\",\n [\n _vm._v(\"in the \"),\n _c(\"code\", [_vm._v(\"config.ini\")]),\n _vm._v(\n \" file.\\n \"\n ),\n _c(\"b\", [_vm._v(\"Warning:\")]),\n _vm._v(\" Passwords must only contain \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters\"\n }\n },\n [_vm._v(\"ASCII characters\")]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Unprotected calendar\",\n id: \"calendar_unprotected\"\n },\n model: {\n value: _vm.general.calendarUnprotected,\n callback: function($$v) {\n _vm.$set(\n _vm.general,\n \"calendarUnprotected\",\n $$v\n )\n },\n expression: \"general.calendarUnprotected\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"allow subscribing to the calendar without user and password.\\n Some services like Google Calendar only work this way\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Google Calendar Icons\",\n id: \"calendar_icons\"\n },\n model: {\n value: _vm.general.calendarIcons,\n callback: function($$v) {\n _vm.$set(_vm.general, \"calendarIcons\", $$v)\n },\n expression: \"general.calendarIcons\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"show an icon next to exported calendar events in Google Calendar.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: { label: \"Proxy host\", id: \"proxy_setting\" },\n model: {\n value: _vm.general.proxySetting,\n callback: function($$v) {\n _vm.$set(_vm.general, \"proxySetting\", $$v)\n },\n expression: \"general.proxySetting\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"blank to disable or proxy to use when connecting to providers\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.general.proxySetting !== \"\"\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use proxy for providers\",\n id: \"proxy_providers\"\n },\n model: {\n value: _vm.general.proxyProviders,\n callback: function($$v) {\n _vm.$set(_vm.general, \"proxyProviders\", $$v)\n },\n expression: \"general.proxyProviders\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"use proxy host for connecting to providers (torrent & nzb)\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.general.proxySetting !== \"\"\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use proxy for indexers\",\n id: \"proxy_indexers\"\n },\n model: {\n value: _vm.general.proxyIndexers,\n callback: function($$v) {\n _vm.$set(_vm.general, \"proxyIndexers\", $$v)\n },\n expression: \"general.proxyIndexers\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"use proxy host for connecting to indexers (thetvdb, tmdb or tvmaze)\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.general.proxySetting !== \"\"\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use proxy for clients\",\n id: \"proxy_clients\"\n },\n model: {\n value: _vm.general.proxyClients,\n callback: function($$v) {\n _vm.$set(_vm.general, \"proxyClients\", $$v)\n },\n expression: \"general.proxyClients\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"use proxy host for connecting torrent or usenet clients (nzbGet excluded)\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.general.proxySetting !== \"\"\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use proxy for other sites\",\n id: \"proxy_others\"\n },\n model: {\n value: _vm.general.proxyOthers,\n callback: function($$v) {\n _vm.$set(_vm.general, \"proxyOthers\", $$v)\n },\n expression: \"general.proxyOthers\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"use proxy host for connecting to other sites.\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Skip Remove Detection\",\n id: \"skip_removed_files\"\n },\n model: {\n value: _vm.general.skipRemovedFiles,\n callback: function($$v) {\n _vm.$set(_vm.general, \"skipRemovedFiles\", $$v)\n },\n expression: \"general.skipRemovedFiles\"\n }\n },\n [\n _c(\"span\", [\n _c(\"p\", [\n _vm._v(\n \"Skip detection of removed files. If disabled the episode will be set to the default deleted status\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" This may mean Medusa misses renames as well\\n \"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"ep_default_deleted_status\",\n label: \"Default deleted episode status\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.epDefaultDeletedStatus,\n expression: \"general.epDefaultDeletedStatus\"\n }\n ],\n staticClass:\n \"form-control input-sm margin-bottom-5\",\n attrs: {\n id: \"ep_default_deleted_status\",\n name: \"ep_default_deleted_status\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.general,\n \"epDefaultDeletedStatus\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { disabled: \"\", value: \"\" } },\n [_vm._v(\"Please select a default status\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.defaultDeletedEpOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"Define the status to be set for media file that has been deleted.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Archived option will keep previous downloaded quality\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Example: Downloaded (1080p WEB-DL) ==> Archived (1080p WEB-DL)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable experimental features\",\n id: \"experimental\"\n },\n model: {\n value: _vm.general.experimental,\n callback: function($$v) {\n _vm.$set(_vm.general, \"experimental\", $$v)\n },\n expression: \"general.experimental\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"allow for using experimental features\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(6),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Enable debug\", id: \"debug\" },\n model: {\n value: _vm.general.logs.debug,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"debug\", $$v)\n },\n expression: \"general.logs.debug\"\n }\n },\n [_c(\"p\", [_vm._v(\"Enable debug logs\")])]\n ),\n _vm._v(\" \"),\n _vm.general.developer\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable DB debug\",\n id: \"dbdebug\"\n },\n model: {\n value: _vm.general.logs.dbDebug,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"dbDebug\", $$v)\n },\n expression: \"general.logs.dbDebug\"\n }\n },\n [_c(\"p\", [_vm._v(\"Enable DB debug logs\")])]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Subliminal logs\",\n id: \"subliminal_log\"\n },\n model: {\n value: _vm.general.logs.subliminalLog,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"subliminalLog\", $$v)\n },\n expression: \"general.logs.subliminalLog\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable logs from subliminal library (subtitles)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"privacy_level\",\n label: \"Privacy\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.logs.privacyLevel,\n expression: \"general.logs.privacyLevel\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"privacy_level\",\n name: \"privacy_level\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.general.logs,\n \"privacyLevel\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.privacyLevelOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n Set the level of log-filtering.\\n Normal (default).\\n \"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"custom_logs\",\n label:\n \"Overwrite log levels for overwritable logs\"\n }\n },\n [_c(\"custom-logs\")],\n 1\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(7),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"github_remote_branches\",\n label: \"Branch version\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedBranch,\n expression: \"selectedBranch\"\n }\n ],\n staticClass:\n \"form-control input-sm margin-bottom-5\",\n attrs: {\n id: \"github_remote_branches\",\n name: \"github_remote_branches\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.selectedBranch = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { disabled: \"\", value: \"\" } },\n [_vm._v(\"Please select a branch\")]\n ),\n _vm._v(\" \"),\n _vm._l(\n _vm.githubRemoteBranchesOptions,\n function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }\n )\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n staticStyle: { \"margin-left\": \"6px\" },\n attrs: {\n disabled: !_vm.gitRemoteBranches.length > 0,\n type: \"button\",\n id: \"branchCheckout\",\n value: \"Checkout Branch\"\n },\n on: { click: _vm.validateCheckoutBranch }\n }),\n _vm._v(\" \"),\n !_vm.gitRemoteBranches.length > 0\n ? _c(\n \"span\",\n { staticStyle: { color: \"rgb(255, 0, 0)\" } },\n [\n _c(\"p\", [\n _vm._v(\"Error: No branches found.\")\n ])\n ]\n )\n : _c(\"p\", [\n _vm._v(\n \"select branch to use (restart required)\"\n )\n ]),\n _vm._v(\" \"),\n _vm.checkoutBranchMessage\n ? _c(\n \"p\",\n [\n _c(\"state-switch\", {\n attrs: {\n state: \"loading\",\n theme: _vm.layout.themeName\n }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(_vm._s(_vm.checkoutBranchMessage))\n ])\n ],\n 1\n )\n : _vm._e()\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"date_presets\",\n label: \"GitHub authentication type\"\n }\n },\n [\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.git.authType,\n expression: \"general.git.authType\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"git_auth_type_basic\",\n id: \"git_auth_type_basic\"\n },\n domProps: {\n value: 0,\n checked: _vm._q(_vm.general.git.authType, 0)\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.general.git,\n \"authType\",\n 0\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"Username and password\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.git.authType,\n expression: \"general.git.authType\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"git_auth_type_token\",\n id: \"git_auth_type_token\"\n },\n domProps: {\n value: 1,\n checked: _vm._q(_vm.general.git.authType, 1)\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.general.git,\n \"authType\",\n 1\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"Personal access token\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n 'You must use a personal access token if you\\'re using \"two-factor authentication\" on GitHub.'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.general.git.authType === 0,\n expression: \"general.git.authType === 0\"\n }\n ]\n },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub username\",\n id: \"git_username\"\n },\n model: {\n value: _vm.general.git.username,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"username\", $$v)\n },\n expression: \"general.git.username\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"*** (REQUIRED FOR SUBMITTING ISSUES) ***\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub password\",\n id: \"git_password\",\n type: \"password\"\n },\n model: {\n value: _vm.general.git.password,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"password\", $$v)\n },\n expression: \"general.git.password\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"*** (REQUIRED FOR SUBMITTING ISSUES) ***\"\n )\n ])\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.general.git.authType !== 0,\n expression: \"general.git.authType !== 0\"\n }\n ]\n },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub personal access token\",\n id: \"git_token\",\n \"input-class\":\n \"display-inline margin-bottom-5\"\n },\n nativeOn: {\n focus: function($event) {\n return $event.target.select()\n }\n },\n model: {\n value: _vm.general.git.token,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"token\", $$v)\n },\n expression: \"general.git.token\"\n }\n },\n [\n _vm.general.git.token === \"\"\n ? [\n _c(\n \"v-popover\",\n {\n attrs: {\n trigger: \"click\",\n offset: \"16\",\n placement: \"right\",\n popoverBaseClass: \"tooltip-base\",\n popoverClass:\n \"tooltip-themed\" +\n (_vm.layout.themeName === \"dark\"\n ? \"-dark\"\n : \"-light\")\n }\n },\n [\n _c(\"input\", {\n staticClass:\n \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n id: \"create_access_token\",\n value: \"Generate Token\"\n }\n }),\n _vm._v(\" \"),\n _c(\"template\", { slot: \"popover\" }, [\n _c(\n \"div\",\n { staticClass: \"tooltip-title\" },\n [_vm._v(\"Github Token\")]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"tooltip-content\"\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Copy the generated token and paste it in the token input box.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\n \"a\",\n {\n attrs: {\n href:\n (_vm.general\n .anonRedirect ||\n \"\") +\n \"https://github.com/settings/tokens/new?description=Medusa&scopes=gist,public_repo\",\n target: \"_blank\"\n }\n },\n [\n _c(\"input\", {\n staticClass:\n \"btn-medusa\",\n attrs: {\n type: \"button\",\n value:\n \"Continue to Github...\"\n }\n })\n ]\n )\n ]),\n _c(\"br\")\n ]\n )\n ])\n ],\n 2\n )\n ]\n : [\n _c(\n \"a\",\n {\n attrs: {\n href:\n (_vm.general.anonRedirect || \"\") +\n \"https://github.com/settings/tokens\",\n target: \"_blank\"\n }\n },\n [\n _c(\"input\", {\n staticClass:\n \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n id: \"manage_tokens\",\n value: \"Manage Tokens\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"*** (REQUIRED FOR SUBMITTING ISSUES) ***\"\n )\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub remote for branch\",\n id: \"git_remote\"\n },\n model: {\n value: _vm.general.git.remote,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"remote\", $$v)\n },\n expression: \"general.git.remote\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"default:origin. Access repo configured remotes (save then refresh browser)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Git executable path\",\n id: \"git_path\"\n },\n model: {\n value: _vm.general.git.path,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"path\", $$v)\n },\n expression: \"general.git.path\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"only needed if OS is unable to locate git from env\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.general.developer\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Git reset\", id: \"git_reset\" },\n model: {\n value: _vm.general.git.reset,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"reset\", $$v)\n },\n expression: \"general.git.reset\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"removes untracked files and performs a hard reset on git branch automatically to help resolve update issues\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.general.developer\n ? _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"git_reset_branches\",\n label: \"Branches to reset\"\n }\n },\n [\n _c(\"multiselect\", {\n attrs: {\n multiple: true,\n options: _vm.gitRemoteBranches\n },\n model: {\n value: _vm.general.git.resetBranches,\n callback: function($$v) {\n _vm.$set(\n _vm.general.git,\n \"resetBranches\",\n $$v\n )\n },\n expression: \"general.git.resetBranches\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n staticStyle: { \"margin-left\": \"6px\" },\n attrs: {\n type: \"button\",\n id: \"branch_force_update\",\n value: \"Update Branches\"\n },\n on: {\n click: function($event) {\n return _vm.gitRemoteBranches()\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Empty selection means that any branch could be reset.\"\n )\n ])\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"h6\", { staticClass: \"pull-right\" }, [\n _c(\"b\", [\n _vm._v(\"All non-absolute folder locations are relative to \"),\n _c(\"span\", { staticClass: \"path\" }, [\n _vm._v(_vm._s(_vm.system.dataDir))\n ])\n ])\n ])\n ])\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-upgrade-database\",\n height: \"auto\",\n width: \"80%\"\n }\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 Upgrade database model?\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [\n _vm._v(\"Changing branch will upgrade your database\")\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\"You won't be able to downgrade afterward.\")\n ]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Do you want to continue?\")])\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.$modal.hide(\"query-upgrade-database\")\n _vm.checkoutBranchMessage = \"\"\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.checkoutBranch()\n _vm.$modal.hide(\"query-upgrade-database\")\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 { attrs: { name: \"query-restart\", height: \"auto\", width: \"80%\" } },\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 Checking out a branch requires a restart\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [\n _vm._v(\"Would you like to start a restart of medusa now?\")\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 _vm.$modal.hide(\"query-restart\")\n _vm.checkoutBranchMessage = \"\"\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.$modal.hide(\"query-restart\")\n _vm.$router.push({ name: \"restart\" })\n }\n }\n },\n [_vm._v(\"Yes\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n )\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 \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Misc\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Startup options. Indexer options. Log and show file locations.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [\n _vm._v(\"Some options may require a manual restart to take effect.\")\n ])\n ])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Indexer\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for controlling the show indexers.\")])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Updates\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for software updates.\")])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"User Interface\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for visual appearance.\")])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Web Interface\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"It is recommended that you enable a username and password to secure Medusa from being tampered with remotely.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [\n _vm._v(\"These options require a manual restart to take effect.\")\n ])\n ])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [_c(\"h3\", [_vm._v(\"Advanced Settings\")])]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [_c(\"h3\", [_vm._v(\"Logging\")])]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"GitHub\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for github related features.\")])\n ]\n )\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/config-general.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\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-genaral\" } },\n [\n _c(\"div\", { attrs: { id: \"config-content\" } }, [\n _c(\n \"form\",\n {\n attrs: { id: \"configForm\", method: \"post\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.save()\n }\n }\n },\n [\n _c(\"div\", { attrs: { id: \"config-components\" } }, [\n _c(\"ul\", [\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#misc\" } }, [\n _vm._v(\"Misc\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#interface\" } }, [\n _vm._v(\"Interface\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"li\",\n [\n _c(\"app-link\", { attrs: { href: \"#advanced-settings\" } }, [\n _vm._v(\"Advanced Settings\")\n ])\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"misc\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Launch browser\",\n id: \"launch_browser\"\n },\n model: {\n value: _vm.general.launchBrowser,\n callback: function($$v) {\n _vm.$set(_vm.general, \"launchBrowser\", $$v)\n },\n expression: \"general.launchBrowser\"\n }\n },\n [\n _c(\"span\", [\n _vm._v(\"open the Medusa home page on startup\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"default_page\",\n label: \"Initial page\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.defaultPage,\n expression: \"general.defaultPage\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"default_page\",\n name: \"default_page\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.general,\n \"defaultPage\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.defaultPageOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"when launching Medusa interface\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trash_remove_show\",\n label: \"Send to trash for actions\"\n }\n },\n [\n _c(\n \"label\",\n {\n staticClass: \"nextline-block\",\n attrs: { for: \"trash_remove_show\" }\n },\n [\n _c(\"toggle-button\", {\n attrs: {\n width: 45,\n height: 22,\n id: \"trash_remove_show\",\n name: \"trash_remove_show\",\n sync: \"\"\n },\n model: {\n value: _vm.general.trashRemoveShow,\n callback: function($$v) {\n _vm.$set(\n _vm.general,\n \"trashRemoveShow\",\n $$v\n )\n },\n expression: \"general.trashRemoveShow\"\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n 'when using show \"Remove\" and delete files'\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"label\",\n {\n staticClass: \"nextline-block\",\n attrs: { for: \"trash_rotate_logs\" }\n },\n [\n _c(\"toggle-button\", {\n attrs: {\n width: 45,\n height: 22,\n id: \"trash_rotate_logs\",\n name: \"trash_rotate_logs\",\n sync: \"\"\n },\n model: {\n value: _vm.general.trashRotateLogs,\n callback: function($$v) {\n _vm.$set(\n _vm.general,\n \"trashRotateLogs\",\n $$v\n )\n },\n expression: \"general.trashRotateLogs\"\n }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"on scheduled deletes of the oldest log files\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"selected actions use trash (recycle bin) instead of the default permanent delete\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-textbox\", {\n attrs: {\n label: \"Location for Log files\",\n id: \"log_id\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.general.logs.actualLogDir,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"actualLogDir\", $$v)\n },\n expression: \"general.logs.actualLogDir\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Number of Log files saved\",\n id: \"log_nr\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.general.logs.nr,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"nr\", $$v)\n },\n expression: \"general.logs.nr\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"number of log files saved when rotating logs (default: 5) \"\n ),\n _c(\"b\", [_vm._v(\"(REQUIRES RESTART)\")])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Size of Log files saved\",\n id: \"log_size\",\n min: 0.5,\n step: 0.1\n },\n model: {\n value: _vm.general.logs.size,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"size\", $$v)\n },\n expression: \"general.logs.size\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"maximum size in MB of the log file (default: 1MB) \"\n ),\n _c(\"b\", [_vm._v(\"(REQUIRES RESTART)\")])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"show_root_dir\",\n label: \"Show root directories\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"where the files of shows are located\")\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\"These changes are automatically saved!\")\n ]),\n _vm._v(\" \"),\n _c(\"root-dirs\")\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Append (year) to each show title\",\n id: \"add_title_year\"\n },\n model: {\n value: _vm.general.addTitleWithYear,\n callback: function($$v) {\n _vm.$set(_vm.general, \"addTitleWithYear\", $$v)\n },\n expression: \"general.addTitleWithYear\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Make sure that each show title is added with (year) appended to it\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"The show title with year is only used for show folder creation as representation in the UI.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(1),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Cache recommended shows\",\n id: \"cache_rec_shows\"\n },\n model: {\n value: _vm.general.recommended.cache.shows,\n callback: function($$v) {\n _vm.$set(\n _vm.general.recommended.cache,\n \"shows\",\n $$v\n )\n },\n expression: \"general.recommended.cache.shows\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Enabling recommended shows, will cache recommended shows on a daily interval.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.general.recommended.cache.shows\n ? [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Cache Trakt lists\",\n id: \"cache_rec_trakt\"\n },\n model: {\n value: _vm.general.recommended.cache.trakt,\n callback: function($$v) {\n _vm.$set(\n _vm.general.recommended.cache,\n \"trakt\",\n $$v\n )\n },\n expression: \"general.recommended.cache.trakt\"\n }\n }),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"trakt_selected_lists\",\n label: \"Trakt enabled lists\"\n }\n },\n [\n _vm.general.recommended.cache.trakt\n ? _c(\"select-trakt-lists\")\n : _vm._e()\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Cache Imdb lists\",\n id: \"cache_rec_imdb\"\n },\n model: {\n value: _vm.general.recommended.cache.imdb,\n callback: function($$v) {\n _vm.$set(\n _vm.general.recommended.cache,\n \"imdb\",\n $$v\n )\n },\n expression: \"general.recommended.cache.imdb\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Cache Anidb lists\",\n id: \"cache_rec_anidb\"\n },\n model: {\n value: _vm.general.recommended.cache.anidb,\n callback: function($$v) {\n _vm.$set(\n _vm.general.recommended.cache,\n \"anidb\",\n $$v\n )\n },\n expression: \"general.recommended.cache.anidb\"\n }\n }),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Cache AniList lists\",\n id: \"cache_rec_anilist\"\n },\n model: {\n value: _vm.general.recommended.cache.anilist,\n callback: function($$v) {\n _vm.$set(\n _vm.general.recommended.cache,\n \"anilist\",\n $$v\n )\n },\n expression:\n \"general.recommended.cache.anilist\"\n }\n })\n ]\n : _vm._e()\n ],\n 2\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(2),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"show_root_dir\",\n label: \"Default Indexer Language\"\n }\n },\n [\n _c(\"language-select\", {\n ref: \"indexerLanguage\",\n staticClass:\n \"form-control form-control-inline input-sm\",\n attrs: {\n language: _vm.general.indexerDefaultLanguage,\n available: _vm.indexers.main.validLanguages.join(\n \",\"\n )\n },\n on: {\n \"update-language\": function($event) {\n _vm.general.indexerDefaultLanguage = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\"for adding shows and metadata providers\")\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Choose hour to update shows\",\n id: \"showupdate_hour\",\n min: 0,\n max: 23,\n step: 1\n },\n model: {\n value: _vm.general.showUpdateHour,\n callback: function($$v) {\n _vm.$set(_vm.general, \"showUpdateHour\", $$v)\n },\n expression: \"general.showUpdateHour\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"with information such as next air dates, show ended, etc. Use 15 for 3pm, 4 for 4am etc.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" minutes are randomized each time Medusa is started\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Timeout show indexer at\",\n id: \"indexer_timeout\",\n min: 10,\n step: 1\n },\n model: {\n value: _vm.general.indexerTimeout,\n callback: function($$v) {\n _vm.$set(_vm.general, \"indexerTimeout\", $$v)\n },\n expression: \"general.indexerTimeout\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"seconds of inactivity when finding new shows (default:20)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"indexer_default\",\n label: \"Use initial indexer set to\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.indexerDefault,\n expression: \"indexerDefault\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"indexer_default\",\n name: \"indexer_default\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.indexerDefault = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.indexerListOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable fallback to plex\",\n id: \"fallback_plex_enable\"\n },\n model: {\n value: _vm.general.plexFallBack.enable,\n callback: function($$v) {\n _vm.$set(\n _vm.general.plexFallBack,\n \"enable\",\n $$v\n )\n },\n expression: \"general.plexFallBack.enable\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Plex provides a tvdb mirror, that can be utilized when Tvdb's api is unavailable.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable fallback notifications\",\n id: \"fallback_plex_notifications\"\n },\n model: {\n value: _vm.general.plexFallBack.notifications,\n callback: function($$v) {\n _vm.$set(\n _vm.general.plexFallBack,\n \"notifications\",\n $$v\n )\n },\n expression: \"general.plexFallBack.notifications\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"When this settings has been enabled, you may receive frequent notifications when falling back to the plex mirror.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Timeout show indexer at\",\n id: \"Fallback duration\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.general.plexFallBack.timeout,\n callback: function($$v) {\n _vm.$set(\n _vm.general.plexFallBack,\n \"timeout\",\n $$v\n )\n },\n expression: \"general.plexFallBack.timeout\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Amount of hours after we try to revert back to the thetvdb.com api url (default:3).\"\n )\n ])\n ]\n )\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(3),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Check software updates\",\n id: \"version_notify\"\n },\n model: {\n value: _vm.general.versionNotify,\n callback: function($$v) {\n _vm.$set(_vm.general, \"versionNotify\", $$v)\n },\n expression: \"general.versionNotify\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"and display notifications when updates are available.\\n Checks are run on startup and at the frequency set below*\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Automatically update\",\n id: \"auto_update\"\n },\n model: {\n value: _vm.general.autoUpdate,\n callback: function($$v) {\n _vm.$set(_vm.general, \"autoUpdate\", $$v)\n },\n expression: \"general.autoUpdate\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"fetch and install software updates.\\n Updates are run on startup and in the background at the frequency set below*\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Check the server every*\",\n id: \"update_frequency duration\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.general.updateFrequency,\n callback: function($$v) {\n _vm.$set(_vm.general, \"updateFrequency\", $$v)\n },\n expression: \"general.updateFrequency\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"hours for software updates (default:1)\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Notify on software update\",\n id: \"notify_on_update\"\n },\n model: {\n value: _vm.general.notifyOnUpdate,\n callback: function($$v) {\n _vm.$set(_vm.general, \"notifyOnUpdate\", $$v)\n },\n expression: \"general.notifyOnUpdate\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"send a message to all enabled notifiers when Medusa has been updated\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: {\n type: \"submit\",\n value: \"Save Changes\",\n disabled: _vm.saving\n }\n })\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"interface\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(4),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"theme_name\",\n label: \"Display theme\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.themeName,\n expression: \"layout.themeName\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: { id: \"theme_name\", name: \"theme_name\" },\n on: {\n change: [\n function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(\n o\n ) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.layout,\n \"themeName\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n },\n function($event) {\n return _vm.changeTheme(\n _vm.layout.themeName\n )\n }\n ]\n }\n },\n _vm._l(_vm.availableThemesOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use wider layout\",\n id: \"layout_wide\"\n },\n model: {\n value: _vm.layout.wide,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"wide\", $$v)\n },\n expression: \"layout.wide\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"uses all available space in the page\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Show fanart in the background\",\n id: \"fanart_background\"\n },\n model: {\n value: _vm.layout.fanartBackground,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"fanartBackground\", $$v)\n },\n expression: \"layout.fanartBackground\"\n }\n },\n [_c(\"p\", [_vm._v(\"on the show summary page\")])]\n ),\n _vm._v(\" \"),\n _vm.layout.fanartBackground\n ? _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Fanart transparency\",\n id: \"fanart_background_opacity duration\",\n step: 0.1,\n min: 0.1,\n max: 1.0\n },\n model: {\n value: _vm.layout.fanartBackgroundOpacity,\n callback: function($$v) {\n _vm.$set(\n _vm.layout,\n \"fanartBackgroundOpacity\",\n $$v\n )\n },\n expression: \"layout.fanartBackgroundOpacity\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Transparency of the fanart in the background\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Sort with 'The' 'A', 'An'\",\n id: \"sort_article\"\n },\n model: {\n value: _vm.layout.sortArticle,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"sortArticle\", $$v)\n },\n expression: \"layout.sortArticle\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'include articles (\"The\", \"A\", \"An\") when sorting show lists'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"show_list_order\",\n label: \"show lists\"\n }\n },\n [\n _c(\"sorted-select-list\", {\n attrs: {\n \"list-items\": _vm.layout.show.showListOrder\n },\n on: { change: _vm.saveShowListOrder }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Create and order different categories for your shows.\"\n )\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Split home in tabs\",\n id: \"split_home_in_tabs\"\n },\n model: {\n value: _vm.layout.splitHomeInTabs,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"splitHomeInTabs\", $$v)\n },\n expression: \"layout.splitHomeInTabs\"\n }\n },\n [\n _c(\"span\", { staticClass: \"component-desc\" }, [\n _vm._v(\"Use tabs when splitting show lists\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"Missed episodes range\",\n id: \"coming_eps_missed_range duration\",\n step: 1,\n min: 7\n },\n model: {\n value: _vm.layout.comingEps.missedRange,\n callback: function($$v) {\n _vm.$set(\n _vm.layout.comingEps,\n \"missedRange\",\n $$v\n )\n },\n expression: \"layout.comingEps.missedRange\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Set the range in days of the missed episodes in the Schedule page\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Display fuzzy dates\",\n id: \"fuzzy_dating\"\n },\n model: {\n value: _vm.layout.fuzzyDating,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"fuzzyDating\", $$v)\n },\n expression: \"layout.fuzzyDating\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'move absolute dates into tooltips and display e.g. \"Last Thu\", \"On Tue\"'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Trim zero padding\",\n id: \"trim_zero\"\n },\n model: {\n value: _vm.layout.trimZero,\n callback: function($$v) {\n _vm.$set(_vm.layout, \"trimZero\", $$v)\n },\n expression: \"layout.trimZero\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'remove the leading number \"0\" shown on hour of day, and date of month'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"date_preset\",\n label: \"Date style\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.dateStyle,\n expression: \"layout.dateStyle\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"date_preset\",\n name: \"date_preset\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.layout,\n \"dateStyle\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.datePresetOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"time_preset\",\n label: \"Time style\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.timeStyle,\n expression: \"layout.timeStyle\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"time_preset\",\n name: \"time_preset\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.layout,\n \"timeStyle\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.timePresetOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" seconds are only shown on the History page\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"timezone_display\",\n label: \"Timezone\"\n }\n },\n [\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.timezoneDisplay,\n expression: \"layout.timezoneDisplay\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"timezone_display_local\",\n id: \"timezone_display_local\",\n value: \"local\"\n },\n domProps: {\n checked: _vm._q(\n _vm.layout.timezoneDisplay,\n \"local\"\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.layout,\n \"timezoneDisplay\",\n \"local\"\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"local\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.layout.timezoneDisplay,\n expression: \"layout.timezoneDisplay\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"timezone_display_network\",\n id: \"timezone_display_network\",\n value: \"network\"\n },\n domProps: {\n checked: _vm._q(\n _vm.layout.timezoneDisplay,\n \"network\"\n )\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.layout,\n \"timezoneDisplay\",\n \"network\"\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"network\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"display dates and times in either your timezone or the shows network timezone\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Use local timezone to start searching for episodes minutes after show ends (depends on your dailysearch frequency)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Use table pagination\",\n id: \"show_pagination\"\n },\n model: {\n value: _vm.layout.show.pagination.enable,\n callback: function($$v) {\n _vm.$set(\n _vm.layout.show.pagination,\n \"enable\",\n $$v\n )\n },\n expression: \"layout.show.pagination.enable\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(5),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"API key\",\n id: \"api_key\",\n readonly: \"readonly\"\n },\n model: {\n value: _vm.general.webInterface.apiKey,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"apiKey\",\n $$v\n )\n },\n expression: \"general.webInterface.apiKey\"\n }\n },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n id: \"generate_new_apikey\",\n value: \"Generate\"\n },\n on: { click: _vm.generateApiKey }\n }),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"used to give 3rd party programs limited access to Medusa\"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"p\",\n [\n _vm._v(\n \"you can try all the features of the legacy API (v1) \"\n ),\n _c(\n \"app-link\",\n { attrs: { href: \"apibuilder/\" } },\n [_vm._v(\"here\")]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"HTTP logs\", id: \"web_log\" },\n model: {\n value: _vm.general.webInterface.log,\n callback: function($$v) {\n _vm.$set(_vm.general.webInterface, \"log\", $$v)\n },\n expression: \"general.webInterface.log\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable logs from the internal Tornado web server\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTP username\",\n id: \"web_username\",\n autocomplete: \"no\"\n },\n model: {\n value: _vm.general.webInterface.username,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"username\",\n $$v\n )\n },\n expression: \"general.webInterface.username\"\n }\n },\n [_c(\"p\", [_vm._v(\"set blank for no login\")])]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTP password\",\n id: \"web_password\",\n type: \"password\",\n autocomplete: \"no\"\n },\n model: {\n value: _vm.general.webInterface.password,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"password\",\n $$v\n )\n },\n expression: \"general.webInterface.password\"\n }\n },\n [_c(\"p\", [_vm._v(\"blank = no authentication\")])]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox-number\",\n {\n attrs: {\n label: \"HTTP port\",\n id: \"web_port\",\n min: 1,\n step: 1\n },\n model: {\n value: _vm.general.webInterface.port,\n callback: function($$v) {\n _vm.$set(_vm.general.webInterface, \"port\", $$v)\n },\n expression: \"general.webInterface.port\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"web port to browse and access Medusa (default:8081)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Notify on login\",\n id: \"notify_on_login\"\n },\n model: {\n value: _vm.general.webInterface.notifyOnLogin,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"notifyOnLogin\",\n $$v\n )\n },\n expression: \"general.webInterface.notifyOnLogin\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable to be notified when a new login happens in webserver\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Listen on IPv6\", id: \"web_ipv6\" },\n model: {\n value: _vm.general.webInterface.ipv6,\n callback: function($$v) {\n _vm.$set(_vm.general.webInterface, \"ipv6\", $$v)\n },\n expression: \"general.webInterface.ipv6\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable to be notified when a new login happens in webserver\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable HTTPS\",\n id: \"enable_https\"\n },\n model: {\n value: _vm.general.webInterface.httpsEnable,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"httpsEnable\",\n $$v\n )\n },\n expression: \"general.webInterface.httpsEnable\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable access to the web interface using a HTTPS address\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.general.webInterface.httpsEnable\n ? _c(\n \"div\",\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTPS certificate\",\n id: \"https_cert\"\n },\n model: {\n value: _vm.general.webInterface.httpsCert,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"httpsCert\",\n $$v\n )\n },\n expression:\n \"general.webInterface.httpsCert\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"file name or path to HTTPS certificate\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTPS key\",\n id: \"https_key\"\n },\n model: {\n value: _vm.general.webInterface.httpsKey,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"httpsKey\",\n $$v\n )\n },\n expression:\n \"general.webInterface.httpsKey\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"file name or path to HTTPS key\")\n ])\n ]\n )\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Reverse proxy headers\",\n id: \"handle_reverse_proxy\"\n },\n model: {\n value:\n _vm.general.webInterface.handleReverseProxy,\n callback: function($$v) {\n _vm.$set(\n _vm.general.webInterface,\n \"handleReverseProxy\",\n $$v\n )\n },\n expression:\n \"general.webInterface.handleReverseProxy\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"accept the following reverse proxy headers (advanced)...\"\n ),\n _c(\"br\"),\n _vm._v(\n \"(X-Forwarded-For, X-Forwarded-Host, and X-Forwarded-Proto)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"HTTP web root\",\n id: \"web_root\",\n autocomplete: \"no\"\n },\n model: {\n value: _vm.general.webRoot,\n callback: function($$v) {\n _vm.$set(_vm.general, \"webRoot\", $$v)\n },\n expression: \"general.webRoot\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Set a base URL, for use in reverse proxies.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"blank = disabled\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Must restart to have effect. Keep in mind that any previously configured base URLs won't work, after this change.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"advanced-settings\" } }, [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(6),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"cpu_presets\",\n label: \"CPU throttling\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.cpuPreset,\n expression: \"general.cpuPreset\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"cpu_presets\",\n name: \"cpu_presets\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.general,\n \"cpuPreset\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.cpuPresetOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"Normal (default). High is lower and Low is higher CPU use\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Anonymous redirect\",\n id: \"anon_redirect\"\n },\n model: {\n value: _vm.general.anonRedirect,\n callback: function($$v) {\n _vm.$set(_vm.general, \"anonRedirect\", $$v)\n },\n expression: \"general.anonRedirect\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n 'backlink protection via anonymizer service, must end in \"?\"'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Verify SSL Certs\",\n id: \"ssl_verify\"\n },\n model: {\n value: _vm.general.sslVerify,\n callback: function($$v) {\n _vm.$set(_vm.general, \"sslVerify\", $$v)\n },\n expression: \"general.sslVerify\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Verify SSL Certificates (Disable this for broken SSL installs (Like QNAP))\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"SSL CA Bundle\",\n id: \"ssl_ca_bundle\"\n },\n model: {\n value: _vm.general.sslCaBundle,\n callback: function($$v) {\n _vm.$set(_vm.general, \"sslCaBundle\", $$v)\n },\n expression: \"general.sslCaBundle\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Path to an SSL CA Bundle. Will replace default bundle(certifi) with the one specified.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" This only apply to call made using Medusa's Requests implementation.\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"No Restart\", id: \"no_restart\" },\n model: {\n value: _vm.general.noRestart,\n callback: function($$v) {\n _vm.$set(_vm.general, \"noRestart\", $$v)\n },\n expression: \"general.noRestart\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Only shutdown when restarting Medusa.\\n Only select this when you have external software restarting Medusa automatically when it stops (like FireDaemon)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Encrypt passwords\",\n id: \"encryption_version\"\n },\n model: {\n value: _vm.general.encryptionVersion,\n callback: function($$v) {\n _vm.$set(_vm.general, \"encryptionVersion\", $$v)\n },\n expression: \"general.encryptionVersion\"\n }\n },\n [\n _c(\n \"p\",\n [\n _vm._v(\"in the \"),\n _c(\"code\", [_vm._v(\"config.ini\")]),\n _vm._v(\n \" file.\\n \"\n ),\n _c(\"b\", [_vm._v(\"Warning:\")]),\n _vm._v(\" Passwords must only contain \"),\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"https://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters\"\n }\n },\n [_vm._v(\"ASCII characters\")]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Unprotected calendar\",\n id: \"calendar_unprotected\"\n },\n model: {\n value: _vm.general.calendarUnprotected,\n callback: function($$v) {\n _vm.$set(\n _vm.general,\n \"calendarUnprotected\",\n $$v\n )\n },\n expression: \"general.calendarUnprotected\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"allow subscribing to the calendar without user and password.\\n Some services like Google Calendar only work this way\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Google Calendar Icons\",\n id: \"calendar_icons\"\n },\n model: {\n value: _vm.general.calendarIcons,\n callback: function($$v) {\n _vm.$set(_vm.general, \"calendarIcons\", $$v)\n },\n expression: \"general.calendarIcons\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"show an icon next to exported calendar events in Google Calendar.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: { label: \"Proxy host\", id: \"proxy_setting\" },\n model: {\n value: _vm.general.proxySetting,\n callback: function($$v) {\n _vm.$set(_vm.general, \"proxySetting\", $$v)\n },\n expression: \"general.proxySetting\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"blank to disable or proxy to use when connecting to providers\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.general.proxySetting !== \"\"\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use proxy for providers\",\n id: \"proxy_providers\"\n },\n model: {\n value: _vm.general.proxyProviders,\n callback: function($$v) {\n _vm.$set(_vm.general, \"proxyProviders\", $$v)\n },\n expression: \"general.proxyProviders\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"use proxy host for connecting to providers (torrent & nzb)\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.general.proxySetting !== \"\"\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use proxy for indexers\",\n id: \"proxy_indexers\"\n },\n model: {\n value: _vm.general.proxyIndexers,\n callback: function($$v) {\n _vm.$set(_vm.general, \"proxyIndexers\", $$v)\n },\n expression: \"general.proxyIndexers\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"use proxy host for connecting to indexers (thetvdb, tmdb or tvmaze)\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.general.proxySetting !== \"\"\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use proxy for clients\",\n id: \"proxy_clients\"\n },\n model: {\n value: _vm.general.proxyClients,\n callback: function($$v) {\n _vm.$set(_vm.general, \"proxyClients\", $$v)\n },\n expression: \"general.proxyClients\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"use proxy host for connecting torrent or usenet clients (nzbGet excluded)\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.general.proxySetting !== \"\"\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Use proxy for other sites\",\n id: \"proxy_others\"\n },\n model: {\n value: _vm.general.proxyOthers,\n callback: function($$v) {\n _vm.$set(_vm.general, \"proxyOthers\", $$v)\n },\n expression: \"general.proxyOthers\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"use proxy host for connecting to other sites.\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Skip Remove Detection\",\n id: \"skip_removed_files\"\n },\n model: {\n value: _vm.general.skipRemovedFiles,\n callback: function($$v) {\n _vm.$set(_vm.general, \"skipRemovedFiles\", $$v)\n },\n expression: \"general.skipRemovedFiles\"\n }\n },\n [\n _c(\"span\", [\n _c(\"p\", [\n _vm._v(\n \"Skip detection of removed files. If disabled the episode will be set to the default deleted status\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" This may mean Medusa misses renames as well\\n \"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"ep_default_deleted_status\",\n label: \"Default deleted episode status\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.epDefaultDeletedStatus,\n expression: \"general.epDefaultDeletedStatus\"\n }\n ],\n staticClass:\n \"form-control input-sm margin-bottom-5\",\n attrs: {\n id: \"ep_default_deleted_status\",\n name: \"ep_default_deleted_status\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.general,\n \"epDefaultDeletedStatus\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { disabled: \"\", value: \"\" } },\n [_vm._v(\"Please select a default status\")]\n ),\n _vm._v(\" \"),\n _vm._l(_vm.defaultDeletedEpOptions, function(\n option\n ) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"Define the status to be set for media file that has been deleted.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Archived option will keep previous downloaded quality\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Example: Downloaded (1080p WEB-DL) ==> Archived (1080p WEB-DL)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable experimental features\",\n id: \"experimental\"\n },\n model: {\n value: _vm.general.experimental,\n callback: function($$v) {\n _vm.$set(_vm.general, \"experimental\", $$v)\n },\n expression: \"general.experimental\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\"allow for using experimental features\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(7),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Enable debug\", id: \"debug\" },\n model: {\n value: _vm.general.logs.debug,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"debug\", $$v)\n },\n expression: \"general.logs.debug\"\n }\n },\n [_c(\"p\", [_vm._v(\"Enable debug logs\")])]\n ),\n _vm._v(\" \"),\n _vm.general.developer\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Enable DB debug\",\n id: \"dbdebug\"\n },\n model: {\n value: _vm.general.logs.dbDebug,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"dbDebug\", $$v)\n },\n expression: \"general.logs.dbDebug\"\n }\n },\n [_c(\"p\", [_vm._v(\"Enable DB debug logs\")])]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Subliminal logs\",\n id: \"subliminal_log\"\n },\n model: {\n value: _vm.general.logs.subliminalLog,\n callback: function($$v) {\n _vm.$set(_vm.general.logs, \"subliminalLog\", $$v)\n },\n expression: \"general.logs.subliminalLog\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"enable logs from subliminal library (subtitles)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"privacy_level\",\n label: \"Privacy\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.logs.privacyLevel,\n expression: \"general.logs.privacyLevel\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: {\n id: \"privacy_level\",\n name: \"privacy_level\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.general.logs,\n \"privacyLevel\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.privacyLevelOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n Set the level of log-filtering.\\n Normal (default).\\n \"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"custom_logs\",\n label:\n \"Overwrite log levels for overwritable logs\"\n }\n },\n [_c(\"custom-logs\")],\n 1\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _vm._m(8),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-xs-12 col-md-10\" }, [\n _c(\n \"fieldset\",\n { staticClass: \"component-group-list\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"github_remote_branches\",\n label: \"Branch version\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedBranch,\n expression: \"selectedBranch\"\n }\n ],\n staticClass:\n \"form-control input-sm margin-bottom-5\",\n attrs: {\n id: \"github_remote_branches\",\n name: \"github_remote_branches\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val =\n \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.selectedBranch = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\n \"option\",\n { attrs: { disabled: \"\", value: \"\" } },\n [_vm._v(\"Please select a branch\")]\n ),\n _vm._v(\" \"),\n _vm._l(\n _vm.githubRemoteBranchesOptions,\n function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [_vm._v(_vm._s(option.text))]\n )\n }\n )\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n staticStyle: { \"margin-left\": \"6px\" },\n attrs: {\n disabled: !_vm.gitRemoteBranches.length > 0,\n type: \"button\",\n id: \"branchCheckout\",\n value: \"Checkout Branch\"\n },\n on: { click: _vm.validateCheckoutBranch }\n }),\n _vm._v(\" \"),\n !_vm.gitRemoteBranches.length > 0\n ? _c(\n \"span\",\n { staticStyle: { color: \"rgb(255, 0, 0)\" } },\n [\n _c(\"p\", [\n _vm._v(\"Error: No branches found.\")\n ])\n ]\n )\n : _c(\"p\", [\n _vm._v(\n \"select branch to use (restart required)\"\n )\n ]),\n _vm._v(\" \"),\n _vm.checkoutBranchMessage\n ? _c(\n \"p\",\n [\n _c(\"state-switch\", {\n attrs: {\n state: \"loading\",\n theme: _vm.layout.themeName\n }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(_vm._s(_vm.checkoutBranchMessage))\n ])\n ],\n 1\n )\n : _vm._e()\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"date_presets\",\n label: \"GitHub authentication type\"\n }\n },\n [\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.git.authType,\n expression: \"general.git.authType\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"git_auth_type_basic\",\n id: \"git_auth_type_basic\"\n },\n domProps: {\n value: 0,\n checked: _vm._q(_vm.general.git.authType, 0)\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.general.git,\n \"authType\",\n 0\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"Username and password\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"radio-item\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.general.git.authType,\n expression: \"general.git.authType\"\n }\n ],\n attrs: {\n type: \"radio\",\n name: \"git_auth_type_token\",\n id: \"git_auth_type_token\"\n },\n domProps: {\n value: 1,\n checked: _vm._q(_vm.general.git.authType, 1)\n },\n on: {\n change: function($event) {\n return _vm.$set(\n _vm.general.git,\n \"authType\",\n 1\n )\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"label\", { attrs: { for: \"one\" } }, [\n _vm._v(\"Personal access token\")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n 'You must use a personal access token if you\\'re using \"two-factor authentication\" on GitHub.'\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.general.git.authType === 0,\n expression: \"general.git.authType === 0\"\n }\n ]\n },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub username\",\n id: \"git_username\"\n },\n model: {\n value: _vm.general.git.username,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"username\", $$v)\n },\n expression: \"general.git.username\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"*** (REQUIRED FOR SUBMITTING ISSUES) ***\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub password\",\n id: \"git_password\",\n type: \"password\"\n },\n model: {\n value: _vm.general.git.password,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"password\", $$v)\n },\n expression: \"general.git.password\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"*** (REQUIRED FOR SUBMITTING ISSUES) ***\"\n )\n ])\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.general.git.authType !== 0,\n expression: \"general.git.authType !== 0\"\n }\n ]\n },\n [\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub personal access token\",\n id: \"git_token\",\n \"input-class\":\n \"display-inline margin-bottom-5\"\n },\n nativeOn: {\n focus: function($event) {\n return $event.target.select()\n }\n },\n model: {\n value: _vm.general.git.token,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"token\", $$v)\n },\n expression: \"general.git.token\"\n }\n },\n [\n _vm.general.git.token === \"\"\n ? [\n _c(\n \"v-popover\",\n {\n attrs: {\n trigger: \"click\",\n offset: \"16\",\n placement: \"right\",\n popoverBaseClass: \"tooltip-base\",\n popoverClass:\n \"tooltip-themed\" +\n (_vm.layout.themeName === \"dark\"\n ? \"-dark\"\n : \"-light\")\n }\n },\n [\n _c(\"input\", {\n staticClass:\n \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n id: \"create_access_token\",\n value: \"Generate Token\"\n }\n }),\n _vm._v(\" \"),\n _c(\"template\", { slot: \"popover\" }, [\n _c(\n \"div\",\n { staticClass: \"tooltip-title\" },\n [_vm._v(\"Github Token\")]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"tooltip-content\"\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Copy the generated token and paste it in the token input box.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\n \"a\",\n {\n attrs: {\n href:\n (_vm.general\n .anonRedirect ||\n \"\") +\n \"https://github.com/settings/tokens/new?description=Medusa&scopes=gist,public_repo\",\n target: \"_blank\"\n }\n },\n [\n _c(\"input\", {\n staticClass:\n \"btn-medusa\",\n attrs: {\n type: \"button\",\n value:\n \"Continue to Github...\"\n }\n })\n ]\n )\n ]),\n _c(\"br\")\n ]\n )\n ])\n ],\n 2\n )\n ]\n : [\n _c(\n \"a\",\n {\n attrs: {\n href:\n (_vm.general.anonRedirect || \"\") +\n \"https://github.com/settings/tokens\",\n target: \"_blank\"\n }\n },\n [\n _c(\"input\", {\n staticClass:\n \"btn-medusa btn-inline\",\n attrs: {\n type: \"button\",\n id: \"manage_tokens\",\n value: \"Manage Tokens\"\n }\n })\n ]\n )\n ],\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"*** (REQUIRED FOR SUBMITTING ISSUES) ***\"\n )\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"GitHub remote for branch\",\n id: \"git_remote\"\n },\n model: {\n value: _vm.general.git.remote,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"remote\", $$v)\n },\n expression: \"general.git.remote\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"default:origin. Access repo configured remotes (save then refresh browser)\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n attrs: {\n label: \"Git executable path\",\n id: \"git_path\"\n },\n model: {\n value: _vm.general.git.path,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"path\", $$v)\n },\n expression: \"general.git.path\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"only needed if OS is unable to locate git from env\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.general.developer\n ? _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Git reset\", id: \"git_reset\" },\n model: {\n value: _vm.general.git.reset,\n callback: function($$v) {\n _vm.$set(_vm.general.git, \"reset\", $$v)\n },\n expression: \"general.git.reset\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"removes untracked files and performs a hard reset on git branch automatically to help resolve update issues\"\n )\n ])\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.general.developer\n ? _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"git_reset_branches\",\n label: \"Branches to reset\"\n }\n },\n [\n _c(\"multiselect\", {\n attrs: {\n multiple: true,\n options: _vm.gitRemoteBranches\n },\n model: {\n value: _vm.general.git.resetBranches,\n callback: function($$v) {\n _vm.$set(\n _vm.general.git,\n \"resetBranches\",\n $$v\n )\n },\n expression: \"general.git.resetBranches\"\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa btn-inline\",\n staticStyle: { \"margin-left\": \"6px\" },\n attrs: {\n type: \"button\",\n id: \"branch_force_update\",\n value: \"Update Branches\"\n },\n on: {\n click: function($event) {\n return _vm.gitRemoteBranches()\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"span\", [\n _c(\"b\", [_vm._v(\"Note:\")]),\n _vm._v(\n \" Empty selection means that any branch could be reset.\"\n )\n ])\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { type: \"submit\", value: \"Save Changes\" }\n })\n ],\n 1\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"h6\", { staticClass: \"pull-right\" }, [\n _c(\"b\", [\n _vm._v(\"All non-absolute folder locations are relative to \"),\n _c(\"span\", { staticClass: \"path\" }, [\n _vm._v(_vm._s(_vm.system.dataDir))\n ])\n ])\n ])\n ])\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"modal\",\n {\n attrs: {\n name: \"query-upgrade-database\",\n height: \"auto\",\n width: \"80%\"\n }\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 Upgrade database model?\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [\n _vm._v(\"Changing branch will upgrade your database\")\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\"You won't be able to downgrade afterward.\")\n ]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Do you want to continue?\")])\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.$modal.hide(\"query-upgrade-database\")\n _vm.checkoutBranchMessage = \"\"\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.checkoutBranch()\n _vm.$modal.hide(\"query-upgrade-database\")\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 { attrs: { name: \"query-restart\", height: \"auto\", width: \"80%\" } },\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 Checking out a branch requires a restart\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"p\", [\n _vm._v(\"Would you like to start a restart of medusa now?\")\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 _vm.$modal.hide(\"query-restart\")\n _vm.checkoutBranchMessage = \"\"\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.$modal.hide(\"query-restart\")\n _vm.$router.push({ name: \"restart\" })\n }\n }\n },\n [_vm._v(\"Yes\")]\n )\n ])\n ])\n ])\n ])\n ])\n ],\n 1\n )\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 \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Misc\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Startup options. Indexer options. Log and show file locations.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [\n _vm._v(\"Some options may require a manual restart to take effect.\")\n ])\n ])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", { staticStyle: { \"word-break\": \"break-word\" } }, [\n _vm._v(\"Recommended shows\")\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\"Options for controlling the caching of recommended shows.\")\n ])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Indexer\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for controlling the show indexers.\")])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Updates\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for software updates.\")])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"User Interface\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for visual appearance.\")])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"Web Interface\")]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"It is recommended that you enable a username and password to secure Medusa from being tampered with remotely.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _c(\"b\", [\n _vm._v(\"These options require a manual restart to take effect.\")\n ])\n ])\n ]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [_c(\"h3\", [_vm._v(\"Advanced Settings\")])]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [_c(\"h3\", [_vm._v(\"Logging\")])]\n )\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-md-2\" },\n [\n _c(\"h3\", [_vm._v(\"GitHub\")]),\n _vm._v(\" \"),\n _c(\"p\", [_vm._v(\"Options for github related features.\")])\n ]\n )\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/config-general.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -5629,7 +5900,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return !_vm.lazy\n ? _c(\n \"div\",\n { staticStyle: { display: \"inherit\" } },\n [\n !_vm.link\n ? _c(\n \"img\",\n _vm._b(\n {\n on: {\n error: function($event) {\n _vm.error = true\n }\n }\n },\n \"img\",\n { src: _vm.src, class: _vm.cls, class: _vm.newCls },\n false\n )\n )\n : _c(\"app-link\", { attrs: { href: _vm.href } }, [\n _c(\n \"img\",\n _vm._b(\n {\n on: {\n error: function($event) {\n _vm.error = true\n }\n }\n },\n \"img\",\n { src: _vm.src, class: _vm.newCls },\n false\n )\n )\n ])\n ],\n 1\n )\n : _c(\n \"div\",\n { staticStyle: { display: \"inherit\" } },\n [\n !_vm.link\n ? _c(\"lazy-image\", {\n attrs: {\n \"lazy-src\": _vm.src,\n \"lazy-cls\": _vm.newCls,\n \"lazy-default-src\": _vm.defaultSrc\n }\n })\n : _c(\n \"app-link\",\n { attrs: { href: _vm.href } },\n [\n _c(\"lazy-image\", {\n attrs: {\n \"lazy-src\": _vm.src,\n \"lazy-cls\": _vm.newCls,\n \"lazy-default-src\": _vm.defaultSrc\n }\n })\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/helpers/asset.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return !_vm.lazy\n ? _c(\n \"div\",\n { staticStyle: { display: \"inherit\" } },\n [\n !_vm.link\n ? _c(\n \"img\",\n _vm._b(\n {\n on: {\n error: function($event) {\n _vm.error = true\n }\n }\n },\n \"img\",\n { src: _vm.src, class: _vm.cls, class: _vm.newCls },\n false\n )\n )\n : _c(\"app-link\", { attrs: { href: _vm.href } }, [\n _c(\n \"img\",\n _vm._b(\n {\n on: {\n error: function($event) {\n _vm.error = true\n }\n }\n },\n \"img\",\n { src: _vm.src, class: _vm.newCls, style: _vm.imgStyle },\n false\n )\n )\n ])\n ],\n 1\n )\n : _c(\n \"div\",\n { staticStyle: { display: \"inherit\" } },\n [\n !_vm.link\n ? _c(\"lazy-image\", {\n attrs: {\n \"lazy-src\": _vm.src,\n \"lazy-cls\": _vm.newCls,\n \"lazy-default-src\": _vm.defaultSrc,\n \"lazy-width\": _vm.imgWidth\n }\n })\n : _c(\n \"app-link\",\n { attrs: { href: _vm.href } },\n [\n _c(\"lazy-image\", {\n attrs: {\n \"lazy-src\": _vm.src,\n \"lazy-cls\": _vm.newCls,\n \"lazy-default-src\": _vm.defaultSrc\n }\n })\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/helpers/asset.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -5908,6 +6179,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/select-trakt-lists.vue?vue&type=template&id=38f4c8dd&scoped=true&": +/*!*****************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/select-trakt-lists.vue?vue&type=template&id=38f4c8dd&scoped=true& ***! + \*****************************************************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"select-trakt-list max-width\" }, [\n _c(\n \"ul\",\n _vm._l(_vm.availableLists, function(availableList) {\n return _c(\"li\", { key: availableList }, [\n _c(\"div\", { staticClass: \"trakt-list-group\" }, [\n _c(\"input\", {\n staticClass: \"form-control input-sm available-list\",\n attrs: { disabled: \"\", type: \"text\" },\n domProps: { value: availableList }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: _vm.selectedLists.find(function(list) {\n return list === availableList\n })\n },\n on: {\n input: function($event) {\n return _vm.saveLists($event, availableList)\n }\n }\n })\n ])\n ])\n }),\n 0\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/helpers/select-trakt-lists.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/show-selector.vue?vue&type=template&id=6e81af76&": /*!************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/show-selector.vue?vue&type=template&id=6e81af76& ***! @@ -5952,6 +6234,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/trakt-authentication.vue?vue&type=template&id=cd53d81a&scoped=true&": +/*!*******************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/helpers/trakt-authentication.vue?vue&type=template&id=cd53d81a&scoped=true& ***! + \*******************************************************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\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(\"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.trakt.enabled,\n callback: function($$v) {\n _vm.$set(_vm.trakt, \"enabled\", $$v)\n },\n expression: \"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.trakt.enabled,\n expression: \"trakt.enabled\"\n }\n ],\n attrs: { id: \"content-use-trakt-client\" }\n },\n [\n _c(\n \"config-template\",\n { attrs: { \"label-for\": \"trakt_request_auth\", label: \"\" } },\n [\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n type: \"button\",\n value: \"Connect to your trakt account\",\n id: \"Trakt\"\n },\n on: { click: _vm.TraktRequestDeviceCode }\n }),\n _vm._v(\" \"),\n _vm.traktRequestSend && _vm.traktUserCode\n ? _c(\"span\", { staticStyle: { display: \"inline\" } }, [\n _vm._v(\n \"Use this code in the popup: \" + _vm._s(_vm.traktUserCode)\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.traktRequestSend &&\n _vm.traktUserCode &&\n _vm.traktRequestMessage\n ? _c(\"p\", [\n _vm._v(\n \"Trakt request status: \" + _vm._s(_vm.traktRequestMessage)\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.traktRequestAuthenticated && _vm.traktRequestMessage\n ? _c(\"p\", [_vm._v(_vm._s(_vm.traktRequestMessage))])\n : _vm._e()\n ]\n ),\n _vm._v(\" \"),\n !_vm.authOnly\n ? [\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.trakt.timeout,\n callback: function($$v) {\n _vm.$set(_vm.trakt, \"timeout\", $$v)\n },\n expression: \"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: _vm.trakt.defaultIndexer,\n expression: \"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($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.trakt,\n \"defaultIndexer\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.traktIndexersOptions, function(option) {\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(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Sync libraries\", id: \"trakt_sync\" },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.trakt.sync,\n callback: function($$v) {\n _vm.$set(_vm.trakt, \"sync\", $$v)\n },\n expression: \"trakt.sync\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Sync your Medusa show library with your Trakt collection.\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\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 _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\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 ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.trakt.sync,\n expression: \"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: _vm.trakt.removeWatchlist,\n callback: function($$v) {\n _vm.$set(_vm.trakt, \"removeWatchlist\", $$v)\n },\n expression: \"trakt.removeWatchlist\"\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Sync watchlist\",\n id: \"trakt_sync_watchlist\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.trakt.syncWatchlist,\n callback: function($$v) {\n _vm.$set(_vm.trakt, \"syncWatchlist\", $$v)\n },\n expression: \"trakt.syncWatchlist\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Sync your Medusa library with your Trakt Watchlist (either Show and Episode).\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Episode will be added on watch list when wanted or snatched and will be removed when downloaded\"\n )\n ]),\n _vm._v(\" \"),\n _c(\"p\", [\n _vm._v(\n \"Note: By design, Trakt automatically removes episodes and/or shows from watchlist as soon you have watched them.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.trakt.syncWatchlist,\n expression: \"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: _vm.trakt.methodAdd,\n expression: \"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($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.trakt,\n \"methodAdd\",\n $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n )\n }\n }\n },\n _vm._l(_vm.traktMethodOptions, function(option) {\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(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Remove episode\",\n id: \"trakt_remove_watchlist\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.trakt.removeWatchlist,\n callback: function($$v) {\n _vm.$set(_vm.trakt, \"removeWatchlist\", $$v)\n },\n expression: \"trakt.removeWatchlist\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"remove an episode from your watchlist after it's downloaded.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Remove series\",\n id: \"trakt_remove_serieslist\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.trakt.removeSerieslist,\n callback: function($$v) {\n _vm.$set(_vm.trakt, \"removeSerieslist\", $$v)\n },\n expression: \"trakt.removeSerieslist\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"remove the whole series from your watchlist after any download.\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Remove watched show\",\n id: \"trakt_remove_show_from_application\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.trakt.removeShowFromApplication,\n callback: function($$v) {\n _vm.$set(\n _vm.trakt,\n \"removeShowFromApplication\",\n $$v\n )\n },\n expression: \"trakt.removeShowFromApplication\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"remove the show from Medusa if it\\\\'s ended and completely watched\"\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Start paused\",\n id: \"trakt_start_paused\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.trakt.startPaused,\n callback: function($$v) {\n _vm.$set(_vm.trakt, \"startPaused\", $$v)\n },\n expression: \"trakt.startPaused\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"shows grabbed from your trakt watchlist start paused.\"\n )\n ])\n ]\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-textbox\",\n {\n class: _vm.traktBlacklistClass,\n attrs: {\n label: \"Trakt blackList name\",\n id: \"trakt_blacklist_name\"\n },\n on: {\n change: function($event) {\n return _vm.save()\n }\n },\n model: {\n value: _vm.trakt.blacklistName,\n callback: function($$v) {\n _vm.$set(_vm.trakt, \"blacklistName\", $$v)\n },\n expression: \"trakt.blacklistName\"\n }\n },\n [\n _c(\"p\", [\n _vm._v(\n \"Name(slug) of List on Trakt for blacklisting show on 'Add Trending Show' & 'Add Recommended Shows' pages\"\n )\n ])\n ]\n )\n ]\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"testNotification\",\n attrs: { id: \"testTrakt-result\" }\n },\n [_vm._v(_vm._s(_vm.testTraktResult))]\n ),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: { type: \"hidden\", id: \"trakt_pin_url\" },\n domProps: { value: _vm.trakt.pinUrl }\n }),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa\",\n attrs: { id: \"testTrakt\" },\n on: { click: _vm.testTrakt }\n },\n [_vm._v(\"Test Trakt\")]\n ),\n _vm._v(\" \"),\n !_vm.authOnly\n ? _c(\n \"button\",\n {\n staticClass: \"btn-medusa\",\n attrs: { id: \"forceSync\" },\n on: { click: _vm.traktForceSync }\n },\n [_vm._v(\"Force Sync\")]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa config_submitter\",\n attrs: { disabled: _vm.saving },\n on: { click: _vm.save }\n },\n [_vm._v(\"Save Changes\")]\n )\n ],\n 2\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/helpers/trakt-authentication.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-compact.vue?vue&type=template&id=899ba7ec&scoped=true&": /*!******************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/history-compact.vue?vue&type=template&id=899ba7ec&scoped=true& ***! @@ -6047,7 +6340,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"align-left\" }, [\n _vm.schedulerStatus\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-lg-12\" },\n [\n _c(\"h3\", [_vm._v(\"Backlog Search:\")]),\n _vm._v(\" \"),\n _c(\"h5\", [\n _vm._v(\n \"Note: Limited by backlog days setting: last \" +\n _vm._s(_vm.search.general.backlogDays) +\n \" days\"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n { staticClass: \"btn-medusa\", on: { click: _vm.forceBacklog } },\n [\n _c(\"i\", { staticClass: \"icon-exclamation-sign\" }),\n _vm._v(\" Force\\n \")\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n { staticClass: \"btn-medusa\", on: { click: _vm.toggleBacklog } },\n [\n _vm.schedulerStatus.backlogPaused\n ? [\n _c(\"i\", { staticClass: \"icon-play\" }),\n _vm._v(\" Unpause\")\n ]\n : [\n _c(\"i\", { staticClass: \"icon-paused\" }),\n _vm._v(\" Pause\")\n ]\n ],\n 2\n ),\n _vm._v(\" \"),\n !_vm.schedulerStatus.backlogRunning\n ? [_vm._v(\"Not in progress\")]\n : [\n _vm._v(\n _vm._s(\n _vm.schedulerStatus.backlogPaused ? \"Paused: \" : \"\"\n ) + \"Currently running\"\n )\n ]\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.schedulerStatus\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-lg-12\" }, [\n _c(\"h3\", [_vm._v(\"Daily Search:\")]),\n _vm._v(\" \"),\n _c(\n \"button\",\n { staticClass: \"btn-medusa\", on: { click: _vm.forceDaily } },\n [\n _c(\"i\", { staticClass: \"icon-exclamation-sign\" }),\n _vm._v(\" Force\\n \")\n ]\n ),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.schedulerStatus.dailySearchStatus\n ? \"In Progress\"\n : \"Not in progress\"\n ) +\n \"\\n \"\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.schedulerStatus\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-lg-12\" },\n [\n _c(\"h3\", [_vm._v(\"Propers Search:\")]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa\",\n attrs: { disabled: !_vm.search.general.downloadPropers },\n on: { click: _vm.forceFindPropers }\n },\n [\n _c(\"i\", { staticClass: \"icon-exclamation-sign\" }),\n _vm._v(\" Force\\n \")\n ]\n ),\n _vm._v(\" \"),\n !_vm.search.general.downloadPropers\n ? [_vm._v(\"Propers search disabled\")]\n : [\n _vm._v(\n _vm._s(\n _vm.schedulerStatus.properSearchStatus\n ? \"In Progress\"\n : \"Not in progress\"\n )\n )\n ]\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.schedulerStatus\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-lg-12\" },\n [\n _c(\"h3\", [_vm._v(\"Subtitle Search:\")]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa\",\n attrs: { disabled: !_vm.general.subtitles.enabled },\n on: { click: _vm.forceSubtitlesFinder }\n },\n [\n _c(\"i\", { staticClass: \"icon-exclamation-sign\" }),\n _vm._v(\" Force\\n \")\n ]\n ),\n _vm._v(\" \"),\n !_vm.general.subtitles.enabled\n ? [_vm._v(\"Subtitle search disabled\")]\n : [\n _vm._v(\n _vm._s(\n _vm.schedulerStatus.subtitlesFinderStatus\n ? \"In Progress\"\n : \"Not in progress\"\n )\n )\n ]\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.schedulerStatus\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-lg-12\" },\n [\n _c(\"h3\", [_vm._v(\"Download Handler:\")]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa\",\n attrs: {\n disabled: _vm.schedulerStatus.downloadHandlerStatus\n },\n on: { click: _vm.forceDownloadHandler }\n },\n [\n _c(\"i\", { staticClass: \"icon-exclamation-sign\" }),\n _vm._v(\" Force\\n \")\n ]\n ),\n _vm._v(\" \"),\n [\n _vm._v(\n _vm._s(\n _vm.schedulerStatus.downloadHandlerStatus\n ? \"In Progress\"\n : \"Not in progress\"\n )\n )\n ]\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-lg-12\" }, [\n _c(\"h3\", [_vm._v(\"Scene Exceptions:\")]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa\",\n attrs: { disabled: _vm.sceneRefresh.inProgress },\n on: { click: _vm.forceSceneExceptionRefresh }\n },\n [\n _c(\"i\", { staticClass: \"icon-exclamation-sign\" }),\n _vm._v(\" Force\\n \")\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"span\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.sceneRefresh.message,\n expression: \"sceneRefresh.message\"\n }\n ]\n },\n [\n _c(\"img\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.sceneRefresh.showSpinner,\n expression: \"sceneRefresh.showSpinner\"\n }\n ],\n attrs: { src: _vm.spinnerSrc, height: \"16\", width: \"16\" }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.sceneRefresh.message) +\n \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n !_vm.sceneRefresh.inProgress &&\n _vm.sceneExceptions.every(function(item) {\n return item.lastRefresh\n })\n ? _c(\n \"ul\",\n { staticClass: \"simpleList\" },\n _vm._l(_vm.sceneExceptions, function(item) {\n return _c(\n \"li\",\n { key: item.id },\n [\n item.url\n ? _c(\"app-link\", { attrs: { href: item.url } }, [\n _vm._v(\n \"Last updated \" + _vm._s(item.name) + \" exceptions\"\n )\n ])\n : [\n _vm._v(\n \"Last updated \" + _vm._s(item.name) + \" exceptions\"\n )\n ],\n _vm._v(\n \"\\n \" +\n _vm._s(item.lastRefresh) +\n \"\\n \"\n )\n ],\n 2\n )\n }),\n 0\n )\n : _vm._e()\n ])\n ]),\n _vm._v(\" \"),\n _vm.schedulerStatus\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-lg-12\" }, [\n _c(\"h3\", [_vm._v(\"Search Queue:\")]),\n _vm._v(\" \"),\n _c(\"ul\", { staticClass: \"simpleList\" }, [\n _c(\"li\", [\n _vm._v(\"Backlog: \"),\n _c(\"i\", [\n _vm._v(\n _vm._s(_vm.schedulerStatus.searchQueueLength.backlog) +\n \" pending items\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"li\", [\n _vm._v(\"Daily: \"),\n _c(\"i\", [\n _vm._v(\n _vm._s(_vm.schedulerStatus.searchQueueLength.daily) +\n \" pending items\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"li\", [\n _vm._v(\"Forced: \"),\n _c(\"i\", [\n _vm._v(\n _vm._s(\n _vm.schedulerStatus.forcedSearchQueueLength.backlog_search\n ) + \" pending items\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"li\", [\n _vm._v(\"Manual: \"),\n _c(\"i\", [\n _vm._v(\n _vm._s(\n _vm.schedulerStatus.forcedSearchQueueLength.manual_search\n ) + \" pending items\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"li\", [\n _vm._v(\"Failed: \"),\n _c(\"i\", [\n _vm._v(\n _vm._s(_vm.schedulerStatus.forcedSearchQueueLength.failed) +\n \" pending items\"\n )\n ])\n ])\n ])\n ])\n ])\n : _vm._e()\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/manage-searches.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"align-left\" }, [\n _vm.schedulerStatus\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-lg-12\" },\n [\n _c(\"h3\", [_vm._v(\"Backlog Search:\")]),\n _vm._v(\" \"),\n _c(\"h5\", [\n _vm._v(\n \"Note: Limited by backlog days setting: last \" +\n _vm._s(_vm.search.general.backlogDays) +\n \" days\"\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n { staticClass: \"btn-medusa\", on: { click: _vm.forceBacklog } },\n [\n _c(\"i\", { staticClass: \"icon-exclamation-sign\" }),\n _vm._v(\" Force\\n \")\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n { staticClass: \"btn-medusa\", on: { click: _vm.toggleBacklog } },\n [\n _vm.schedulerStatus.backlogPaused\n ? [\n _c(\"i\", { staticClass: \"icon-play\" }),\n _vm._v(\" Unpause\")\n ]\n : [\n _c(\"i\", { staticClass: \"icon-paused\" }),\n _vm._v(\" Pause\")\n ]\n ],\n 2\n ),\n _vm._v(\" \"),\n !_vm.schedulerStatus.backlogRunning\n ? [_vm._v(\"Not in progress\")]\n : [\n _vm._v(\n _vm._s(\n _vm.schedulerStatus.backlogPaused ? \"Paused: \" : \"\"\n ) + \"Currently running\"\n )\n ]\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.schedulerStatus\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-lg-12\" }, [\n _c(\"h3\", [_vm._v(\"Daily Search:\")]),\n _vm._v(\" \"),\n _c(\n \"button\",\n { staticClass: \"btn-medusa\", on: { click: _vm.forceDaily } },\n [\n _c(\"i\", { staticClass: \"icon-exclamation-sign\" }),\n _vm._v(\" Force\\n \")\n ]\n ),\n _vm._v(\n \"\\n \" +\n _vm._s(\n _vm.schedulerStatus.dailySearchStatus\n ? \"In Progress\"\n : \"Not in progress\"\n ) +\n \"\\n \"\n )\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.schedulerStatus\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-lg-12\" },\n [\n _c(\"h3\", [_vm._v(\"Propers Search:\")]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa\",\n attrs: { disabled: !_vm.search.general.downloadPropers },\n on: { click: _vm.forceFindPropers }\n },\n [\n _c(\"i\", { staticClass: \"icon-exclamation-sign\" }),\n _vm._v(\" Force\\n \")\n ]\n ),\n _vm._v(\" \"),\n !_vm.search.general.downloadPropers\n ? [_vm._v(\"Propers search disabled\")]\n : [\n _vm._v(\n _vm._s(\n _vm.schedulerStatus.properSearchStatus\n ? \"In Progress\"\n : \"Not in progress\"\n )\n )\n ]\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.schedulerStatus\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-lg-12\" },\n [\n _c(\"h3\", [_vm._v(\"Subtitle Search:\")]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa\",\n attrs: { disabled: !_vm.general.subtitles.enabled },\n on: { click: _vm.forceSubtitlesFinder }\n },\n [\n _c(\"i\", { staticClass: \"icon-exclamation-sign\" }),\n _vm._v(\" Force\\n \")\n ]\n ),\n _vm._v(\" \"),\n !_vm.general.subtitles.enabled\n ? [_vm._v(\"Subtitle search disabled\")]\n : [\n _vm._v(\n _vm._s(\n _vm.schedulerStatus.subtitlesFinderStatus\n ? \"In Progress\"\n : \"Not in progress\"\n )\n )\n ]\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.schedulerStatus\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-lg-12\" },\n [\n _c(\"h3\", [_vm._v(\"Download Handler:\")]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa\",\n attrs: {\n disabled: _vm.schedulerStatus.downloadHandlerStatus\n },\n on: { click: _vm.forceDownloadHandler }\n },\n [\n _c(\"i\", { staticClass: \"icon-exclamation-sign\" }),\n _vm._v(\" Force\\n \")\n ]\n ),\n _vm._v(\" \"),\n [\n _vm._v(\n _vm._s(\n _vm.schedulerStatus.downloadHandlerStatus\n ? \"In Progress\"\n : \"Not in progress\"\n )\n )\n ]\n ],\n 2\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-lg-12\" }, [\n _c(\"h3\", [_vm._v(\"Scene Exceptions:\")]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa\",\n attrs: { disabled: _vm.sceneRefresh.inProgress },\n on: { click: _vm.forceSceneExceptionRefresh }\n },\n [\n _c(\"i\", { staticClass: \"icon-exclamation-sign\" }),\n _vm._v(\" Force\\n \")\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"span\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.sceneRefresh.message,\n expression: \"sceneRefresh.message\"\n }\n ]\n },\n [\n _c(\"img\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.sceneRefresh.showSpinner,\n expression: \"sceneRefresh.showSpinner\"\n }\n ],\n attrs: { src: _vm.spinnerSrc, height: \"16\", width: \"16\" }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.sceneRefresh.message) +\n \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n !_vm.sceneRefresh.inProgress &&\n _vm.sceneExceptions.every(function(item) {\n return item.lastRefresh\n })\n ? _c(\n \"ul\",\n { staticClass: \"simpleList\" },\n _vm._l(_vm.sceneExceptions, function(item) {\n return _c(\n \"li\",\n { key: item.id },\n [\n item.url\n ? _c(\"app-link\", { attrs: { href: item.url } }, [\n _vm._v(\n \"Last updated \" + _vm._s(item.name) + \" exceptions\"\n )\n ])\n : [\n _vm._v(\n \"Last updated \" + _vm._s(item.name) + \" exceptions\"\n )\n ],\n _vm._v(\n \"\\n \" +\n _vm._s(item.lastRefresh) +\n \"\\n \"\n )\n ],\n 2\n )\n }),\n 0\n )\n : _vm._e()\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-lg-12\" }, [\n _c(\"h3\", [_vm._v(\"Force refresh recommended list:\")]),\n _vm._v(\" \"),\n _c(\"span\", [\n _vm._v(\n \"\\n Note! Syncing shows with a recommended list may take a while.\\n The action will be queued. For example staring a sync with Trakt and directly after Imdb.\\n You will won't see results for Imdb after the sync of Trakt has fully completed.\\n \"\n )\n ]),\n _vm._v(\" \"),\n _c(\"ul\", { staticClass: \"simpleList recommended-list\" }, [\n _c(\"li\", [\n _c(\n \"span\",\n {\n on: {\n click: function($event) {\n return _vm.searchRecommendedShows(\"trakt\")\n }\n }\n },\n [_vm._v(\"Trakt\")]\n )\n ]),\n _vm._v(\" \"),\n _c(\"li\", [\n _c(\n \"span\",\n {\n on: {\n click: function($event) {\n return _vm.searchRecommendedShows(\"imdb\")\n }\n }\n },\n [_vm._v(\"Imdb\")]\n )\n ]),\n _vm._v(\" \"),\n _c(\"li\", [\n _c(\n \"span\",\n {\n on: {\n click: function($event) {\n return _vm.searchRecommendedShows(\"anidb\")\n }\n }\n },\n [_vm._v(\"Anidb\")]\n )\n ]),\n _vm._v(\" \"),\n _c(\"li\", [\n _c(\n \"span\",\n {\n on: {\n click: function($event) {\n return _vm.searchRecommendedShows(\"anilist\")\n }\n }\n },\n [_vm._v(\"AniList\")]\n )\n ])\n ])\n ])\n ]),\n _vm._v(\" \"),\n _vm.schedulerStatus\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-lg-12\" }, [\n _c(\"h3\", [_vm._v(\"Search Queue:\")]),\n _vm._v(\" \"),\n _c(\"ul\", { staticClass: \"simpleList\" }, [\n _c(\"li\", [\n _vm._v(\"Backlog: \"),\n _c(\"i\", [\n _vm._v(\n _vm._s(_vm.schedulerStatus.searchQueueLength.backlog) +\n \" pending items\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"li\", [\n _vm._v(\"Daily: \"),\n _c(\"i\", [\n _vm._v(\n _vm._s(_vm.schedulerStatus.searchQueueLength.daily) +\n \" pending items\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"li\", [\n _vm._v(\"Forced: \"),\n _c(\"i\", [\n _vm._v(\n _vm._s(\n _vm.schedulerStatus.forcedSearchQueueLength.backlog_search\n ) + \" pending items\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"li\", [\n _vm._v(\"Manual: \"),\n _c(\"i\", [\n _vm._v(\n _vm._s(\n _vm.schedulerStatus.forcedSearchQueueLength.manual_search\n ) + \" pending items\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"li\", [\n _vm._v(\"Failed: \"),\n _c(\"i\", [\n _vm._v(\n _vm._s(_vm.schedulerStatus.forcedSearchQueueLength.failed) +\n \" pending items\"\n )\n ])\n ])\n ])\n ])\n ])\n : _vm._e()\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/manage-searches.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -6095,6 +6388,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended-poster.vue?vue&type=template&id=61ca7b8f&scoped=true&": +/*!*********************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended-poster.vue?vue&type=template&id=61ca7b8f&scoped=true& ***! + \*********************************************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"poster-wrapper\" }, [\n _c(\n \"div\",\n { staticClass: \"recommended-image\" },\n [\n _c(\n \"app-link\",\n { attrs: { href: _vm.show.imageHref } },\n [\n _c(\"asset\", {\n attrs: {\n \"default-src\": _vm.show.imageSrc,\n lazy: \"\",\n type: \"posterThumb\",\n cls: \"show-image\",\n link: false,\n height: \"273px\",\n \"img-width\": 186\n }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _vm.show.genres.length > 0\n ? _c(\"div\", { staticClass: \"tag-container\" }, [\n _c(\n \"ul\",\n { staticClass: \"genre-tags\" },\n _vm._l(_vm.show.genres, function(genre) {\n return _c(\"li\", { key: genre }, [_vm._v(_vm._s(genre))])\n }),\n 0\n )\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"transition\", { attrs: { name: \"plot\" } }, [\n _vm.displayPlot && _vm.show.plot\n ? _c(\"div\", { staticClass: \"plot-overlay\" }, [\n _c(\"span\", [_vm._v(_vm._s(_vm.show.plot))])\n ])\n : _vm._e()\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"check-overlay\" }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-title\" }, [\n _c(\"span\", { attrs: { title: _vm.show.title } }, [\n _vm._v(_vm._s(_vm.show.title))\n ]),\n _vm._v(\" \"),\n _vm.show.plot\n ? _c(\n \"div\",\n {\n staticClass: \"toggle-plot\",\n on: {\n click: function($event) {\n _vm.displayPlot = !_vm.displayPlot\n }\n }\n },\n [\n _vm.displayPlot\n ? _c(\"span\", [_vm._v(\"hide plot\")])\n : _c(\"span\", [_vm._v(\"show plot\")])\n ]\n )\n : _vm._e()\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-md-7 col-xs-12\", attrs: { name: \"left\" } },\n [\n _c(\"div\", { staticClass: \"show-rating\" }, [\n _c(\n \"p\",\n [\n _vm._v(_vm._s(_vm.show.rating.toFixed(1)) + \" \"),\n _c(\"img\", { attrs: { src: \"images/heart.png\" } }),\n _vm._v(\" \"),\n _vm.show.isAnime\n ? [\n _c(\n \"app-link\",\n {\n staticClass: \"recommended-show-url\",\n attrs: {\n href: \"https://anidb.net/a\" + _vm.show.externals.aid\n }\n },\n [\n _c(\"img\", {\n staticClass: \"recommended-show-link-inline\",\n attrs: {\n src: \"images/anidb_inline_refl.png\",\n alt: \"\"\n }\n })\n ]\n )\n ]\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.recommender === \"Trakt Popular\"\n ? [\n _c(\n \"a\",\n {\n staticClass: \"recommended-show-url\",\n attrs: {\n href: \"https://trakt.tv/shows/\" + _vm.show.seriesId\n }\n },\n [\n _c(\"img\", {\n staticClass: \"recommended-show-link-inline\",\n attrs: { src: \"images/trakt.png\", alt: \"\" }\n })\n ]\n )\n ]\n : _vm._e()\n ],\n 2\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-votes\" }, [\n _c(\"i\", [_vm._v(\"x \" + _vm._s(_vm.show.votes))])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"col-md-5 col-xs-12\", attrs: { name: \"right\" } },\n [\n _c(\"div\", { staticClass: \"recommendedShowTitleIcons\" }, [\n _vm.traktConfig.removedFromMedusa.includes(_vm.show.mappedSeriesId)\n ? _c(\n \"button\",\n { staticClass: \"btn-medusa btn-xs\" },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"home/displayShow?indexername=\" +\n _vm.show.mappedIndexerName +\n \"&seriesid=\" +\n _vm.show.mappedSeriesId\n }\n },\n [_vm._v(\"Watched\")]\n )\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.show.source === _vm.externals.TRAKT\n ? _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-xs\",\n attrs: {\n disabled: _vm.show.trakt.blacklisted,\n \"data-indexer-id\": _vm.show.mappedSeriesId\n },\n on: {\n click: function($event) {\n return _vm.blacklistTrakt(_vm.show)\n }\n }\n },\n [_vm._v(\"Blacklist\")]\n )\n : _vm._e()\n ])\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12 addshowoptions\" },\n [\n _vm.show.showInLibrary\n ? [\n _vm.show.showInLibrary\n ? _c(\n \"button\",\n { staticClass: \"btn-medusa btn-xs\" },\n [\n _c(\n \"app-link\",\n {\n attrs: {\n href:\n \"home/displayShow?showslug=\" +\n _vm.show.showInLibrary\n }\n },\n [_vm._v(\"Open in library\")]\n )\n ],\n 1\n )\n : _vm._e()\n ]\n : [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedAddShowOption,\n expression: \"selectedAddShowOption\"\n }\n ],\n ref: _vm.show.source + \"-\" + _vm.show.seriesId,\n staticClass: \"rec-show-select\",\n attrs: { name: \"addshow\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.selectedAddShowOption = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.addShowOptions(_vm.show), function(option) {\n return _c(\n \"option\",\n { key: option.value, domProps: { value: option.value } },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-xs rec-show-button\",\n attrs: { disabled: _vm.show.trakt.blacklisted },\n on: {\n click: function($event) {\n return _vm.addShow(_vm.show)\n }\n }\n },\n [_vm._v(\"\\n Search/Add\\n \")]\n )\n ]\n ],\n 2\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/recommended-poster.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended.vue?vue&type=template&id=7226820a&scoped=true&": +/*!**************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/recommended.vue?vue&type=template&id=7226820a&scoped=true& ***! + \**************************************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\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: \"recommended-shows\" } },\n [\n _c(\"vue-snotify\"),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"row\", attrs: { id: \"recommended-shows-lists\" } },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"recommended-source\",\n label: \"Select a Source\"\n }\n },\n [\n !_vm.showsLoaded\n ? _c(\n \"select\",\n {\n staticClass: \"form-control max-width\",\n attrs: { disabled: \"disabled\" }\n },\n [\n _c(\"option\", { attrs: { value: \"\" } }, [\n _vm._v(\"Loading shows, please wait\")\n ])\n ]\n )\n : _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedSource,\n expression: \"selectedSource\"\n }\n ],\n staticClass: \"form-control max-width\",\n attrs: {\n disabled: !_vm.showsLoaded,\n id: \"recommended-source\",\n name: \"recommended-source\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.selectedSource = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.sourceOptions, function(option) {\n return _c(\n \"option\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.showsLoaded,\n expression: \"showsLoaded\"\n }\n ],\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n \"label-for\": \"recommended-list\",\n label: \"Select a list\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedList,\n expression: \"selectedList\"\n }\n ],\n staticClass: \"form-control max-width\",\n attrs: {\n disabled: !_vm.showsLoaded,\n id: \"recommended-list\",\n name: \"recommended-list\"\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.selectedList = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.listOptions, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n )\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"row\", attrs: { id: \"recommended-shows-options\" } },\n [\n _c(\n \"div\",\n { staticClass: \"col-md-12\" },\n [\n _c(\"config-toggle-slider\", {\n attrs: {\n label: \"Pass Default show options\",\n id: \"default_show_options\"\n },\n model: {\n value: _vm.enableShowOptions,\n callback: function($$v) {\n _vm.enableShowOptions = $$v\n },\n expression: \"enableShowOptions\"\n }\n }),\n _vm._v(\" \"),\n _c(\"add-show-options\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.enableShowOptions,\n expression: \"enableShowOptions\"\n }\n ],\n attrs: { \"enable-anime-options\": \"\" },\n on: { change: _vm.updateOptions }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-option\" }, [\n _c(\"span\", [_vm._v(\"Sort By:\")]),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.sortOptionsValue,\n expression: \"sortOptionsValue\"\n }\n ],\n staticClass: \"form-control form-control-inline input-sm\",\n attrs: { name: \"showsort\", id: \"showsort\" },\n on: {\n change: [\n function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.sortOptionsValue = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n },\n _vm.sort\n ]\n }\n },\n _vm._l(_vm.sortOptions, function(option) {\n return _c(\n \"option\",\n { key: option.value, domProps: { value: option.value } },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-option\" }, [\n _c(\"span\", { staticStyle: { \"margin-left\": \"12px\" } }, [\n _vm._v(\"Sort Order:\")\n ]),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.sortDirectionOptionsValue,\n expression: \"sortDirectionOptionsValue\"\n }\n ],\n staticClass: \"form-control form-control-inline input-sm\",\n attrs: {\n name: \"showsortdirection\",\n id: \"showsortdirection\"\n },\n on: {\n change: [\n function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.sortDirectionOptionsValue = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n },\n _vm.sortDirection\n ]\n }\n },\n _vm._l(_vm.sortDirectionOptions, function(option) {\n return _c(\n \"option\",\n { key: option.value, domProps: { value: option.value } },\n [_vm._v(_vm._s(option.text))]\n )\n }),\n 0\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"show-option\" }, [\n _c(\"span\", { staticStyle: { \"margin-left\": \"12px\" } }, [\n _vm._v(\"Filter:\")\n ]),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.filterShows,\n expression: \"filterShows\"\n }\n ],\n staticClass: \"form-control form-control-inline input-sm\",\n attrs: { type: \"text\", placeholder: \"no filter\" },\n domProps: { value: _vm.filterShows },\n on: {\n input: [\n function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.filterShows = $event.target.value\n },\n function($event) {\n return _vm.filter(\"filterByText\")\n }\n ]\n }\n })\n ])\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\", attrs: { id: \"recommended-shows\" } }, [\n _c(\n \"div\",\n { staticClass: \"col-md-12\", attrs: { id: \"popularShows\" } },\n [\n _vm.selectedSource === _vm.externals.TRAKT && _vm.traktWarning\n ? _c(\n \"div\",\n { staticClass: \"trakt-auth-container\" },\n [\n _c(\"font-awesome-icon\", {\n staticClass: \"close-container\",\n attrs: { icon: [\"far\", \"times-circle\"] },\n on: {\n click: function($event) {\n _vm.traktWarning = false\n }\n }\n }),\n _vm._v(\" \"),\n _vm.traktWarning\n ? _c(\"span\", { staticClass: \"trakt-warning\" }, [\n _vm._v(_vm._s(_vm.traktWarningMessage))\n ])\n : _vm._e(),\n _vm._v(\" \"),\n !_vm.showTraktAuthDialog\n ? _c(\n \"button\",\n {\n staticClass: \"btn-medusa\",\n attrs: { id: \"config-trakt\" },\n on: {\n click: function($event) {\n _vm.showTraktAuthDialog = true\n }\n }\n },\n [_vm._v(\"Config Trakt\")]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showTraktAuthDialog\n ? _c(\"trakt-authentication\", {\n attrs: { \"auth-only\": \"\" }\n })\n : _vm._e()\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.filteredShowsByList.length\n ? _c(\n \"isotope\",\n {\n ref: \"filteredShows\",\n staticClass: \"isoDefault\",\n attrs: {\n list: _vm.filteredShowsByList,\n id: \"isotope-container\",\n options: _vm.option\n },\n on: { layout: _vm.isotopeLayout }\n },\n _vm._l(_vm.filteredShowsByList, function(show) {\n return _c(\n \"div\",\n {\n key: show.seriesId,\n class: _vm.containerClass(show),\n attrs: {\n \"data-name\": show.title,\n \"data-rating\": show.rating,\n \"data-votes\": show.votes,\n \"data-anime\": show.isAnime\n }\n },\n [_c(\"recommended-poster\", { attrs: { show: show } })],\n 1\n )\n }),\n 0\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showsLoaded &&\n _vm.filteredShowsByList.length === 0 &&\n _vm.selectedSource !== -1\n ? _c(\"div\", { staticClass: \"align-center\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-xs rec-show-button\",\n on: { click: _vm.searchRecommendedShows }\n },\n [\n _vm._v(\n \"\\n Search for new recommended shows from \" +\n _vm._s(_vm.sourceToString[_vm.selectedSource]) +\n \"\\n \"\n )\n ]\n )\n ])\n : _vm._e()\n ],\n 1\n )\n ])\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/recommended.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/restart.vue?vue&type=template&id=625a88af&": /*!**********************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/restart.vue?vue&type=template&id=625a88af& ***! @@ -6586,6 +6901,16 @@ eval("// style-loader: Adds some css to the DOM by adding a