diff --git a/sickbeard/name_parser/parser.py b/sickbeard/name_parser/parser.py index 88821cb..8ae317c 100644 --- a/sickbeard/name_parser/parser.py +++ b/sickbeard/name_parser/parser.py @@ -44,12 +44,13 @@ from ..classes import OrderedDefaultdict from .._legacy_classes import LegacyParseResult from _23 import decode_str, list_keys, list_range -from six import iterkeys, itervalues, PY2, string_types, text_type +from six import iteritems, iterkeys, itervalues, PY2, string_types, text_type # noinspection PyUnreachableCode if False: # noinspection PyUnresolvedReferences from typing import Any, AnyStr, Dict, List, Optional + from ..tv import TVShow class NameParser(object): @@ -632,7 +633,8 @@ class NameParser(object): and not final_result.release_group and None is not release_group: final_result.release_group = release_group # use provider ID otherwise pick_best_result fails - if cache_result: + if cache_result \ + and any('anime' in wr for wr in final_result.which_regex) == bool(final_result.show_obj.is_anime): name_parser_cache.add(name, final_result) logger.log(u'Parsed %s into %s' % (name, final_result), logger.DEBUG) @@ -828,7 +830,7 @@ class ParseResult(LegacyParseResult): class NameParserCache(object): def __init__(self): super(NameParserCache, self).__init__() - self._previous_parsed = OrderedDefaultdict() + self._previous_parsed = OrderedDefaultdict() # type: Dict[AnyStr, ParseResult] self._cache_size = 1000 self.lock = threading.Lock() @@ -868,6 +870,17 @@ class NameParserCache(object): self._previous_parsed.move_to_end(name) return self._previous_parsed[name] + def flush(self, show_obj): + # type: (TVShow) -> None + """ + removes all entries corresponding to the given show_obj + + :param show_obj: TVShow object + """ + with self.lock: + self._previous_parsed = OrderedDefaultdict(None, [(k, v) for k, v in iteritems(self._previous_parsed) + if v.show_obj != show_obj]) + name_parser_cache = NameParserCache() diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index 1b67a80..f398ddb 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -1131,8 +1131,7 @@ class GenericProvider(object): parser = NameParser(False, show_obj=self.get_show(item, **kwargs), convert=True, indexer_lookup=False) # parse the file name try: - cache_result = not (show_obj and show_obj.is_anime) - parse_result = parser.parse(title, cache_result=cache_result, release_group=self.get_id()) + parse_result = parser.parse(title, release_group=self.get_id()) except InvalidNameException: logger.log(u'Unable to parse the filename %s into a valid episode' % title, logger.DEBUG) continue diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 5a7341c..dfba649 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -2673,6 +2673,9 @@ class Home(MainHandler): except exceptions_helper.CantRefreshException as e: errors.append('Unable to refresh this show: ' + ex(e)) + if bool(anime) != show_obj.is_anime: + sickbeard.name_parser.parser.name_parser_cache.flush(show_obj) + show_obj.paused = paused show_obj.scene = scene show_obj.anime = anime