1
0
mirror of https://github.com/moparisthebest/SickRage synced 2024-11-12 04:15:09 -05:00

Quality is now set during parsing of results.

Fixed more anime regex bugs.
Fixed Indexer API issues for anime shows and unicode problems.
This commit is contained in:
echel0n 2014-06-07 04:06:21 -07:00
parent 31ce517e8f
commit 24dfbc3f15
9 changed files with 51 additions and 34 deletions

View File

@ -598,11 +598,11 @@ class Tvdb:
zipdata = StringIO.StringIO() zipdata = StringIO.StringIO()
zipdata.write(resp.content) zipdata.write(resp.content)
myzipfile = zipfile.ZipFile(zipdata) myzipfile = zipfile.ZipFile(zipdata)
return xmltodict.parse(myzipfile.read('%s.xml' % language).strip(), postprocessor=process) return xmltodict.parse(myzipfile.read('%s.xml' % language).strip().encode('utf-8'), postprocessor=process)
except zipfile.BadZipfile: except zipfile.BadZipfile:
raise tvdb_error("Bad zip file received from thetvdb.com, could not read it") raise tvdb_error("Bad zip file received from thetvdb.com, could not read it")
else: else:
return xmltodict.parse(resp.content.strip(), postprocessor=process) return xmltodict.parse(resp.content.strip().encode('utf-8'), postprocessor=process)
def _getetsrc(self, url, params=None, language=None): def _getetsrc(self, url, params=None, language=None):
"""Loads a URL using caching, returns an ElementTree of the source """Loads a URL using caching, returns an ElementTree of the source

View File

@ -462,7 +462,7 @@ class TVRage:
return (key, value) return (key, value)
if resp.ok: if resp.ok:
return xmltodict.parse(resp.content.strip(), postprocessor=remap_keys) return xmltodict.parse(resp.content.strip().encode('utf-8'), postprocessor=remap_keys)
def _getetsrc(self, url, params=None): def _getetsrc(self, url, params=None):
"""Loads a URL using caching, returns an ElementTree of the source """Loads a URL using caching, returns an ElementTree of the source
@ -527,6 +527,7 @@ class TVRage:
if not isinstance(data, dict or list): if not isinstance(data, dict or list):
data = data.replace(u"&", u"&") data = data.replace(u"&", u"&")
data = data.strip() data = data.strip()
return data return data
def search(self, series): def search(self, series):
@ -597,7 +598,7 @@ class TVRage:
self.config['params_epInfo']['sid'] = sid self.config['params_epInfo']['sid'] = sid
epsEt = self._getetsrc(self.config['url_epInfo'], self.config['params_epInfo']) epsEt = self._getetsrc(self.config['url_epInfo'], self.config['params_epInfo'])
for season in epsEt['episodelist']['season']: for season in epsEt['episodelist'].values():
episodes = season['episode'] episodes = season['episode']
if not isinstance(episodes, list): if not isinstance(episodes, list):
episodes = [episodes] episodes = [episodes]

View File

@ -163,12 +163,12 @@ class AllShowsListUI:
continue continue
if 'seriesname' in curShow: if 'seriesname' in curShow:
seriesnames.append(unicode(curShow['seriesname'])) seriesnames.append(curShow['seriesname'].encode('utf-8'))
if 'aliasnames' in curShow: if 'aliasnames' in curShow:
seriesnames.extend(unicode(curShow['aliasnames']).split('|')) seriesnames.extend(curShow['aliasnames'].encode('utf-8').split('|'))
for name in seriesnames: for name in seriesnames:
if str(searchterm).lower() in str(name).lower(): if searchterm.lower() in name.lower():
if 'firstaired' not in curShow: if 'firstaired' not in curShow:
curShow['firstaired'] = str(datetime.date.fromordinal(1)) curShow['firstaired'] = str(datetime.date.fromordinal(1))
curShow['firstaired'] = re.sub("([-]0{2}){1,}", "", curShow['firstaired']) curShow['firstaired'] = re.sub("([-]0{2}){1,}", "", curShow['firstaired'])

View File

