diff --git a/sickbeard/common.py b/sickbeard/common.py index 7ad9f52204e563ff9fea57910bcb89325826c200..731aaa84896b266d875e8d8e09217072db5e7e74 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -1,3 +1,4 @@ +# coding=utf-8 # Author: Nic Wolfe <nic@wolfeden.ca> # URL: https://sickrage.github.io/ # Git: https://github.com/SickRage/SickRage.git @@ -17,31 +18,42 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -import re -import uuid -import os.path +""" +Common interface for Quality and Status +""" + +# pylint: disable=line-too-long + + import operator +from os import path import platform from random import shuffle +import re +import uuid + +from hachoir_parser import createParser # pylint: disable=import-error +from hachoir_metadata import extractMetadata # pylint: disable=import-error +from hachoir_core.log import log # pylint: disable=import-error from sickbeard.numdict import NumDict from sickrage.helper.encoding import ek - SPOOF_USER_AGENT = False # If some provider has an issue with functionality of SR, other than user agents, it's best to come talk to us rather than block. # It is no different than us going to a provider if we have questions or issues. Be a team player here. # This is disabled, was only added for testing, and has no config.ini or web ui setting. To enable, set SPOOF_USER_AGENT = True -user_agents = ['Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36' - 'Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0' - 'Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0' - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A' - 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25' - 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko' - 'Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko' - ] +user_agents = [ + 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36' + 'Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0' + 'Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0' + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A' + 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25' + 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko' + 'Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko' +] INSTANCE_ID = str(uuid.uuid1()) USER_AGENT = ('SickRage/(' + platform.system() + '; ' + platform.release() + '; ' + INSTANCE_ID + ')') @@ -50,10 +62,11 @@ if SPOOF_USER_AGENT: shuffle(user_agents) USER_AGENT = user_agents[0] -cpu_presets = {'HIGH': 5, - 'NORMAL': 2, - 'LOW': 1 - } +cpu_presets = { + 'HIGH': 5, + 'NORMAL': 2, + 'LOW': 1 +} # Other constants MULTI_EP_RESULT = -1 @@ -66,12 +79,13 @@ NOTIFY_SUBTITLE_DOWNLOAD = 3 NOTIFY_GIT_UPDATE = 4 NOTIFY_GIT_UPDATE_TEXT = 5 -notifyStrings = {} -notifyStrings[NOTIFY_SNATCH] = "Started Download" -notifyStrings[NOTIFY_DOWNLOAD] = "Download Finished" -notifyStrings[NOTIFY_SUBTITLE_DOWNLOAD] = "Subtitle Download Finished" -notifyStrings[NOTIFY_GIT_UPDATE] = "SickRage Updated" -notifyStrings[NOTIFY_GIT_UPDATE_TEXT] = "SickRage Updated To Commit#: " +notifyStrings = NumDict({ + NOTIFY_SNATCH: "Started Download", + NOTIFY_DOWNLOAD: "Download Finished", + NOTIFY_SUBTITLE_DOWNLOAD: "Subtitle Download Finished", + NOTIFY_GIT_UPDATE: "SickRage Updated", + NOTIFY_GIT_UPDATE_TEXT: "SickRage Updated To Commit#: " +}) # Episode statuses UNKNOWN = -1 # should never happen @@ -85,7 +99,7 @@ IGNORED = 7 # episodes that you don't want included in your download stats SNATCHED_PROPER = 9 # qualified with quality SUBTITLED = 10 # qualified with quality FAILED = 11 # episode downloaded or snatched we don't want -SNATCHED_BEST = 12 # episode redownloaded using best quality +SNATCHED_BEST = 12 # episode re-downloaded using best quality NAMING_REPEAT = 1 NAMING_EXTEND = 2 @@ -94,16 +108,20 @@ NAMING_LIMITED_EXTEND = 8 NAMING_SEPARATED_REPEAT = 16 NAMING_LIMITED_EXTEND_E_PREFIXED = 32 -multiEpStrings = {} -multiEpStrings[NAMING_REPEAT] = "Repeat" -multiEpStrings[NAMING_SEPARATED_REPEAT] = "Repeat (Separated)" -multiEpStrings[NAMING_DUPLICATE] = "Duplicate" -multiEpStrings[NAMING_EXTEND] = "Extend" -multiEpStrings[NAMING_LIMITED_EXTEND] = "Extend (Limited)" -multiEpStrings[NAMING_LIMITED_EXTEND_E_PREFIXED] = "Extend (Limited, E-prefixed)" +MULTI_EP_STRINGS = NumDict({ + NAMING_REPEAT: "Repeat", + NAMING_SEPARATED_REPEAT: "Repeat (Separated)", + NAMING_DUPLICATE: "Duplicate", + NAMING_EXTEND: "Extend", + NAMING_LIMITED_EXTEND: "Extend (Limited)", + NAMING_LIMITED_EXTEND_E_PREFIXED: "Extend (Limited, E-prefixed)" +}) + -# pylint: disable=W0232 class Quality(object): + """ + Determine quality and set status codes + """ NONE = 0 # 0 SDTV = 1 # 1 SDDVD = 1 << 1 # 2 @@ -121,55 +139,66 @@ class Quality(object): # put these bits at the other end of the spectrum, far enough out that they shouldn't interfere UNKNOWN = 1 << 15 # 32768 - qualityStrings = {NONE: "N/A", - UNKNOWN: "Unknown", - SDTV: "SDTV", - SDDVD: "SD DVD", - HDTV: "720p HDTV", - RAWHDTV: "RawHD", - FULLHDTV: "1080p HDTV", - HDWEBDL: "720p WEB-DL", - FULLHDWEBDL: "1080p WEB-DL", - HDBLURAY: "720p BluRay", - FULLHDBLURAY: "1080p BluRay"} - - sceneQualityStrings = {NONE: "N/A", - UNKNOWN: "Unknown", - SDTV: "HDTV", - SDDVD: "", - HDTV: "720p HDTV", - RAWHDTV: "1080i HDTV", - FULLHDTV: "1080p HDTV", - HDWEBDL: "720p WEB-DL", - FULLHDWEBDL: "1080p WEB-DL", - HDBLURAY: "720p BluRay", - FULLHDBLURAY: "1080p BluRay"} - - combinedQualityStrings = {ANYHDTV: "HDTV", - ANYWEBDL: "WEB-DL", - ANYBLURAY: "BluRay"} - - cssClassStrings = {NONE: "N/A", - UNKNOWN: "Unknown", - SDTV: "SDTV", - SDDVD: "SDDVD", - HDTV: "HD720p", - RAWHDTV: "RawHD", - FULLHDTV: "HD1080p", - HDWEBDL: "HD720p", - FULLHDWEBDL: "HD1080p", - HDBLURAY: "HD720p", - FULLHDBLURAY: "HD1080p", - ANYHDTV: "any-hd", - ANYWEBDL: "any-hd", - ANYBLURAY: "any-hd"} - - statusPrefixes = {DOWNLOADED: "Downloaded", - SNATCHED: "Snatched", - SNATCHED_PROPER: "Snatched (Proper)", - FAILED: "Failed", - SNATCHED_BEST: "Snatched (Best)", - ARCHIVED: "Archived"} + qualityStrings = NumDict({ + NONE: "N/A", + UNKNOWN: "Unknown", + SDTV: "SDTV", + SDDVD: "SD DVD", + HDTV: "720p HDTV", + RAWHDTV: "RawHD", + FULLHDTV: "1080p HDTV", + HDWEBDL: "720p WEB-DL", + FULLHDWEBDL: "1080p WEB-DL", + HDBLURAY: "720p BluRay", + FULLHDBLURAY: "1080p BluRay" + }) + + sceneQualityStrings = NumDict({ + NONE: "N/A", + UNKNOWN: "Unknown", + SDTV: "HDTV", + SDDVD: "", + HDTV: "720p HDTV", + RAWHDTV: "1080i HDTV", + FULLHDTV: "1080p HDTV", + HDWEBDL: "720p WEB-DL", + FULLHDWEBDL: "1080p WEB-DL", + HDBLURAY: "720p BluRay", + FULLHDBLURAY: "1080p BluRay" + }) + + combinedQualityStrings = NumDict({ + ANYHDTV: "HDTV", + ANYWEBDL: "WEB-DL", + ANYBLURAY: "BluRay" + }) + + cssClassStrings = NumDict({ + NONE: "N/A", + UNKNOWN: "Unknown", + SDTV: "SDTV", + SDDVD: "SDDVD", + HDTV: "HD720p", + RAWHDTV: "RawHD", + FULLHDTV: "HD1080p", + HDWEBDL: "HD720p", + FULLHDWEBDL: "HD1080p", + HDBLURAY: "HD720p", + FULLHDBLURAY: "HD1080p", + ANYHDTV: "any-hd", + ANYWEBDL: "any-hd", + ANYBLURAY: "any-hd" + }) + + statusPrefixes = NumDict({ + DOWNLOADED: "Downloaded", + SNATCHED: "Snatched", + SNATCHED_PROPER: "Snatched (Proper)", + FAILED: "Failed", + SNATCHED_BEST: "Snatched (Best)", + ARCHIVED: "Archived" + }) + @staticmethod def _getStatusStrings(status): """ @@ -178,33 +207,33 @@ class Quality(object): :param status: Status prefix to resolve :return: Human readable status value """ - toReturn = {} - for q in Quality.qualityStrings.keys(): - toReturn[Quality.compositeStatus(status, q)] = Quality.statusPrefixes[status] + " (" + \ - Quality.qualityStrings[q] + ")" - return toReturn + to_return = {} + for quality in Quality.qualityStrings: + to_return[Quality.compositeStatus(status, quality)] = Quality.statusPrefixes[status] + " (" + \ + Quality.qualityStrings[quality] + ")" + return to_return @staticmethod - def combineQualities(anyQualities, bestQualities): - anyQuality = 0 - bestQuality = 0 - if anyQualities: - anyQuality = reduce(operator.or_, anyQualities) - if bestQualities: - bestQuality = reduce(operator.or_, bestQualities) - return anyQuality | (bestQuality << 16) + def combineQualities(any_qualities, best_qualities): + any_quality = 0 + best_quality = 0 + if any_qualities: + any_quality = reduce(operator.or_, any_qualities) + if best_qualities: + best_quality = reduce(operator.or_, best_qualities) + return any_quality | (best_quality << 16) @staticmethod def splitQuality(quality): - anyQualities = [] - bestQualities = [] - for curQual in Quality.qualityStrings.keys(): - if curQual & quality: - anyQualities.append(curQual) - if curQual << 16 & quality: - bestQualities.append(curQual) + any_qualities = [] + best_qualities = [] + for cur_qual in Quality.qualityStrings: + if cur_qual & quality: + any_qualities.append(cur_qual) + if cur_qual << 16 & quality: + best_qualities.append(cur_qual) - return (sorted(anyQualities), sorted(bestQualities)) + return sorted(any_qualities), sorted(best_qualities) @staticmethod def nameQuality(name, anime=False): @@ -212,6 +241,7 @@ class Quality(object): Return The quality from an episode File renamed by SickRage If no quality is achieved it will try sceneQuality regex + :param name: to parse :param anime: Boolean to indicate if the show we're resolving is Anime :return: Quality prefix """ @@ -227,9 +257,8 @@ class Quality(object): return Quality.UNKNOWN - @staticmethod - def sceneQuality(name, anime=False): + def sceneQuality(name, anime=False): # pylint: disable=too-many-branches """ Return The quality from the scene episode File @@ -238,60 +267,55 @@ class Quality(object): :return: Quality prefix """ - # pylint: disable=R0912 - ret = Quality.UNKNOWN if not name: return ret - name = ek(os.path.basename, name) + name = ek(path.basename, name) - checkName = lambda list, func: func([re.search(x, name, re.I) for x in list]) + check_name = lambda regex_list, func: func([re.search(regex, name, re.I) for regex in regex_list]) if anime: - dvdOptions = checkName([r"dvd", r"dvdrip"], any) - blueRayOptions = checkName([r"BD", r"blue?-?ray"], any) - sdOptions = checkName([r"360p", r"480p", r"848x480", r"XviD"], any) - hdOptions = checkName([r"720p", r"1280x720", r"960x720"], any) - fullHD = checkName([r"1080p", r"1920x1080"], any) + dvd_options = check_name([r"dvd", r"dvdrip"], any) + bluray_options = check_name([r"BD", r"blue?-?ray"], any) + sd_options = check_name([r"360p", r"480p", r"848x480", r"XviD"], any) + hd_options = check_name([r"720p", r"1280x720", r"960x720"], any) + full_hd = check_name([r"1080p", r"1920x1080"], any) - if sdOptions and not blueRayOptions and not dvdOptions: + if sd_options and not bluray_options and not dvd_options: ret = Quality.SDTV - elif dvdOptions: + elif dvd_options: ret = Quality.SDDVD - elif hdOptions and not blueRayOptions and not fullHD: + elif hd_options and not bluray_options and not full_hd: ret = Quality.HDTV - elif fullHD and not blueRayOptions and not hdOptions: + elif full_hd and not bluray_options and not hd_options: ret = Quality.FULLHDTV - elif hdOptions and not blueRayOptions and not fullHD: + elif hd_options and not bluray_options and not full_hd: ret = Quality.HDWEBDL - elif blueRayOptions and hdOptions and not fullHD: + elif bluray_options and hd_options and not full_hd: ret = Quality.HDBLURAY - elif blueRayOptions and fullHD and not hdOptions: + elif bluray_options and full_hd and not hd_options: ret = Quality.FULLHDBLURAY return ret - if (checkName([r"480p|web.?dl|web(rip|mux|hd)|[sph]d.?tv|dsr|tv(rip|mux)|satrip", r"xvid|divx|[xh].?26[45]"], all) - and not checkName([r"(720|1080)[pi]"], all) and not checkName([r"hr.ws.pdtv.[xh].?26[45]"], any)): + if check_name([r"480p|web.?dl|web(rip|mux|hd)|[sph]d.?tv|dsr|tv(rip|mux)|satrip", r"xvid|divx|[xh].?26[45]"], all) and not check_name([r"(720|1080)[pi]"], all) and not check_name([r"hr.ws.pdtv.[xh].?26[45]"], any): ret = Quality.SDTV - elif (checkName([r"dvd(rip|mux)|b[rd](rip|mux)|blue?-?ray", r"xvid|divx|[xh].?26[45]"], all) - and not checkName([r"(720|1080)[pi]"], all) and not checkName([r"hr.ws.pdtv.[xh].?26[45]"], any)): + elif check_name([r"dvd(rip|mux)|b[rd](rip|mux)|blue?-?ray", r"xvid|divx|[xh].?26[45]"], all) and not check_name([r"(720|1080)[pi]"], all) and not check_name([r"hr.ws.pdtv.[xh].?26[45]"], any): ret = Quality.SDDVD - elif (checkName([r"720p", r"hd.?tv", r"[xh].?26[45]"], all) or checkName([r"hr.ws.pdtv.[xh].?26[45]"], any) - and not checkName([r"1080[pi]"], all)): + elif check_name([r"720p", r"hd.?tv", r"[xh].?26[45]"], all) or check_name([r"hr.ws.pdtv.[xh].?26[45]"], any) and not check_name([r"1080[pi]"], all): ret = Quality.HDTV - elif checkName([r"720p|1080i", r"hd.?tv", r"mpeg-?2"], all) or checkName([r"1080[pi].hdtv", r"h.?26[45]"], all): + elif check_name([r"720p|1080i", r"hd.?tv", r"mpeg-?2"], all) or check_name([r"1080[pi].hdtv", r"h.?26[45]"], all): ret = Quality.RAWHDTV - elif checkName([r"1080p", r"hd.?tv", r"[xh].?26[45]"], all): + elif check_name([r"1080p", r"hd.?tv", r"[xh].?26[45]"], all): ret = Quality.FULLHDTV - elif checkName([r"720p", r"web.?dl|web(rip|mux|hd)"], all) or checkName([r"720p", r"itunes", r"[xh].?26[45]"], all): + elif check_name([r"720p", r"web.?dl|web(rip|mux|hd)"], all) or check_name([r"720p", r"itunes", r"[xh].?26[45]"], all): ret = Quality.HDWEBDL - elif checkName([r"1080p", r"web.?dl|web(rip|mux|hd)"], all) or checkName([r"1080p", r"itunes", r"[xh].?26[45]"], all): + elif check_name([r"1080p", r"web.?dl|web(rip|mux|hd)"], all) or check_name([r"1080p", r"itunes", r"[xh].?26[45]"], all): ret = Quality.FULLHDWEBDL - elif checkName([r"720p", r"blue?-?ray|hddvd|b[rd](rip|mux)", r"[xh].?26[45]"], all): + elif check_name([r"720p", r"blue?-?ray|hddvd|b[rd](rip|mux)", r"[xh].?26[45]"], all): ret = Quality.HDBLURAY - elif checkName([r"1080p", r"blue?-?ray|hddvd|b[rd](rip|mux)", r"[xh].?26[45]"], all): + elif check_name([r"1080p", r"blue?-?ray|hddvd|b[rd](rip|mux)", r"[xh].?26[45]"], all): ret = Quality.FULLHDBLURAY return ret @@ -314,7 +338,7 @@ class Quality(object): return Quality.UNKNOWN @staticmethod - def qualityFromFileMeta(filename): + def qualityFromFileMeta(filename): # pylint: disable=too-many-branches """ Get quality file file metadata @@ -322,17 +346,11 @@ class Quality(object): :return: Quality prefix """ - # pylint: disable=R0912 - - from hachoir_parser import createParser - from hachoir_metadata import extractMetadata - from hachoir_core.log import log log.use_print = False try: parser = createParser(filename) - # pylint: disable=W0703 - except Exception: + except Exception: # pylint: disable=broad-except parser = None if not parser: @@ -340,15 +358,12 @@ class Quality(object): try: metadata = extractMetadata(parser) - # pylint: disable=W0703 - except Exception: + except Exception: # pylint: disable=broad-except metadata = None try: - # pylint: disable=W0212 - parser.stream._input.close() - # pylint: disable=W0703 - except Exception: + parser.stream._input.close() # pylint: disable=protected-access + except Exception: # pylint: disable=broad-except pass if not metadata: @@ -367,14 +382,14 @@ class Quality(object): if not height: return Quality.UNKNOWN - base_filename = ek(os.path.basename, filename) + base_filename = ek(path.basename, filename) bluray = re.search(r"blue?-?ray|hddvd|b[rd](rip|mux)", base_filename, re.I) is not None webdl = re.search(r"web.?dl|web(rip|mux|hd)", base_filename, re.I) is not None ret = Quality.UNKNOWN if height > 1000: ret = ((Quality.FULLHDTV, Quality.FULLHDBLURAY)[bluray], Quality.FULLHDWEBDL)[webdl] - elif height > 680 and height < 800: + elif 680 < height < 800: ret = ((Quality.HDTV, Quality.HDBLURAY)[bluray], Quality.HDWEBDL)[webdl] elif height < 680: ret = (Quality.SDTV, Quality.SDDVD)[re.search(r'dvd|b[rd]rip|blue?-?ray', base_filename, re.I) is not None] @@ -391,18 +406,23 @@ class Quality(object): @staticmethod def splitCompositeStatus(status): - """Returns a tuple containing (status, quality)""" + """ + Split a composite status code into a status and quality. + + :param status: to split + :returns: a tuple containing (status, quality) + """ if status == UNKNOWN: - return (UNKNOWN, Quality.UNKNOWN) + return UNKNOWN, Quality.UNKNOWN for q in sorted(Quality.qualityStrings.keys(), reverse=True): if status > q * 100: - return (status - q * 100, q) + return status - q * 100, q - return (status, Quality.NONE) + return status, Quality.NONE @staticmethod - def sceneQualityFromName(name, quality): # pylint: disable=R0912 + def sceneQualityFromName(name, quality): # pylint: disable=too-many-branches """ Get scene naming parameters from filename and quality @@ -410,17 +430,17 @@ class Quality(object): :param quality: int of quality to make sure we get the right rip type :return: encoder type for scene quality naming """ - codecList = ['xvid', 'divx'] - x264List = ['x264', 'x 264', 'x.264'] - h264List = ['h264', 'h 264', 'h.264', 'avc'] - x265List = ['x265', 'x 265', 'x.265'] - h265List = ['h265', 'h 265', 'h.265', 'hevc'] - codecList.extend(x264List + h264List + x265List + h265List) + codec_list = ['xvid', 'divx'] + x264_list = ['x264', 'x 264', 'x.264'] + h264_list = ['h264', 'h 264', 'h.264', 'avc'] + x265_list = ['x265', 'x 265', 'x.265'] + h265_list = ['h265', 'h 265', 'h.265', 'hevc'] + codec_list += x264_list + h264_list + x265_list + h265_list found_codecs = {} found_codec = None - for codec in codecList: + for codec in codec_list: if codec in name.lower(): found_codecs[name.lower().rfind(codec)] = codec @@ -438,18 +458,18 @@ class Quality(object): rip_type = "" if found_codec: - if codecList[0] in found_codec: + if codec_list[0] in found_codec: found_codec = 'XviD' - elif codecList[1] in found_codec: + elif codec_list[1] in found_codec: found_codec = 'DivX' - elif found_codec in x264List: - found_codec = x264List[0] - elif found_codec in h264List: - found_codec = h264List[0] - elif found_codec in x265List: - found_codec = x265List[0] - elif found_codec in h265List: - found_codec = h265List[0] + elif found_codec in x264_list: + found_codec = x264_list[0] + elif found_codec in h264_list: + found_codec = h264_list[0] + elif found_codec in x265_list: + found_codec = x265_list[0] + elif found_codec in h265_list: + found_codec = h265_list[0] if quality == 2: return rip_type + " " + found_codec @@ -482,12 +502,12 @@ class Quality(object): SNATCHED_BEST = None ARCHIVED = None -Quality.DOWNLOADED = [Quality.compositeStatus(DOWNLOADED, x) for x in Quality.qualityStrings.keys()] -Quality.SNATCHED = [Quality.compositeStatus(SNATCHED, x) for x in Quality.qualityStrings.keys()] -Quality.SNATCHED_PROPER = [Quality.compositeStatus(SNATCHED_PROPER, x) for x in Quality.qualityStrings.keys()] -Quality.FAILED = [Quality.compositeStatus(FAILED, x) for x in Quality.qualityStrings.keys()] -Quality.SNATCHED_BEST = [Quality.compositeStatus(SNATCHED_BEST, x) for x in Quality.qualityStrings.keys()] -Quality.ARCHIVED = [Quality.compositeStatus(ARCHIVED, x) for x in Quality.qualityStrings.keys()] +Quality.DOWNLOADED = [Quality.compositeStatus(DOWNLOADED, x) for x in Quality.qualityStrings] +Quality.SNATCHED = [Quality.compositeStatus(SNATCHED, x) for x in Quality.qualityStrings] +Quality.SNATCHED_PROPER = [Quality.compositeStatus(SNATCHED_PROPER, x) for x in Quality.qualityStrings] +Quality.FAILED = [Quality.compositeStatus(FAILED, x) for x in Quality.qualityStrings] +Quality.SNATCHED_BEST = [Quality.compositeStatus(SNATCHED_BEST, x) for x in Quality.qualityStrings] +Quality.ARCHIVED = [Quality.compositeStatus(ARCHIVED, x) for x in Quality.qualityStrings] HD720p = Quality.combineQualities([Quality.HDTV, Quality.HDWEBDL, Quality.HDBLURAY], []) HD1080p = Quality.combineQualities([Quality.FULLHDTV, Quality.FULLHDWEBDL, Quality.FULLHDBLURAY], []) @@ -500,28 +520,23 @@ ANY = Quality.combineQualities([SD, HD], []) BEST = Quality.combineQualities([Quality.SDTV, Quality.HDTV, Quality.HDWEBDL], [Quality.HDTV]) qualityPresets = (SD, HD, HD720p, HD1080p, ANY) -qualityPresetStrings = {SD: "SD", - HD: "HD", - HD720p: "HD720p", - HD1080p: "HD1080p", - ANY: "Any"} +qualityPresetStrings = NumDict({ + SD: "SD", + HD: "HD", + HD720p: "HD720p", + HD1080p: "HD1080p", + ANY: "Any" +}) class StatusStrings(NumDict): """ Dictionary containing strings for status codes """ - # todo: Deprecate StatusStrings().statusStrings and use StatusStrings() directly - # todo: Deprecate .has_key and switch to 'x in y' # todo: Make views return Qualities too - # todo: qualities = Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED + Quality.FAILED - @property - def statusStrings(self): # for backwards compatibility - return self.data - def __missing__(self, key): """ If the key is not found try to determine a status from Quality @@ -560,30 +575,30 @@ statusStrings = StatusStrings({ }) -# pylint: disable=R0903 -class Overview(object): +class Overview(object): # pylint: disable=too-few-public-methods UNAIRED = UNAIRED # 1 - SNATCHED = SNATCHED # 2 + SNATCHED = SNATCHED # 2 WANTED = WANTED # 3 - GOOD = DOWNLOADED # 4 + GOOD = DOWNLOADED # 4 SKIPPED = SKIPPED # 5 SNATCHED_PROPER = SNATCHED_PROPER # 9 - SNATCHED_BEST = SNATCHED_BEST # 12 + SNATCHED_BEST = SNATCHED_BEST # 12 # Should suffice! QUAL = 50 - overviewStrings = { + overviewStrings = NumDict({ SKIPPED: "skipped", WANTED: "wanted", QUAL: "qual", GOOD: "good", UNAIRED: "unaired", SNATCHED: "snatched", - # we can give these a different class later, otherwise breaks checkboxes in displayshow for showing different statuses + # we can give these a different class later, otherwise + # breaks checkboxes in displayShow for showing different statuses SNATCHED_BEST: "snatched", SNATCHED_PROPER: "snatched" - } + }) countryList = { 'Australia': 'AU',