diff --git a/SickBeard.py b/SickBeard.py index bd2279eb6f09528f0afb6c764bb683aaa3213e99..d95746383c94f4e6e954a2c5b3b0e41b2f8f94ca 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -460,7 +460,7 @@ class SickRage(object): logger.log(u"Loading initial show list", logger.DEBUG) myDB = db.DBConnection() - sqlResults = myDB.select("SELECT * FROM tv_shows") + sqlResults = myDB.select("SELECT * FROM tv_shows;") sickbeard.showList = [] for sqlShow in sqlResults: @@ -474,6 +474,33 @@ class SickRage(object): logger.ERROR) logger.log(traceback.format_exc(), logger.DEBUG) + self.fix_subtitles_codes() + + + def fix_subtitles_codes(self): + myDB = db.DBConnection() + sqlResults = myDB.select( + "SELECT showid, subtitles_lastsearch, season, episode FROM tv_episodes " + + "WHERE subtitles != '' AND subtitles_lastsearch < ?;", + [datetime.datetime(2015, 7, 15, 17, 20, 44, 326380).strftime("%Y-%m-%d %H:%M:%S")]) + + if not sqlResults: + return + + logger.log("Fixing old subtitle codes") + for sqlResult in sqlResults: + showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(sqlResult['showid'])) + if not showObj: + continue + + epObj = showObj.getEpisode(int(sqlResult["season"]), int(sqlResult["episode"])) + if isinstance(epObj, str): + continue + + epObj.refreshSubtitles() + epObj.subtitles_lastsearch = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + epObj.saveToDB() + def restoreDB(self, srcDir, dstDir): try: filesList = ['sickbeard.db', 'config.ini', 'failed.db', 'cache.db'] diff --git a/gui/slick/images/subtitles/flags/alb.png b/gui/slick/images/subtitles/flags/alb.png new file mode 100644 index 0000000000000000000000000000000000000000..92354cb6e257be2cade71cb825027ce8d9efc06d Binary files /dev/null and b/gui/slick/images/subtitles/flags/alb.png differ diff --git a/gui/slick/images/subtitles/flags/chi.png b/gui/slick/images/subtitles/flags/chi.png new file mode 100644 index 0000000000000000000000000000000000000000..89144146219e6fbec7eaa89e1bf4b073d299569e Binary files /dev/null and b/gui/slick/images/subtitles/flags/chi.png differ diff --git a/gui/slick/images/subtitles/flags/cze.png b/gui/slick/images/subtitles/flags/cze.png new file mode 100644 index 0000000000000000000000000000000000000000..c8403dd21fd15f46d501a766a7a97733462f3b22 Binary files /dev/null and b/gui/slick/images/subtitles/flags/cze.png differ diff --git a/gui/slick/images/subtitles/flags/dum.png b/gui/slick/images/subtitles/flags/dum.png new file mode 100644 index 0000000000000000000000000000000000000000..cf9797eb90aebfeaafb31e18cb9a717cd29989c4 Binary files /dev/null and b/gui/slick/images/subtitles/flags/dum.png differ diff --git a/gui/slick/images/subtitles/flags/dut.png b/gui/slick/images/subtitles/flags/dut.png new file mode 100644 index 0000000000000000000000000000000000000000..cf9797eb90aebfeaafb31e18cb9a717cd29989c4 Binary files /dev/null and b/gui/slick/images/subtitles/flags/dut.png differ diff --git a/gui/slick/images/subtitles/flags/fre.png b/gui/slick/images/subtitles/flags/fre.png new file mode 100644 index 0000000000000000000000000000000000000000..cec29aac0016d5e54017364c3df8bb8c359253d0 Binary files /dev/null and b/gui/slick/images/subtitles/flags/fre.png differ diff --git a/gui/slick/images/subtitles/flags/frm.png b/gui/slick/images/subtitles/flags/frm.png new file mode 100644 index 0000000000000000000000000000000000000000..8332c4ec23c853944c29b02d7b32a88033f48a71 Binary files /dev/null and b/gui/slick/images/subtitles/flags/frm.png differ diff --git a/gui/slick/images/subtitles/flags/fro.png b/gui/slick/images/subtitles/flags/fro.png new file mode 100644 index 0000000000000000000000000000000000000000..8332c4ec23c853944c29b02d7b32a88033f48a71 Binary files /dev/null and b/gui/slick/images/subtitles/flags/fro.png differ diff --git a/gui/slick/images/subtitles/flags/ger.png b/gui/slick/images/subtitles/flags/ger.png new file mode 100644 index 0000000000000000000000000000000000000000..8c52b0aa818347c9f0623646769e6145961526b4 Binary files /dev/null and b/gui/slick/images/subtitles/flags/ger.png differ diff --git a/gui/slick/images/subtitles/flags/gsw.png b/gui/slick/images/subtitles/flags/gsw.png new file mode 100644 index 0000000000000000000000000000000000000000..242ec01aaf5ad351cb978a4eb650ad801a438b09 Binary files /dev/null and b/gui/slick/images/subtitles/flags/gsw.png differ diff --git a/gui/slick/images/subtitles/flags/ice.png b/gui/slick/images/subtitles/flags/ice.png new file mode 100644 index 0000000000000000000000000000000000000000..1eea80a7b739bea4a249dd10a3457010525f60da Binary files /dev/null and b/gui/slick/images/subtitles/flags/ice.png differ diff --git a/gui/slick/images/subtitles/flags/mac.png b/gui/slick/images/subtitles/flags/mac.png new file mode 100644 index 0000000000000000000000000000000000000000..30384347c8ee71d4521876cd7663720a3fd91d50 Binary files /dev/null and b/gui/slick/images/subtitles/flags/mac.png differ diff --git a/gui/slick/images/subtitles/flags/pob.png b/gui/slick/images/subtitles/flags/pob.png new file mode 100644 index 0000000000000000000000000000000000000000..2fecf539d9ddd9b191efdd0eae3003a1d2c2e37a Binary files /dev/null and b/gui/slick/images/subtitles/flags/pob.png differ diff --git a/gui/slick/images/subtitles/flags/rum.png b/gui/slick/images/subtitles/flags/rum.png new file mode 100644 index 0000000000000000000000000000000000000000..667f21fd9d552df546386174e506a6b5b606a258 Binary files /dev/null and b/gui/slick/images/subtitles/flags/rum.png differ diff --git a/gui/slick/interfaces/default/inc_addShowOptions.tmpl b/gui/slick/interfaces/default/inc_addShowOptions.tmpl index 668c8411f5c7c3b5a1c8734b43a306d80bf1147a..fe26f8b79614b1527d4de7c079c49f06d30e38d5 100644 --- a/gui/slick/interfaces/default/inc_addShowOptions.tmpl +++ b/gui/slick/interfaces/default/inc_addShowOptions.tmpl @@ -26,6 +26,18 @@ </span> </label> </div> + <div class="field-pair"> + <label for="statusSelectAfter"> + <span class="component-title">Status for all future episodes</span> + <span class="component-desc"> + <select name="defaultStatusAfter" id="statusSelectAfter" class="form-control form-control-inline input-sm"> + #for $curStatus in [$SKIPPED, $WANTED, $ARCHIVED, $IGNORED]: + <option value="$curStatus" #if $sickbeard.STATUS_DEFAULT_AFTER == $curStatus then 'selected="selected"' else ''#>$statusStrings[$curStatus]</option> + #end for + </select> + </span> + </label> + </div> <div class="field-pair alt"> <label for="flatten_folders" class="clearfix"> <span class="component-title">Flatten Folders</span> diff --git a/gui/slick/interfaces/default/inc_qualityChooser.tmpl b/gui/slick/interfaces/default/inc_qualityChooser.tmpl index 235134f80e6a7633145dda95e895aab1561c762d..a7e7299d2a723bbabcc7677c5c068919397fd7fa 100644 --- a/gui/slick/interfaces/default/inc_qualityChooser.tmpl +++ b/gui/slick/interfaces/default/inc_qualityChooser.tmpl @@ -21,7 +21,7 @@ <div id="customQualityWrapper"> <div id="customQuality"> <div class="component-group-desc"> - <p><b>Preferred<b> qualities will replace an <b>Allowed<b> quality if found, initially or in the future, even if it is a lower quality</p> + <p><b>Preferred</b> qualities will replace an <b>Allowed</b> quality if found, initially or in the future, even if it is a lower quality</p> </div> <div style="padding-right: 40px; text-align: left; float: left;"> diff --git a/gui/slick/js/addShowOptions.js b/gui/slick/js/addShowOptions.js index ceea77147452b7792165c11aa8629ebefb3febb2..03653a49f54340c6007167f5582510ed25fa8791 100644 --- a/gui/slick/js/addShowOptions.js +++ b/gui/slick/js/addShowOptions.js @@ -17,7 +17,8 @@ $(document).ready(function () { defaultFlattenFolders: $('#flatten_folders').prop('checked'), subtitles: $('#subtitles').prop('checked'), anime: $('#anime').prop('checked'), - scene: $('#scene').prop('checked') + scene: $('#scene').prop('checked'), + defaultStatusAfter: $('#statusSelectAfter').val() }); $(this).attr('disabled', true); @@ -28,8 +29,8 @@ $(document).ready(function () { }); }); - $('#statusSelect, #qualityPreset, #flatten_folders, #anyQualities, #bestQualities, #subtitles, #scene, #anime').change(function () { + $('#statusSelect, #qualityPreset, #flatten_folders, #anyQualities, #bestQualities, #subtitles, #scene, #anime, #statusSelectAfter').change(function () { $('#saveDefaultsButton').attr('disabled', false); }); -}); \ No newline at end of file +}); diff --git a/lib/trakt/trakt.py b/lib/trakt/trakt.py index f8f048026395647835460ded7781b05217c30383..bb176f9fb25d5821c12cf2c89f1cd329e7f6b84c 100644 --- a/lib/trakt/trakt.py +++ b/lib/trakt/trakt.py @@ -92,27 +92,29 @@ class TraktAPI(): except requests.RequestException as e: code = getattr(e.response, 'status_code', None) if not code: + if 'timed out' in e: + logger.log(u'Timeout connecting to Trakt. Try to increase timeout value in Trakt settings', logger.WARNING) # This is pretty much a fatal error if there is no status_code - # It means there basically was no response at all - raise traktException(e) + # It means there basically was no response at all + else: + logger.log(u'Could not connect to Trakt. Error: {0}'.format(e), logger.WARNING) elif code is 502: # Retry the request, cloudflare had a proxying issue logger.log(u'Retrying trakt api request: %s' % path, logger.WARNING) return self.traktRequest(path, data, headers, url, method) elif code is 401: - logger.log(u'Unauthorized. Please check your Trakt settings', logger.WARNING) if self.traktToken(refresh=True, count=count): return self.traktRequest(path, data, headers, url, method) - raise traktAuthException(e) + else: + logger.log(u'Unauthorized. Please check your Trakt settings', logger.WARNING) elif code in (500,501,503,504,520,521,522): #http://docs.trakt.apiary.io/#introduction/status-codes logger.log(u'Trakt may have some issues and it\'s unavailable. Try again later please', logger.WARNING) - return {} elif code is 404: logger.log(u'Trakt error (404) the resource does not exist: %s' % url + path, logger.WARNING) - return {} else: - raise traktException(e) + logger.log(u'Could not connect to Trakt. Code error: {0}'.format(code), logger.ERROR) + return {} # check and confirm trakt call did not fail if isinstance(resp, dict) and resp.get('status', False) == 'failure': diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index 5a05113cd313dd7a17221dee7ba00c51cb92cdd6..2137d00f43c4c9e33837597585c82cf7c42a3da2 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -51,7 +51,7 @@ from sickbeard import scene_numbering, scene_exceptions, name_cache from indexers.indexer_api import indexerApi from indexers.indexer_exceptions import indexer_shownotfound, indexer_showincomplete, indexer_exception, indexer_error, \ indexer_episodenotfound, indexer_attributenotfound, indexer_seasonnotfound, indexer_userabort, indexerExcepts -from sickbeard.common import SD, SKIPPED, NAMING_REPEAT +from sickbeard.common import SD, SKIPPED, WANTED, NAMING_REPEAT from sickbeard.databases import mainDB, cache_db, failed_db from sickbeard.helpers import ex @@ -197,6 +197,7 @@ METADATA_MEDE8ER = None QUALITY_DEFAULT = None STATUS_DEFAULT = None +STATUS_DEFAULT_AFTER = None FLATTEN_FOLDERS_DEFAULT = False SUBTITLES_DEFAULT = False INDEXER_DEFAULT = None @@ -557,7 +558,7 @@ def initialize(consoleLogging=True): PLEX_SERVER_HOST, PLEX_SERVER_TOKEN, PLEX_HOST, PLEX_USERNAME, PLEX_PASSWORD, DEFAULT_BACKLOG_FREQUENCY, MIN_BACKLOG_FREQUENCY, BACKLOG_STARTUP, SKIP_REMOVED_FILES, \ showUpdateScheduler, __INITIALIZED__, INDEXER_DEFAULT_LANGUAGE, EP_DEFAULT_DELETED_STATUS, LAUNCH_BROWSER, UPDATE_SHOWS_ON_START, UPDATE_SHOWS_ON_SNATCH, TRASH_REMOVE_SHOW, TRASH_ROTATE_LOGS, SORT_ARTICLE, showList, loadingShowList, \ NEWZNAB_DATA, NZBS, NZBS_UID, NZBS_HASH, INDEXER_DEFAULT, INDEXER_TIMEOUT, USENET_RETENTION, TORRENT_DIR, \ - QUALITY_DEFAULT, FLATTEN_FOLDERS_DEFAULT, SUBTITLES_DEFAULT, STATUS_DEFAULT, DAILYSEARCH_STARTUP, \ + QUALITY_DEFAULT, FLATTEN_FOLDERS_DEFAULT, SUBTITLES_DEFAULT, STATUS_DEFAULT, STATUS_DEFAULT_AFTER, DAILYSEARCH_STARTUP, \ GROWL_NOTIFY_ONSNATCH, GROWL_NOTIFY_ONDOWNLOAD, GROWL_NOTIFY_ONSUBTITLEDOWNLOAD, TWITTER_NOTIFY_ONSNATCH, TWITTER_NOTIFY_ONDOWNLOAD, TWITTER_NOTIFY_ONSUBTITLEDOWNLOAD, USE_FREEMOBILE, FREEMOBILE_ID, FREEMOBILE_APIKEY, FREEMOBILE_NOTIFY_ONSNATCH, FREEMOBILE_NOTIFY_ONDOWNLOAD, FREEMOBILE_NOTIFY_ONSUBTITLEDOWNLOAD, \ USE_GROWL, GROWL_HOST, GROWL_PASSWORD, USE_PROWL, PROWL_NOTIFY_ONSNATCH, PROWL_NOTIFY_ONDOWNLOAD, PROWL_NOTIFY_ONSUBTITLEDOWNLOAD, PROWL_API, PROWL_PRIORITY, PROG_DIR, \ USE_PYTIVO, PYTIVO_NOTIFY_ONSNATCH, PYTIVO_NOTIFY_ONDOWNLOAD, PYTIVO_NOTIFY_ONSUBTITLEDOWNLOAD, PYTIVO_UPDATE_LIBRARY, PYTIVO_HOST, PYTIVO_SHARE_NAME, PYTIVO_TIVO_NAME, \ @@ -783,6 +784,7 @@ def initialize(consoleLogging=True): QUALITY_DEFAULT = check_setting_int(CFG, 'General', 'quality_default', SD) STATUS_DEFAULT = check_setting_int(CFG, 'General', 'status_default', SKIPPED) + STATUS_DEFAULT_AFTER = check_setting_int(CFG, 'General', 'status_default_after', WANTED) VERSION_NOTIFY = bool(check_setting_int(CFG, 'General', 'version_notify', 1)) AUTO_UPDATE = bool(check_setting_int(CFG, 'General', 'auto_update', 0)) NOTIFY_ON_UPDATE = bool(check_setting_int(CFG, 'General', 'notify_on_update', 1)) @@ -1667,6 +1669,7 @@ def save_config(): new_config['General']['skip_removed_files'] = int(SKIP_REMOVED_FILES) new_config['General']['quality_default'] = int(QUALITY_DEFAULT) new_config['General']['status_default'] = int(STATUS_DEFAULT) + new_config['General']['status_default_after'] = int(STATUS_DEFAULT_AFTER) new_config['General']['flatten_folders_default'] = int(FLATTEN_FOLDERS_DEFAULT) new_config['General']['indexer_default'] = int(INDEXER_DEFAULT) new_config['General']['indexer_timeout'] = int(INDEXER_TIMEOUT) diff --git a/sickbeard/show_queue.py b/sickbeard/show_queue.py index c87a325b56483e42b8b615de4864d6e1c36c1549..5a59ce602282e0a46f0a991cf9f1739b62a22cda 100644 --- a/sickbeard/show_queue.py +++ b/sickbeard/show_queue.py @@ -133,13 +133,13 @@ class ShowQueue(generic_queue.GenericQueue): return queueItemObj def addShow(self, indexer, indexer_id, showDir, default_status=None, quality=None, flatten_folders=None, - lang=None, subtitles=None, anime=None, scene=None, paused=None, blacklist=None, whitelist=None): + lang=None, subtitles=None, anime=None, scene=None, paused=None, blacklist=None, whitelist=None, default_status_after=None): if lang is None: lang = sickbeard.INDEXER_DEFAULT_LANGUAGE queueItemObj = QueueItemAdd(indexer, indexer_id, showDir, default_status, quality, flatten_folders, lang, - subtitles, anime, scene, paused, blacklist, whitelist) + subtitles, anime, scene, paused, blacklist, whitelist, default_status_after) self.add_item(queueItemObj) @@ -196,7 +196,7 @@ class ShowQueueItem(generic_queue.QueueItem): class QueueItemAdd(ShowQueueItem): def __init__(self, indexer, indexer_id, showDir, default_status, quality, flatten_folders, lang, subtitles, anime, - scene, paused, blacklist, whitelist): + scene, paused, blacklist, whitelist, default_status_after): self.indexer = indexer self.indexer_id = indexer_id @@ -211,6 +211,7 @@ class QueueItemAdd(ShowQueueItem): self.paused = paused self.blacklist = blacklist self.whitelist = whitelist + self.default_status_after = default_status_after if sickbeard.TRAKT_USE_ROLLING_DOWNLOAD and sickbeard.USE_TRAKT: self.paused = sickbeard.TRAKT_ROLLING_ADD_PAUSED @@ -420,8 +421,8 @@ class QueueItemAdd(ShowQueueItem): self.show.indexer): self.show.scene = 1 - # After initial add, set back to WANTED. - self.show.default_ep_status = WANTED + # After initial add, set to default_status_after. + self.show.default_ep_status = self.default_status_after self.finish() diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 078b862cddf16cffda4ef35896c727b6a8900f14..5b24a1b7272d04283fc9561aa9c292cd0acc66aa 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -2555,7 +2555,8 @@ class HomeAddShows(Home): flatten_folders=sickbeard.FLATTEN_FOLDERS_DEFAULT, subtitles=sickbeard.SUBTITLES_DEFAULT, anime=sickbeard.ANIME_DEFAULT, - scene=sickbeard.SCENE_DEFAULT) + scene=sickbeard.SCENE_DEFAULT, + default_status_after=sickbeard.STATUS_DEFAULT_AFTER) ui.notifications.message('Show added', 'Adding the specified show into ' + show_dir) else: @@ -2568,7 +2569,7 @@ class HomeAddShows(Home): def addNewShow(self, whichSeries=None, indexerLang=None, rootDir=None, defaultStatus=None, anyQualities=None, bestQualities=None, flatten_folders=None, subtitles=None, fullShowPath=None, other_shows=None, skipShow=None, providedIndexer=None, anime=None, - scene=None, blacklist=None, whitelist=None): + scene=None, blacklist=None, whitelist=None, defaultStatusAfter=None): """ Receive tvdb id, dir, and other options and create a show from them. If extra show dirs are provided then it forwards back to newShow, if not it goes to /home. @@ -2674,7 +2675,7 @@ class HomeAddShows(Home): # add the show sickbeard.showQueueScheduler.action.addShow(indexer, indexer_id, show_dir, int(defaultStatus), newQuality, flatten_folders, indexerLang, subtitles, anime, - scene, None, blacklist, whitelist) + scene, None, blacklist, whitelist, int(defaultStatusAfter)) ui.notifications.message('Show added', 'Adding the specified show into ' + show_dir) return finishAddShow() @@ -2747,7 +2748,8 @@ class HomeAddShows(Home): flatten_folders=sickbeard.FLATTEN_FOLDERS_DEFAULT, subtitles=sickbeard.SUBTITLES_DEFAULT, anime=sickbeard.ANIME_DEFAULT, - scene=sickbeard.SCENE_DEFAULT) + scene=sickbeard.SCENE_DEFAULT, + default_status_after=sickbeard.STATUS_DEFAULT_AFTER) num_added += 1 if num_added: @@ -3672,7 +3674,7 @@ class ConfigGeneral(Config): sickbeard.ROOT_DIRS = rootDirString def saveAddShowDefaults(self, defaultStatus, anyQualities, bestQualities, defaultFlattenFolders, subtitles=False, - anime=False, scene=False): + anime=False, scene=False, defaultStatusAfter=WANTED): if anyQualities: anyQualities = anyQualities.split(',') @@ -3687,6 +3689,7 @@ class ConfigGeneral(Config): newQuality = Quality.combineQualities(map(int, anyQualities), map(int, bestQualities)) sickbeard.STATUS_DEFAULT = int(defaultStatus) + sickbeard.STATUS_DEFAULT_AFTER = int(defaultStatusAfter) sickbeard.QUALITY_DEFAULT = int(newQuality) sickbeard.FLATTEN_FOLDERS_DEFAULT = config.checkbox_to_value(defaultFlattenFolders)