@ -23,7 +23,7 @@ import threading
import regexes import regexes
import sickbeard import sickbeard
from sickbeard import logger, helpers, scene_numbering from sickbeard import logger, helpers, scene_numbering, common
from dateutil import parser from dateutil import parser
nameparser_lock = threading.Lock() nameparser_lock = threading.Lock()
@ -214,6 +214,7 @@ class NameParser(object):
result.score += 1 result.score += 1
elif self.showObj.anime and len(result.ab_episode_numbers): elif self.showObj.anime and len(result.ab_episode_numbers):
result.score += 1 result.score += 1
matches.append(result) matches.append(result)
continue continue
@ -234,6 +235,10 @@ class NameParser(object):
if len(matches): if len(matches):
result = max(matches, key=lambda x: x.score) result = max(matches, key=lambda x: x.score)
# get quality
if result.show:
result.quality = common.Quality.nameQuality(name, bool(result.show and result.show.is_anime))
return result return result
def _combine_results(self, first, second, attr): def _combine_results(self, first, second, attr):
@ -355,6 +360,7 @@ class NameParser(object):
final_result.which_regex += dir_name_result.which_regex final_result.which_regex += dir_name_result.which_regex
final_result.show = self._combine_results(file_name_result, dir_name_result, 'show') final_result.show = self._combine_results(file_name_result, dir_name_result, 'show')
final_result.quality = self._combine_results(file_name_result, dir_name_result, 'quality')
# if there's no useful info in it then raise an exception # if there's no useful info in it then raise an exception
if final_result.season_number == None and not final_result.episode_numbers and final_result.air_date == None and not final_result.series_name: if final_result.season_number == None and not final_result.episode_numbers and final_result.air_date == None and not final_result.series_name:
@ -380,7 +386,8 @@ class ParseResult(object):
air_date=None, air_date=None,
ab_episode_numbers=None, ab_episode_numbers=None,
show=None, show=None,
score=None score=None,
quality=None
): ):
self.original_name = original_name self.original_name = original_name
@ -397,6 +404,11 @@ class ParseResult(object):
else: else:
self.ab_episode_numbers = ab_episode_numbers self.ab_episode_numbers = ab_episode_numbers
if not quality:
self.quality = common.Quality.UNKNOWN
else:
self.quality = quality
self.extra_info = extra_info self.extra_info = extra_info
self.release_group = release_group self.release_group = release_group
@ -438,6 +450,8 @@ class ParseResult(object):
return False return False
if self.score != other.score: if self.score != other.score:
return False return False
if self.quality != other.quality:
return False
return True return True

View File

