diff --git a/gui/slick/js/new/viewlogs.js b/gui/slick/js/new/viewlogs.js index dea989b1fe4b2ce25b6d0bd9f70f54c1421ee92b..09423b3213773e5e63d867383fd4e141ef9301c8 100644 --- a/gui/slick/js/new/viewlogs.js +++ b/gui/slick/js/new/viewlogs.js @@ -8,6 +8,7 @@ $(document).ready(function(){ $('#minLevel').prop('disabled', true); $('#logFilter').prop('disabled', true); $('#logSearch').prop('disabled', true); + document.body.style.cursor='wait' url = srRoot + '/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val(); $.get(url, function(data){ history.pushState('data', '', url); diff --git a/gui/slick/views/config_postProcessing.mako b/gui/slick/views/config_postProcessing.mako index 66ba675fa6351ed0fb14f24e9cececa0b802482f..cbfcbef01ad57c5b088d5aeb6034bae8b14dcff6 100644 --- a/gui/slick/views/config_postProcessing.mako +++ b/gui/slick/views/config_postProcessing.mako @@ -82,6 +82,20 @@ <span class="component-desc">What method should be used to put file in the TV directory?</span> </label> </div> + <div class="field-pair"> + <input type="checkbox" name="create_missing_show_dirs" id="create_missing_show_dirs" ${('', 'checked="checked"')[bool(sickbeard.CREATE_MISSING_SHOW_DIRS)]}/> + <label for="create_missing_show_dirs"> + <span class="component-title">Create missing show directories</span> + <span class="component-desc">Create missing show diretories when they get deleted</span> + </label> + </div> + <div class="field-pair"> + <input type="checkbox" name="add_shows_wo_dir" id="add_shows_wo_dir" ${('', 'checked="checked"')[bool(sickbeard.ADD_SHOWS_WO_DIR)]}/> + <label for="add_shows_wo_dir"> + <span class="component-title">Add shows without directory</span> + <span class="component-desc">Add shows without creating a directory (don't recommended)</span> + </label> + </div> <div class="field-pair"> <input type="checkbox" name="del_rar_contents" id="del_rar_contents" ${('', 'checked="checked"')[bool(sickbeard.DELRARCONTENTS)]}/> <label for="del_rar_contents"> diff --git a/gui/slick/views/manage_massEdit.mako b/gui/slick/views/manage_massEdit.mako index 352311f17b40e9feb86730ff9214cbbc89f087d1..d372f3c007228336add59648d57f94081d8d1ad6 100644 --- a/gui/slick/views/manage_massEdit.mako +++ b/gui/slick/views/manage_massEdit.mako @@ -83,34 +83,24 @@ </div> </div> -% if anyQualities + bestQualities: -<% isSelected = ' selected="selected"' %> -<% isEnabled = isSelected %> -<% isDisabled = isSelected %> -% if archive_firstmatch_value: - <% isDisabled = '' %> -% else: - <% isEnabled = '' %> -% endif <div class="optionWrapper clearfix"> <span class="selectTitle">Archive on first match</span> <div class="selectChoices"> <select id="edit_archive_firstmatch" name="archive_firstmatch" class="form-control form-control-inline input-sm"> - <option value="keep">< keep ></option> - <option value="enable" ${isEnabled}>enable</option> - <option value="disable" ${isDisabled}>disable</option> + <option value="keep" ${('', 'selected="selected"')[archive_firstmatch_value == None]}>< keep ></option> + <option value="enable" ${('', 'selected="selected"')[archive_firstmatch_value == 1]}>enable</option> + <option value="disable" ${('', 'selected="selected"')[archive_firstmatch_value == 0]}>disable</option> </select> </div> </div> -% endif <div class="optionWrapper clearfix"> <span class="selectTitle">Flatten Folders <span class="separator">*</span></span> <div class="selectChoices"> <select id="edit_flatten_folders" name="flatten_folders" class="form-control form-control-inline input-sm"> - <option value="keep">< keep ></option> - <option value="enable" ${('', 'selected="selected"')[bool(flatten_folders_value)]}>enable</option> - <option value="disable" ${('', 'selected="selected"')[not bool(flatten_folders_value)]}>disable</option> + <option value="keep" ${('', 'selected="selected"')[flatten_folders_value == None]}>< keep ></option> + <option value="enable" ${('', 'selected="selected"')[flatten_folders_value == 1]}>enable</option> + <option value="disable" ${('', 'selected="selected"')[flatten_folders_value == 0]}>disable</option> </select> </div> </div> @@ -119,9 +109,9 @@ <span class="selectTitle">Paused</span> <div class="selectChoices"> <select id="edit_paused" name="paused" class="form-control form-control-inline input-sm"> - <option value="keep">< keep ></option> - <option value="enable" ${('', 'selected="selected"')[bool(paused_value)]}>enable</option> - <option value="disable" ${('', 'selected="selected"')[not bool(paused_value)]}>disable</option> + <option value="keep" ${('', 'selected="selected"')[paused_value == None]}>< keep ></option> + <option value="enable" ${('', 'selected="selected"')[paused_value == 1]}>enable</option> + <option value="disable" ${('', 'selected="selected"')[paused_value == 0]}>disable</option> </select> </div><br /> </div> @@ -142,9 +132,9 @@ <span class="selectTitle">Scene Numbering</span> <div class="selectChoices"> <select id="edit_scene" name="scene" class="form-control form-control-inline input-sm"> - <option value="keep">< keep ></option> - <option value="enable" ${('', 'selected="selected"')[bool(scene_value)]}>enable</option> - <option value="disable" ${('', 'selected="selected"')[not bool(scene_value)]}>disable</option> + <option value="keep" ${('', 'selected="selected"')[scene_value == None]}>< keep ></option> + <option value="enable" ${('', 'selected="selected"')[scene_value == 1]}>enable</option> + <option value="disable" ${('', 'selected="selected"')[scene_value == 0]}>disable</option> </select> </div><br /> </div> @@ -153,9 +143,9 @@ <span class="selectTitle">Anime</span> <div class="selectChoices"> <select id="edit_anime" name="anime" class="form-control form-control-inline input-sm"> - <option value="keep">< keep ></option> - <option value="enable" ${('', 'selected="selected"')[bool(anime_value)]}>enable</option> - <option value="disable" ${('', 'selected="selected"')[not bool(anime_value)]}>disable</option> + <option value="keep" ${('', 'selected="selected"')[anime_value == None]}>< keep ></option> + <option value="enable" ${('', 'selected="selected"')[anime_value == 1]}>enable</option> + <option value="disable" ${('', 'selected="selected"')[anime_value == 0]}>disable</option> </select> </div><br /> </div> @@ -164,9 +154,9 @@ <span class="selectTitle">Sports</span> <div class="selectChoices"> <select id="edit_sports" name="sports" class="form-control form-control-inline input-sm"> - <option value="keep">< keep ></option> - <option value="enable" ${('', 'selected="selected"')[bool(sports_value)]}>enable</option> - <option value="disable" ${('', 'selected="selected"')[not bool(sports_value)]}>disable</option> + <option value="keep" ${('', 'selected="selected"')[sports_value == None]}>< keep ></option> + <option value="enable" ${('', 'selected="selected"')[sports_value == 1]}>enable</option> + <option value="disable" ${('', 'selected="selected"')[sports_value == 0]}>disable</option> </select> </div><br /> </div> @@ -175,9 +165,9 @@ <span class="selectTitle">Air-By-Date</span> <div class="selectChoices"> <select id="edit_air_by_date" name="air_by_date" class="form-control form-control-inline input-sm"> - <option value="keep">< keep ></option> - <option value="enable" ${('', 'selected="selected"')[bool(air_by_date_value)]}>enable</option> - <option value="disable" ${('', 'selected="selected"')[not bool(air_by_date_value)]}>disable</option> + <option value="keep" ${('', 'selected="selected"')[air_by_date_value == None]}>< keep ></option> + <option value="enable" ${('', 'selected="selected"')[air_by_date_value == 1]}>enable</option> + <option value="disable" ${('', 'selected="selected"')[air_by_date_value == 0]}>disable</option> </select> </div><br /> </div> @@ -186,9 +176,9 @@ <span class="selectTitle">Subtitles<span class="separator"></span></span> <div class="selectChoices"> <select id="edit_subtitles" name="subtitles" class="form-control form-control-inline input-sm"> - <option value="keep">< keep ></option> - <option value="enable" ${('', 'selected="selected"')[bool(subtitles_value)]}>enable</option> - <option value="disable" ${('', 'selected="selected"')[not bool(subtitles_value)]}>disable</option> + <option value="keep" ${('', 'selected="selected"')[subtitles_value == None]}>< keep ></option> + <option value="enable" ${('', 'selected="selected"')[subtitles_value == 1]}>enable</option> + <option value="disable" ${('', 'selected="selected"')[subtitles_value == 0]}>disable</option> </select> </div><br /> </div> diff --git a/sickbeard/common.py b/sickbeard/common.py index c96d6d24a7b65e2e9f0b49c80adeb7b0b37674fc..74f1616f8334b32ce1599c427bf370aedfa5edf8 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -270,7 +270,7 @@ class Quality: ret = Quality.SDTV elif checkName([r"web.?dl|webrip", r"xvid|x26[45]|h.?26[45]"], all) and not checkName([r"(720|1080)[pi]"], all): ret = Quality.SDTV - elif checkName([r"(dvdrip|b[rd]rip|blue?-?ray)(.ws)?.(xvid|divx|x26[45])"], any) and not checkName([r"(720|1080)[pi]"], all): + elif checkName([r"(dvd(rip|mux)|b[rd](rip|mux)|blue?-?ray)(.ws)?.(xvid|divx|x26[45])"], any) and not checkName([r"(720|1080)[pi]"], all): ret = Quality.SDDVD elif checkName([r"720p", r"hd.?tv", r"x26[45]"], all) or checkName([r"hr.ws.pdtv.x26[45]"], any) and not checkName( [r"1080[pi]"], all): diff --git a/sickbeard/providers/extratorrent.py b/sickbeard/providers/extratorrent.py index 585a8e13f04e1b81b6bc9c2b2229322b020c4bf6..ab703a4d332f8447b4d30e41899ef530d3f5cf4d 100644 --- a/sickbeard/providers/extratorrent.py +++ b/sickbeard/providers/extratorrent.py @@ -123,8 +123,8 @@ class ExtraTorrentProvider(generic.TorrentProvider): info_hash = item['info_hash'] url = item['enclosure']['@url'] size = int(item['enclosure']['@length'] or item['size']) - seeders = int(item['seeders']) - leechers = int(item['leechers']) + seeders = helpers.tryInt(item['seeders'],0) + leechers = helpers.tryInt(item['leechers'],0) if not seeders or seeders < self.minseed or leechers < self.minleech: continue diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py index 906d766d890e9cb37654b3b4f751d1182c142004..183325444089ab6ea397c7828d70ba1a5d226ab5 100644 --- a/sickbeard/subtitles.py +++ b/sickbeard/subtitles.py @@ -24,8 +24,9 @@ from sickbeard import db from sickrage.helper.common import dateTimeFormat from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex +from enzyme import MKV +from babelfish import Error as BabelfishError, Language, language_converters import subliminal -import babelfish import subprocess subliminal.cache_region.configure('dogpile.cache.memory') @@ -70,7 +71,7 @@ def getEnabledServiceList(): #Hack around this for now. def fromietf(language): - return babelfish.Language.fromopensubtitles(language) + return Language.fromopensubtitles(language) def isValidLanguage(language): try: @@ -92,9 +93,30 @@ def wantedLanguages(sqlLike = False): def subtitlesLanguages(video_path): """Return a list detected subtitles for the given video file""" resultList = [] + embedded_subtitle_languages = set() # Serch for embedded subtitles - embedded_languages = subliminal.scan_video(video_path, subtitles=False, embedded_subtitles=not sickbeard.EMBEDDED_SUBTITLES_ALL) + if video_path.endswith('mkv'): + with open(video_path, 'rb') as f: + mkv = MKV(f) + if mkv.subtitle_tracks: + for st in mkv.subtitle_tracks: + if st.language: + try: + embedded_subtitle_languages.add(Language.fromalpha3b(st.language)) + except BabelfishError: + logger.log('Embedded subtitle track is not a valid language', logger.DEBUG) + embedded_subtitle_languages.add(Language('und')) + elif st.name: + try: + embedded_subtitle_languages.add(Language.fromname(st.name)) + except BabelfishError: + logger.log('Embedded subtitle track is not a valid language', logger.DEBUG) + embedded_subtitle_languages.add(Language('und')) + else: + embedded_subtitle_languages.add(Language('und')) + else: + logger.log('MKV has no subtitle track', logger.DEBUG) # Search subtitles in the absolute path if sickbeard.SUBTITLES_DIR and ek(os.path.exists, sickbeard.SUBTITLES_DIR): @@ -105,7 +127,7 @@ def subtitlesLanguages(video_path): languages = subliminal.video.scan_subtitle_languages(video_path) - for language in languages.union(embedded_languages.subtitle_languages): + for language in languages.union(embedded_subtitle_languages): if hasattr(language, 'opensubtitles') and language.opensubtitles: resultList.append(language.opensubtitles) elif hasattr(language, 'alpha3') and language.alpha3: @@ -122,10 +144,10 @@ def subtitlesLanguages(video_path): # TODO: Return only languages our providers allow def subtitleLanguageFilter(): - return [babelfish.Language.fromopensubtitles(language) for language in babelfish.language_converters['opensubtitles'].codes if len(language) == 3] + return [Language.fromopensubtitles(language) for language in language_converters['opensubtitles'].codes if len(language) == 3] def subtitleCodeFilter(): - return [babelfish.Language.fromopensubtitles(language).opensubtitles for language in babelfish.language_converters['opensubtitles'].codes if len(language) == 3] + return [Language.fromopensubtitles(language).opensubtitles for language in language_converters['opensubtitles'].codes if len(language) == 3] class SubtitlesFinder(): """ diff --git a/sickbeard/versionChecker.py b/sickbeard/versionChecker.py index e49d2eaddfaa0f764dba6ba2a3de8a39008020bc..d68f3547a78442102784a68184490b9d59a62cc3 100644 --- a/sickbeard/versionChecker.py +++ b/sickbeard/versionChecker.py @@ -164,10 +164,10 @@ class CheckVersion: logger.log(u"We can't proceed with the update. New update has a old DB version. It's not possible to downgrade", logger.ERROR) return False else: - logger.log(u"We can't proceed with the update. Unable to check remote DB version", logger.ERROR) + logger.log(u"We can't proceed with the update. Unable to check remote DB version. Error: %s" % result, logger.ERROR) return False - except: - logger.log(u"We can't proceed with the update. Unable to compare DB version", logger.ERROR) + except Exception as e: + logger.log(u"We can't proceed with the update. Unable to compare DB version. Error: %s" % repr(e), logger.ERROR) return False def postprocessor_safe(self): @@ -199,6 +199,7 @@ class CheckVersion: def getDBcompare(self): try: + self.updater.need_update() cur_hash = str(self.updater.get_newest_commit_hash()) assert len(cur_hash) is 40, "Commit hash wrong length: %s hash: %s" % (len(cur_hash), cur_hash) @@ -216,9 +217,8 @@ class CheckVersion: return 'equal' else: return 'downgrade' - except Exception: - raise - return 'error' + except Exception as e: + return repr(e) def find_install_type(self): """ diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index b1200db7ae98f5e39fb930749998799fb8b62b4f..b6bdd8990493435ff95608595f49c7014c0764e2 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -412,7 +412,7 @@ class ApiCall(ApiHandler): value = True elif value in ("false", "False", "FALSE"): value = False - else: + elif value not in (True, False): error = True elif type == "list": value = value.split("|") @@ -421,14 +421,12 @@ class ApiCall(ApiHandler): elif type == "ignore": pass else: - logger.log(u"API :: Invalid param type set " + str(type) + " can not check or convert ignoring it", - logger.ERROR) + logger.log(u'API :: Invalid param type: "%s" can not be checked. Ignoring it.' % str(type), logger.ERROR) if error: # this is a real ApiError !! - raise ApiError( - u"param: '" + str(name) + "' with given value: '" + str(value) + "' could not be parsed into '" + str( - type) + "'") + raise ApiError(u'param "%s" with given value "%s" could not be parsed into "%s"' + % (str(name), str(value), str(type))) return value @@ -670,7 +668,7 @@ class CMD_ComingEpisodes(ApiCall): self.sort, args = self.check_params(args, kwargs, "sort", "date", False, "string", ComingEpisodes.sorts.keys()) self.type, args = self.check_params(args, kwargs, "type", '|'.join(ComingEpisodes.categories), False, "list", ComingEpisodes.categories) - self.paused, args = self.check_params(args, kwargs, "paused", sickbeard.COMING_EPS_DISPLAY_PAUSED, False, + self.paused, args = self.check_params(args, kwargs, "paused", bool(sickbeard.COMING_EPS_DISPLAY_PAUSED), False, "bool", []) # super, missing, help ApiCall.__init__(self, args, kwargs) @@ -724,7 +722,7 @@ class CMD_Episode(ApiCall): self.s, args = self.check_params(args, kwargs, "season", None, True, "int", []) self.e, args = self.check_params(args, kwargs, "episode", None, True, "int", []) # optional - self.fullPath, args = self.check_params(args, kwargs, "full_path", 0, False, "bool", []) + self.fullPath, args = self.check_params(args, kwargs, "full_path", False, False, "bool", []) # super, missing, help ApiCall.__init__(self, args, kwargs) @@ -843,7 +841,7 @@ class CMD_EpisodeSetStatus(ApiCall): ["wanted", "skipped", "ignored", "failed"]) # optional self.e, args = self.check_params(args, kwargs, "episode", None, False, "int", []) - self.force, args = self.check_params(args, kwargs, "force", 0, False, "bool", []) + self.force, args = self.check_params(args, kwargs, "force", False, False, "bool", []) # super, missing, help ApiCall.__init__(self, args, kwargs) @@ -1273,12 +1271,12 @@ class CMD_PostProcess(ApiCall): # required # optional self.path, args = self.check_params(args, kwargs, "path", None, False, "string", []) - self.force_replace, args = self.check_params(args, kwargs, "force_replace", 0, False, "bool", []) - self.return_data, args = self.check_params(args, kwargs, "return_data", 0, False, "bool", []) + self.force_replace, args = self.check_params(args, kwargs, "force_replace", False, False, "bool", []) + self.return_data, args = self.check_params(args, kwargs, "return_data", False, False, "bool", []) self.process_method, args = self.check_params(args, kwargs, "process_method", False, False, "string", ["copy", "symlink", "hardlink", "move"]) - self.is_priority, args = self.check_params(args, kwargs, "is_priority", 0, False, "bool", []) - self.failed, args = self.check_params(args, kwargs, "failed", 0, False, "bool", []) + self.is_priority, args = self.check_params(args, kwargs, "is_priority", False, False, "bool", []) + self.failed, args = self.check_params(args, kwargs, "failed", False, False, "bool", []) self.type, args = self.check_params(args, kwargs, "type", "auto", None, "string", ["auto", "manual"]) # super, missing, help ApiCall.__init__(self, args, kwargs) @@ -1334,7 +1332,7 @@ class CMD_SickBeardAddRootDir(ApiCall): # required self.location, args = self.check_params(args, kwargs, "location", None, True, "string", []) # optional - self.default, args = self.check_params(args, kwargs, "default", 0, False, "bool", []) + self.default, args = self.check_params(args, kwargs, "default", False, False, "bool", []) # super, missing, help ApiCall.__init__(self, args, kwargs) @@ -1548,7 +1546,7 @@ class CMD_SickBeardPauseBacklog(ApiCall): def __init__(self, args, kwargs): # required # optional - self.pause, args = self.check_params(args, kwargs, "pause", 0, False, "bool", []) + self.pause, args = self.check_params(args, kwargs, "pause", False, False, "bool", []) # super, missing, help ApiCall.__init__(self, args, kwargs) @@ -1960,7 +1958,7 @@ class CMD_ShowAddExisting(ApiCall): ["sddvd", "hdtv", "rawhdtv", "fullhdtv", "hdwebdl", "fullhdwebdl", "hdbluray", "fullhdbluray"]) self.flatten_folders, args = self.check_params(args, kwargs, "flatten_folders", - str(sickbeard.FLATTEN_FOLDERS_DEFAULT), False, "bool", []) + bool(sickbeard.FLATTEN_FOLDERS_DEFAULT), False, "bool", []) self.subtitles, args = self.check_params(args, kwargs, "subtitles", int(sickbeard.USE_SUBTITLES), False, "int", []) # super, missing, help @@ -2057,22 +2055,21 @@ class CMD_ShowAddNew(ApiCall): ["sddvd", "hdtv", "rawhdtv", "fullhdtv", "hdwebdl", "fullhdwebdl", "hdbluray", "fullhdbluray"]) self.flatten_folders, args = self.check_params(args, kwargs, "flatten_folders", - str(sickbeard.FLATTEN_FOLDERS_DEFAULT), False, "bool", []) + bool(sickbeard.FLATTEN_FOLDERS_DEFAULT), False, "bool", []) self.status, args = self.check_params(args, kwargs, "status", None, False, "string", ["wanted", "skipped", "ignored"]) self.lang, args = self.check_params(args, kwargs, "lang", sickbeard.INDEXER_DEFAULT_LANGUAGE, False, "string", self.valid_languages.keys()) - self.subtitles, args = self.check_params(args, kwargs, "subtitles", int(sickbeard.USE_SUBTITLES), + self.subtitles, args = self.check_params(args, kwargs, "subtitles", bool(sickbeard.USE_SUBTITLES), False, "bool", []) - self.anime, args = self.check_params(args, kwargs, "anime", int(sickbeard.ANIME_DEFAULT), False, + self.anime, args = self.check_params(args, kwargs, "anime", bool(sickbeard.ANIME_DEFAULT), False, "bool", []) - self.scene, args = self.check_params(args, kwargs, "scene", int(sickbeard.SCENE_DEFAULT), False, + self.scene, args = self.check_params(args, kwargs, "scene", bool(sickbeard.SCENE_DEFAULT), False, "bool", []) self.future_status, args = self.check_params(args, kwargs, "future_status", None, False, "string", ["wanted", "skipped", "ignored"]) - self.archive_firstmatch, args = self.check_params(args, kwargs, "archive_firstmatch", - int(sickbeard.ARCHIVE_DEFAULT), False, "bool", []) + bool(sickbeard.ARCHIVE_DEFAULT), False, "bool", []) # super, missing, help ApiCall.__init__(self, args, kwargs) @@ -2249,7 +2246,7 @@ class CMD_ShowDelete(ApiCall): # required self.indexerid, args = self.check_params(args, kwargs, "indexerid", None, True, "int", []) # optional - self.removefiles, args = self.check_params(args, kwargs, "removefiles", 0, False, "bool", []) + self.removefiles, args = self.check_params(args, kwargs, "removefiles", False, False, "bool", []) # super, missing, help ApiCall.__init__(self, args, kwargs) @@ -2414,7 +2411,7 @@ class CMD_ShowPause(ApiCall): # required self.indexerid, args = self.check_params(args, kwargs, "indexerid", None, True, "int", []) # optional - self.pause, args = self.check_params(args, kwargs, "pause", 0, False, "bool", []) + self.pause, args = self.check_params(args, kwargs, "pause", False, False, "bool", []) # super, missing, help ApiCall.__init__(self, args, kwargs) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 40de74d7935709e7514fb4e0ed859148dd780de4..1963e0b8e7ac4a9104c76255eb25c9975ada9932 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -1951,12 +1951,11 @@ class Home(WebRoot): # return the correct json value # Find the quality class for the episode - quality_class = Quality.qualityStrings[Quality.UNKNOWN] ep_status, ep_quality = Quality.splitCompositeStatus(ep_obj.status) - for x in (SD, HD720p, HD1080p): - if ep_quality in Quality.splitQuality(x)[0]: - quality_class = qualityPresetStrings[x] - break + if ep_quality in Quality.cssClassStrings: + quality_class = Quality.cssClassStrings[ep_quality] + else: + quality_class = Quality.cssClassStrings[Quality.UNKNOWN] return quality_class @@ -3932,7 +3931,7 @@ class ConfigPostProcessing(Config): no_delete=None, rename_episodes=None, airdate_episodes=None, unpack=None, move_associated_files=None, sync_files=None, postpone_if_sync_files=None, nfo_rename=None, tv_download_dir=None, naming_custom_abd=None, - naming_anime=None, + naming_anime=None,create_missing_show_dirs=None,add_shows_wo_dir=None, naming_abd_pattern=None, naming_strip_year=None, use_failed_downloads=None, delete_failed=None, extra_scripts=None, skip_removed_files=None, naming_custom_sports=None, naming_sports_pattern=None, @@ -3957,6 +3956,8 @@ class ConfigPostProcessing(Config): sickbeard.UNPACK = config.checkbox_to_value(unpack) sickbeard.NO_DELETE = config.checkbox_to_value(no_delete) sickbeard.KEEP_PROCESSED_DIR = config.checkbox_to_value(keep_processed_dir) + sickbeard.CREATE_MISSING_SHOW_DIRS = config.checkbox_to_value(create_missing_show_dirs) + sickbeard.ADD_SHOWS_WO_DIR = config.checkbox_to_value(add_shows_wo_dir) sickbeard.PROCESS_METHOD = process_method sickbeard.DELRARCONTENTS = config.checkbox_to_value(del_rar_contents) sickbeard.EXTRA_SCRIPTS = [x.strip() for x in extra_scripts.split('|') if x.strip()]