def __init__(self): Transformer.__init__(self, -190) self.groups_container = PropertiesContainer() self._allowed_groupname_pattern = r'[\w@#€£$&]' self._forbidden_groupname_lambda = [lambda elt: elt in ['rip', 'by', 'for', 'par', 'pour', 'bonus'], lambda elt: self._is_number(elt), ] # If the previous property in this list, the match will be considered as safe # and group name can contain a separator. self.previous_safe_properties = ['videoCodec', 'format', 'videoApi', 'audioCodec'] self.groups_container.sep_replace_char = '-' self.groups_container.canonical_from_pattern = False self.groups_container.enhance_patterns = True self.groups_container.register_property('releaseGroup', None, self._allowed_groupname_pattern + '+') self.groups_container.register_property('releaseGroup', None, self._allowed_groupname_pattern + '+-' + self._allowed_groupname_pattern + '+')
class GuessReleaseGroup(Transformer): def __init__(self): Transformer.__init__(self, -190) self.groups_container = PropertiesContainer() self._allowed_groupname_pattern = r'[\w@#€£$&]' self._forbidden_groupname_lambda = [lambda elt: elt in ['rip', 'by', 'for', 'par', 'pour', 'bonus'], lambda elt: self._is_number(elt), ] # If the previous property in this list, the match will be considered as safe # and group name can contain a separator. self.previous_safe_properties = ['videoCodec', 'format', 'videoApi', 'audioCodec'] self.groups_container.sep_replace_char = '-' self.groups_container.canonical_from_pattern = False self.groups_container.enhance_patterns = True self.groups_container.register_property('releaseGroup', None, self._allowed_groupname_pattern + '+') self.groups_container.register_property('releaseGroup', None, self._allowed_groupname_pattern + '+-' + self._allowed_groupname_pattern + '+') def supported_properties(self): return self.groups_container.get_supported_properties() def _is_number(self, s): try: int(s) return True except ValueError: return False def adjust_metadata(self, md): return dict((property_name, container.compute_canonical_form(property_name, value) or value) for property_name, value in md.items()) def validate_group_name(self, guess): if guess.metadata().span[1] - guess.metadata().span[0] >= 2: val = guess['releaseGroup'] if '-' in guess['releaseGroup']: checked_val = "" for elt in val.split('-'): forbidden = False for forbidden_lambda in self._forbidden_groupname_lambda: forbidden = forbidden_lambda(elt.lower()) if forbidden: break if not forbidden: if checked_val: checked_val += '-' checked_val += elt else: break val = checked_val if not val: return False guess['releaseGroup'] = val forbidden = False for forbidden_lambda in self._forbidden_groupname_lambda: forbidden = forbidden_lambda(val.lower()) if forbidden: break if not forbidden: return True return False def is_leaf_previous(self, leaf, node): if leaf.span[1] <= node.span[0]: for idx in range(leaf.span[1], node.span[0]): if not leaf.root.value[idx] in sep: return False return True return False def guess_release_group(self, string, node): found = self.groups_container.find_properties(string, 'releaseGroup') guess = self.groups_container.as_guess(found, string, self.validate_group_name, sep_replacement='-') if guess: explicit_group_idx = node.node_idx[:2] explicit_group = node.root.node_at(explicit_group_idx) for leaf in explicit_group.leaves_containing(self.previous_safe_properties): if self.is_leaf_previous(leaf, node): if leaf.root.value[leaf.span[1]] == '-': guess.metadata().confidence = 1 else: guess.metadata().confidence = 0.7 return guess # If previous group last leaf is identified as a safe property, # consider the raw value as a groupname if len(explicit_group_idx) > 0 and explicit_group_idx[-1] > 0: previous_group = explicit_group_idx[:-1] + (explicit_group_idx[-1] - 1,) previous_node = node.root.node_at(previous_group) for leaf in previous_node.leaves_containing(self.previous_safe_properties): if self.is_leaf_previous(leaf, node): guess = Guess({'releaseGroup': node.clean_value}, confidence=1, input=node.value, span=node.span) if self.validate_group_name(guess): guess = format_guess(guess) node.guess = guess break return None guess_release_group.use_node = True def process(self, mtree): SingleNodeGuesser(self.guess_release_group, None, self.log).process(mtree)
# # You should have received a copy of the Lesser GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # from __future__ import unicode_literals from guessit.transfo import SingleNodeGuesser, format_guess from guessit.patterns.properties import container import logging from guessit.patterns.containers import PropertiesContainer from guessit.patterns import sep from guessit.guess import Guess log = logging.getLogger(__name__) groups_container = PropertiesContainer() _allowed_groupname_pattern = r'[\w@#€£$&]' def _is_number(s): try: int(s) return True except ValueError: return False _forbidden_groupname_lambda = [lambda elt: elt in ['rip', 'by', 'for', 'par', 'pour', 'bonus'], lambda elt: _is_number(elt), ]