@ -222,8 +222,8 @@ anime_regexes = {'anime':[
""" """
^(?:\[(?P<release_group>.+?)\][ ._-]*) ^(?:\[(?P<release_group>.+?)\][ ._-]*)
(?P<series_name>.+?)[ ._-]+ (?P<series_name>.+?)[ ._-]+
(?P<ep_ab_num>(?!(1080|720|480)[pi])\d{1,3}) (?P<ep_ab_num>(?!(1080|720|480)[pi])\d+)
(-(?P<extra_ab_ep_num>\d{1,3}))?[ ._-]+? (-(?P<extra_ab_ep_num>(?!(1080|720|480)[pi])\d+))?[ ._-]+?
(?:v(?P<version>[0-9]))? (?:v(?P<version>[0-9]))?
(?:[\w\.]*) (?:[\w\.]*)
(?:(?:(?:[\[\(])(?P<extra_info>\d{3,4}[xp]?\d{0,4}[\.\w\s-]*)(?:[\]\)]))|(?:\d{3,4}[xp])) (?:(?:(?:[\[\(])(?P<extra_info>\d{3,4}[xp]?\d{0,4}[\.\w\s-]*)(?:[\]\)]))|(?:\d{3,4}[xp]))
@ -241,8 +241,8 @@ anime_regexes = {'anime':[
''' '''
^(\[(?P<release_group>.+?)\][ ._-]*)? # Release Group and separator ^(\[(?P<release_group>.+?)\][ ._-]*)? # Release Group and separator
(?P<series_name>.+?)[ ._-]+ # Show_Name and separator (?P<series_name>.+?)[ ._-]+ # Show_Name and separator
(?P<ep_ab_num>(?!(1080|720|480)[pi])\d{1,3}) # E01 (?P<ep_ab_num>(?!(1080|720|480)[pi])\d+) # E01
(-(?P<extra_ab_ep_num>\d{1,3}))? # E02 (-(?P<extra_ab_ep_num>(?!(1080|720|480)[pi])\d+))? # E02
(v(?P<version>[0-9]))? # version (v(?P<version>[0-9]))? # version
[ ._-]+\[(?P<extra_info>\d{3,4}[xp]?\d{0,4}[\.\w\s-]*)\] # Source_Quality_Etc- [ ._-]+\[(?P<extra_info>\d{3,4}[xp]?\d{0,4}[\.\w\s-]*)\] # Source_Quality_Etc-
(\[(?P<crc>\w{8})\])? # CRC (\[(?P<crc>\w{8})\])? # CRC
@ -256,8 +256,8 @@ anime_regexes = {'anime':[
''' '''
^(\[(?P<release_group>.+?)\][ ._-]*)? # Release Group and separator ^(\[(?P<release_group>.+?)\][ ._-]*)? # Release Group and separator
(?P<series_name>.+?)[ ._-]+ # Show_Name and separator (?P<series_name>.+?)[ ._-]+ # Show_Name and separator
(?P<ep_ab_num>(?!(1080|720|480)[pi])\d{1,3}) # E01 (?P<ep_ab_num>(?!(1080|720|480)[pi])\d+) # E01
(-(?P<extra_ab_ep_num>\d{1,3}))? # E02 (-(?P<extra_ab_ep_num>(?!(1080|720|480)[pi])\d+))? # E02
(v(?P<version>[0-9]))? # version (v(?P<version>[0-9]))? # version
[ ._-]+\((?P<extra_info>(CX[ ._-]?)?\d{3,4}[xp]?\d{0,4}[\.\w\s-]*)\) # Source_Quality_Etc- [ ._-]+\((?P<extra_info>(CX[ ._-]?)?\d{3,4}[xp]?\d{0,4}[\.\w\s-]*)\) # Source_Quality_Etc-
(\[(?P<crc>\w{8})\])? # CRC (\[(?P<crc>\w{8})\])? # CRC
@ -269,8 +269,8 @@ anime_regexes = {'anime':[
''' '''
^(\[(?P<release_group>.+?)\][ ._-]*)? # Release Group and separator ^(\[(?P<release_group>.+?)\][ ._-]*)? # Release Group and separator
(?P<series_name>.+?)[ ._-]+ # Show_Name and separator (?P<series_name>.+?)[ ._-]+ # Show_Name and separator
(?P<ep_ab_num>(?!(1080|720|480)[pi])\d{1,3}) # E01 (?P<ep_ab_num>(?!(1080|720|480)[pi])\d+) # E01
(-(?P<extra_ab_ep_num>\d{1,3}))? # E02 (-(?P<extra_ab_ep_num>(?!(1080|720|480)[pi])\d+))? # E02
(v(?P<version>[0-9]))? # version (v(?P<version>[0-9]))? # version
[ ._-]+\[(?P<extra_info>\d{3,4}p) # Source_Quality_Etc- [ ._-]+\[(?P<extra_info>\d{3,4}p) # Source_Quality_Etc-
(\[(?P<crc>\w{8})\])? # CRC (\[(?P<crc>\w{8})\])? # CRC
@ -285,8 +285,8 @@ anime_regexes = {'anime':[
^(\[(?P<release_group>.+?)\][ ._-]*)? # Release Group and separator ^(\[(?P<release_group>.+?)\][ ._-]*)? # Release Group and separator
(?P<series_name>.+?)[ ._]* # Show_Name and separator (?P<series_name>.+?)[ ._]* # Show_Name and separator
([ ._-]+-[ ._-]+[A-Z]+[ ._-]+)?[ ._-]+ # funny stuff, this is sooo nuts ! this will kick me in the butt one day ([ ._-]+-[ ._-]+[A-Z]+[ ._-]+)?[ ._-]+ # funny stuff, this is sooo nuts ! this will kick me in the butt one day
(?P<ep_ab_num>(?!(1080|720|480)[pi])\d{1,3}) # E01 (?P<ep_ab_num>(?!(1080|720|480)[pi])\d+) # E01
(-(?P<extra_ab_ep_num>\d{1,3}))? # E02 (-(?P<extra_ab_ep_num>(?!(1080|720|480)[pi])\d+))? # E02
(v(?P<version>[0-9]))? # version (v(?P<version>[0-9]))? # version
([ ._-](\[\w{1,2}\])?\[[a-z][.]?\w{2,4}\])? #codec ([ ._-](\[\w{1,2}\])?\[[a-z][.]?\w{2,4}\])? #codec
[ ._-]*\[(?P<extra_info>(\d{3,4}[xp]?\d{0,4})?[\.\w\s-]*)\] # Source_Quality_Etc- [ ._-]*\[(?P<extra_info>(\d{3,4}[xp]?\d{0,4})?[\.\w\s-]*)\] # Source_Quality_Etc-
@ -315,8 +315,8 @@ anime_regexes = {'anime':[
(([. _-]*e|-) # linking e/- char (([. _-]*e|-) # linking e/- char
(?P<extra_ep_num>\d+))* # additional E03/etc (?P<extra_ep_num>\d+))* # additional E03/etc
([ ._-]{2,}|[ ._]+) # if "-" is used to separate at least something else has to be there(->{2,}) "s16e03-04-313-314" would make sens any way ([ ._-]{2,}|[ ._]+) # if "-" is used to separate at least something else has to be there(->{2,}) "s16e03-04-313-314" would make sens any way
(?P<ep_ab_num>(?!(1080|720|480)[pi])\d{1,3}) # absolute number (?P<ep_ab_num>(?!(1080|720|480)[pi])\d+) # absolute number
(-(?P<extra_ab_ep_num>\d{1,3}))? # "-" as separator and anditional absolute number, all optinal (-(?P<extra_ab_ep_num>(?!(1080|720|480)[pi])\d+))? # "-" as separator and anditional absolute number, all optinal
(v(?P<version>[0-9]))? # the version e.g. "v2" (v(?P<version>[0-9]))? # the version e.g. "v2"
.*? .*?
''' '''
@ -334,8 +334,8 @@ anime_regexes = {'anime':[
(([. _-]*e|-) # linking e/- char (([. _-]*e|-) # linking e/- char
(?P<extra_ep_num>\d+))* # additional E03/etc (?P<extra_ep_num>\d+))* # additional E03/etc
([ ._-]{2,}|[ ._]+) # if "-" is used to separate at least something else has to be there(->{2,}) "s16e03-04-313-314" would make sens any way ([ ._-]{2,}|[ ._]+) # if "-" is used to separate at least something else has to be there(->{2,}) "s16e03-04-313-314" would make sens any way
(?P<ep_ab_num>(?!(1080|720|480)[pi])\d{1,3}) # absolute number (?P<ep_ab_num>(?!(1080|720|480)[pi])\d+) # absolute number
(-(?P<extra_ab_ep_num>\d{1,3}))? # "-" as separator and anditional absolute number, all optinal (-(?P<extra_ab_ep_num>(?!(1080|720|480)[pi])\d+))? # "-" as separator and anditional absolute number, all optinal
(v(?P<version>[0-9]))? # the version e.g. "v2" (v(?P<version>[0-9]))? # the version e.g. "v2"
.*? .*?
''' '''
@ -346,8 +346,8 @@ anime_regexes = {'anime':[
# Bleach - 313-314 - s16e03-04 # Bleach - 313-314 - s16e03-04
''' '''
^(?P<series_name>.+?)[ ._-]+ # start of string and series name and non optinal separator ^(?P<series_name>.+?)[ ._-]+ # start of string and series name and non optinal separator
(?P<ep_ab_num>(?!(1080|720|480)[pi])\d{1,3}) # absolute number (?P<ep_ab_num>(?!(1080|720|480)[pi])\d+) # absolute number
(-(?P<extra_ab_ep_num>\d{1,3}))? # "-" as separator and anditional absolute number, all optinal (-(?P<extra_ab_ep_num>(?!(1080|720|480)[pi])\d+))? # "-" as separator and anditional absolute number, all optinal
(v(?P<version>[0-9]))? # the version e.g. "v2" (v(?P<version>[0-9]))? # the version e.g. "v2"
([ ._-]{2,}|[ ._]+) # if "-" is used to separate at least something else has to be there(->{2,}) "s16e03-04-313-314" would make sens any way ([ ._-]{2,}|[ ._]+) # if "-" is used to separate at least something else has to be there(->{2,}) "s16e03-04-313-314" would make sens any way
[sS](?P<season_num>\d+)[. _-]* # S01 and optional separator [sS](?P<season_num>\d+)[. _-]* # S01 and optional separator
@ -361,8 +361,8 @@ anime_regexes = {'anime':[
('anime_and_normal_front', ('anime_and_normal_front',
# 165.Naruto Shippuuden.s08e014 # 165.Naruto Shippuuden.s08e014
''' '''
^(?P<ep_ab_num>(?!(1080|720|480)[pi])\d{1,3}) # start of string and absolute number ^(?P<ep_ab_num>(?!(1080|720|480)[pi])\d+) # start of string and absolute number
(-(?P<extra_ab_ep_num>\d{1,3}))? # "-" as separator and anditional absolute number, all optinal (-(?P<extra_ab_ep_num>(?!(1080|720|480)[pi])\d+))? # "-" as separator and anditional absolute number, all optinal
(v(?P<version>[0-9]))?[ ._-]+ # the version e.g. "v2" (v(?P<version>[0-9]))?[ ._-]+ # the version e.g. "v2"
(?P<series_name>.+?)[ ._-]+ (?P<series_name>.+?)[ ._-]+
[sS](?P<season_num>\d+)[. _-]* # S01 and optional separator [sS](?P<season_num>\d+)[. _-]* # S01 and optional separator
@ -377,8 +377,8 @@ anime_regexes = {'anime':[
''' '''
^(?:\[(?P<release_group>.+?)\][ ._-]*) ^(?:\[(?P<release_group>.+?)\][ ._-]*)
(?P<series_name>.+?)[ ._-]+ (?P<series_name>.+?)[ ._-]+
(?P<ep_ab_num>(?!(1080|720|480)[pi])\d{1,3}) (?P<ep_ab_num>(?!(1080|720|480)[pi])\d+)
(-(?P<extra_ab_ep_num>\d{1,3}))?[ ._-]*? (-(?P<extra_ab_ep_num>(?!(1080|720|480)[pi])\d+))?[ ._-]*?
(?:v(?P<version>[0-9])[ ._-]+?)? (?:v(?P<version>[0-9])[ ._-]+?)?
(?:.+?[ ._-]+?)? (?:.+?[ ._-]+?)?
\[(?P<extra_info>\w+)\][ ._-]? \[(?P<extra_info>\w+)\][ ._-]?
@ -393,8 +393,8 @@ anime_regexes = {'anime':[
''' '''
^(\[(?P<release_group>.+?)\][ ._-]*)? ^(\[(?P<release_group>.+?)\][ ._-]*)?
(?P<series_name>.+?)[ ._-]+ # Show_Name and separator (?P<series_name>.+?)[ ._-]+ # Show_Name and separator
(?P<ep_ab_num>(?!(1080|720|480)[pi])\d{1,3}) # E01 (?P<ep_ab_num>(?!(1080|720|480)[pi])\d+) # E01
(-(?P<extra_ab_ep_num>\d{3}))? # E02 (-(?P<extra_ab_ep_num>(?!(1080|720|480)[pi])\d+))? # E02
(v(?P<version>[0-9]))? # v2 (v(?P<version>[0-9]))? # v2
.*? # Separator and EOL .*? # Separator and EOL
''') ''')

View File

@ -498,7 +498,7 @@ class PostProcessor(object):
season = parse_result.season_number season = parse_result.season_number
episodes = parse_result.episode_numbers episodes = parse_result.episode_numbers
to_return = (parse_result.show, season, episodes, None) to_return = (parse_result.show, season, episodes, parse_result.quality)
self._finalize(parse_result) self._finalize(parse_result)
return to_return return to_return

View File

@ -284,7 +284,7 @@ class GenericProvider:
logger.log(u"Unable to parse the filename " + title + " into a valid episode", logger.WARNING) logger.log(u"Unable to parse the filename " + title + " into a valid episode", logger.WARNING)
continue continue
quality = self.getQuality(item, parse_result.is_anime) quality = parse_result.quality
if not (self.show.air_by_date or self.show.sports): if not (self.show.air_by_date or self.show.sports):
if search_mode == 'sponly' and len(parse_result.episode_numbers): if search_mode == 'sponly' and len(parse_result.episode_numbers):

View File

@ -200,7 +200,7 @@ class TVShow(object):
ep = None ep = None
# if we get an anime get the real season and episode # if we get an anime get the real season and episode
if self.is_anime and not self.is_scene and absolute_number and not season and not episode: if self.is_anime and absolute_number and not season and not episode:
myDB = db.DBConnection() myDB = db.DBConnection()
sql = "SELECT * FROM tv_episodes WHERE showid = ? and absolute_number = ? and season != 0" sql = "SELECT * FROM tv_episodes WHERE showid = ? and absolute_number = ? and season != 0"
sqlResults = myDB.select(sql, [self.indexerid, absolute_number]) sqlResults = myDB.select(sql, [self.indexerid, absolute_number])

View File

@ -2191,6 +2191,8 @@ class NewHomeAddShows:
if not lang or lang == 'null': if not lang or lang == 'null':
lang = "en" lang = "en"
search_term = search_term.encode('utf-8')
results = {} results = {}
final_results = [] final_results = []