diff options
author | morpheus65535 <[email protected]> | 2018-10-06 13:18:55 -0400 |
---|---|---|
committer | morpheus65535 <[email protected]> | 2018-10-06 13:18:55 -0400 |
commit | c7866b3f114d6000caac6b118b337e0d8a9491fd (patch) | |
tree | 731780370ee824448c79ed261b4f4d02da877ea6 /libs/guessit | |
parent | 50b8a50a06fa27ee3d272f4d7b7ae3d4450a60a4 (diff) | |
download | bazarr-c7866b3f114d6000caac6b118b337e0d8a9491fd.tar.gz bazarr-c7866b3f114d6000caac6b118b337e0d8a9491fd.zip |
Moving back to GuessIt 2.1.4. Too many bugs in 3.0.0.
Diffstat (limited to 'libs/guessit')
63 files changed, 2454 insertions, 7989 deletions
diff --git a/libs/guessit/__init__.py b/libs/guessit/__init__.py index 365935eb0..22e9dbb07 100644 --- a/libs/guessit/__init__.py +++ b/libs/guessit/__init__.py @@ -5,6 +5,5 @@ Extracts as much information as possible from a video file. """ from .api import guessit, GuessItApi from .options import ConfigurationException -from .rules.common.quantity import Size from .__version__ import __version__ diff --git a/libs/guessit/__main__.py b/libs/guessit/__main__.py index 3b4e815fa..79c26617b 100644 --- a/libs/guessit/__main__.py +++ b/libs/guessit/__main__.py @@ -20,12 +20,6 @@ from guessit.jsonutils import GuessitEncoder from guessit.options import argument_parser, parse_options, load_config -try: - from collections import OrderedDict -except ImportError: # pragma: no-cover - from ordereddict import OrderedDict # pylint:disable=import-error - - def guess_filename(filename, options): """ Guess a single filename using given options @@ -51,7 +45,7 @@ def guess_filename(filename, options): import yaml from guessit import yamlutils - ystr = yaml.dump({filename: OrderedDict(guess)}, Dumper=yamlutils.CustomDumper, default_flow_style=False, + ystr = yaml.dump({filename: dict(guess)}, Dumper=yamlutils.CustomDumper, default_flow_style=False, allow_unicode=True) i = 0 for yline in ystr.splitlines(): diff --git a/libs/guessit/__version__.py b/libs/guessit/__version__.py index 4f64b2211..703c455a8 100644 --- a/libs/guessit/__version__.py +++ b/libs/guessit/__version__.py @@ -4,4 +4,4 @@ Version module """ # pragma: no cover -__version__ = '3.0.0' +__version__ = '2.1.4' diff --git a/libs/guessit/api.py b/libs/guessit/api.py index 555b8d865..3194af88a 100644 --- a/libs/guessit/api.py +++ b/libs/guessit/api.py @@ -3,13 +3,11 @@ """ API functions that can be used by external software """ - try: from collections import OrderedDict except ImportError: # pragma: no-cover from ordereddict import OrderedDict # pylint:disable=import-error -import os import traceback import six @@ -17,7 +15,7 @@ import six from rebulk.introspector import introspect from .rules import rebulk_builder -from .options import parse_options, load_config +from .options import parse_options from .__version__ import __version__ @@ -43,25 +41,12 @@ class GuessitException(Exception): self.options = options -def configure(options, rules_builder=rebulk_builder): - """ - Load rebulk rules according to advanced configuration in options dictionary. - - :param options: - :type options: dict - :param rules_builder: - :type rules_builder: - :return: - """ - default_api.configure(options, rules_builder=rules_builder, force=True) - - def guessit(string, options=None): """ Retrieves all matches from string as a dict :param string: the filename or release name :type string: str - :param options: + :param options: the filename or release name :type options: str|dict :return: :rtype: @@ -73,7 +58,7 @@ def properties(options=None): """ Retrieves all properties with possible values that can be guessed :param options: - :type options: str|dict + :type options: :return: :rtype: """ @@ -85,88 +70,53 @@ class GuessItApi(object): An api class that can be configured with custom Rebulk configuration. """ - def __init__(self): - """Default constructor.""" - self.rebulk = None + def __init__(self, rebulk): + """ + :param rebulk: Rebulk instance to use. + :type rebulk: Rebulk + :return: + :rtype: + """ + self.rebulk = rebulk - @classmethod - def _fix_encoding(cls, value): + @staticmethod + def _fix_option_encoding(value): if isinstance(value, list): - return [cls._fix_encoding(item) for item in value] - if isinstance(value, dict): - return {cls._fix_encoding(k): cls._fix_encoding(v) for k, v in value.items()} + return [GuessItApi._fix_option_encoding(item) for item in value] if six.PY2 and isinstance(value, six.text_type): - return value.encode('utf-8') + return value.encode("utf-8") if six.PY3 and isinstance(value, six.binary_type): return value.decode('ascii') return value - def configure(self, options, rules_builder=rebulk_builder, force=False): - """ - Load rebulk rules according to advanced configuration in options dictionary. - - :param options: - :type options: str|dict - :param rules_builder: - :type rules_builder: - :param force: - :return: - :rtype: dict - """ - options = parse_options(options, True) - should_load = force or not self.rebulk - advanced_config = options.pop('advanced_config', None) - - if should_load and not advanced_config: - advanced_config = load_config(options)['advanced_config'] - - options = self._fix_encoding(options) - - if should_load: - advanced_config = self._fix_encoding(advanced_config) - self.rebulk = rules_builder(advanced_config) - - return options - - def guessit(self, string, options=None): # pylint: disable=too-many-branches + def guessit(self, string, options=None): """ Retrieves all matches from string as a dict :param string: the filename or release name - :type string: str|Path - :param options: + :type string: str + :param options: the filename or release name :type options: str|dict :return: :rtype: """ try: - from pathlib import Path - if isinstance(string, Path): - try: - # Handle path-like object - string = os.fspath(string) - except AttributeError: - string = str(string) - except ImportError: - pass - - try: - options = self.configure(options) + options = parse_options(options, True) result_decode = False result_encode = False - if six.PY2: - if isinstance(string, six.text_type): - string = string.encode("utf-8") - result_decode = True - elif isinstance(string, six.binary_type): - string = six.binary_type(string) - if six.PY3: - if isinstance(string, six.binary_type): - string = string.decode('ascii') - result_encode = True - elif isinstance(string, six.text_type): - string = six.text_type(string) - + fixed_options = {} + for (key, value) in options.items(): + key = GuessItApi._fix_option_encoding(key) + value = GuessItApi._fix_option_encoding(value) + fixed_options[key] = value + options = fixed_options + + if six.PY2 and isinstance(string, six.text_type): + string = string.encode("utf-8") + result_decode = True + if six.PY3 and isinstance(string, six.binary_type): + string = string.decode('ascii') + result_encode = True matches = self.rebulk.matches(string, options) if result_decode: for match in matches: @@ -189,7 +139,6 @@ class GuessItApi(object): :return: :rtype: """ - options = self.configure(options) unordered = introspect(self.rebulk, options).properties ordered = OrderedDict() for k in sorted(unordered.keys(), key=six.text_type): @@ -199,4 +148,4 @@ class GuessItApi(object): return ordered -default_api = GuessItApi() +default_api = GuessItApi(rebulk_builder()) diff --git a/libs/guessit/config/options.json b/libs/guessit/config/options.json index 0fe274b16..11b477481 100644 --- a/libs/guessit/config/options.json +++ b/libs/guessit/config/options.json @@ -1,363 +1,5 @@ { "expected_title": [ "OSS 117" - ], - "allowed_countries": [ - "au", - "us", - "gb" - ], - "allowed_languages": [ - "de", - "en", - "es", - "ca", - "cs", - "fr", - "he", - "hi", - "hu", - "it", - "ja", - "ko", - "nl", - "pl", - "pt", - "ro", - "ru", - "sv", - "te", - "uk", - "mul", - "und" - ], - "advanced_config": { - "common_words": [ - "de", - "it" - ], - "groups": { - "starting": "([{", - "ending": ")]}" - }, - "container": { - "subtitles": [ - "srt", - "idx", - "sub", - "ssa", - "ass" - ], - "info": [ - "nfo" - ], - "videos": [ - "3g2", - "3gp", - "3gp2", - "asf", - "avi", - "divx", - "flv", - "m4v", - "mk2", - "mka", - "mkv", - "mov", - "mp4", - "mp4a", - "mpeg", - "mpg", - "ogg", - "ogm", - "ogv", - "qt", - "ra", - "ram", - "rm", - "ts", - "wav", - "webm", - "wma", - "wmv", - "iso", - "vob" - ], - "torrent": [ - "torrent" - ], - "nzb": [ - "nzb" - ] - }, - "country": { - "synonyms": { - "ES": [ - "españa" - ], - "GB": [ - "UK" - ], - "BR": [ - "brazilian", - "bra" - ], - "CA": [ - "québec", - "quebec", - "qc" - ], - "MX": [ - "Latinoamérica", - "latin america" - ] - } - }, - "episodes": { - "season_max_range": 100, - "episode_max_range": 100, - "max_range_gap": 1, - "season_markers": [ - "s" - ], - "season_ep_markers": [ - "x" - ], - "disc_markers": [ - "d" - ], - "episode_markers": [ - "xe", - "ex", - "ep", - "e", - "x" - ], - "range_separators": [ - "-", - "~", - "to", - "a" - ], - "discrete_separators": [ - "+", - "&", - "and", - "et" - ], - "season_words": [ - "season", - "saison", - "seizoen", - "serie", - "seasons", - "saisons", - "series", - "tem", - "temp", - "temporada", - "temporadas", - "stagione" - ], - "episode_words": [ - "episode", - "episodes", - "eps", - "ep", - "episodio", - "episodios", - "capitulo", - "capitulos" - ], - "of_words": [ - "of", - "sur" - ], - "all_words": [ - "All" - ] - }, - "language": { - "synonyms": { - "ell": [ - "gr", - "greek" - ], - "spa": [ - "esp", - "español", - "espanol" - ], - "fra": [ - "français", - "vf", - "vff", - "vfi", - "vfq" - ], - "swe": [ - "se" - ], - "por_BR": [ - "po", - "pb", - "pob", - "ptbr", - "br", - "brazilian" - ], - "deu_CH": [ - "swissgerman", - "swiss german" - ], - "nld_BE": [ - "flemish" - ], - "cat": [ - "català", - "castellano", - "espanol castellano", - "español castellano" - ], - "ces": [ - "cz" - ], - "ukr": [ - "ua" - ], - "zho": [ - "cn" - ], - "jpn": [ - "jp" - ], - "hrv": [ - "scr" - ], - "mul": [ - "multi", - "dl" - ] - }, - "subtitle_affixes": [ - "sub", - "subs", - "esub", - "esubs", - "subbed", - "custom subbed", - "custom subs", - "custom sub", - "customsubbed", - "customsubs", - "customsub", - "soft subtitles", - "soft subs" - ], - "subtitle_prefixes": [ - "st", - "v", - "vost", - "subforced", - "fansub", - "hardsub", - "legenda", - "legendas", - "legendado", - "subtitulado", - "soft", - "subtitles" - ], - "subtitle_suffixes": [ - "subforced", - "fansub", - "hardsub" - ], - "language_affixes": [ - "dublado", - "dubbed", - "dub" - ], - "language_prefixes": [ - "true" - ], - "language_suffixes": [ - "audio" - ], - "weak_affixes": [ - "v", - "audio", - "true" - ] - }, - "part": { - "prefixes": [ - "pt", - "part" - ] - }, - "release_group": { - "forbidden_names": [ - "rip", - "by", - "for", - "par", - "pour", - "bonus" - ], - "ignored_seps": "[]{}()" - }, - "screen_size": { - "frame_rates": [ - "23.976", - "24", - "25", - "30", - "48", - "50", - "60", - "120" - ], - "min_ar": 1.333, - "max_ar": 1.898, - "interlaced": [ - "360", - "480", - "576", - "900", - "1080" - ], - "progressive": [ - "360", - "480", - "576", - "900", - "1080", - "368", - "720", - "1440", - "2160", - "4320" - ] - }, - "website": { - "safe_tlds": [ - "com", - "org", - "net" - ], - "safe_subdomains": [ - "www" - ], - "safe_prefixes": [ - "co", - "com", - "org", - "net" - ], - "prefixes": [ - "from" - ] - } - } + ] }
\ No newline at end of file diff --git a/libs/guessit/jsonutils.py b/libs/guessit/jsonutils.py index a8bb24e6e..7d6ff7055 100644 --- a/libs/guessit/jsonutils.py +++ b/libs/guessit/jsonutils.py @@ -4,9 +4,6 @@ JSON Utils """ import json - -from six import text_type - try: from collections import OrderedDict except ImportError: # pragma: no-cover @@ -30,6 +27,6 @@ class GuessitEncoder(json.JSONEncoder): ret['end'] = o.end return ret elif hasattr(o, 'name'): # Babelfish languages/countries long name - return text_type(o.name) + return str(o.name) else: # pragma: no cover - return text_type(o) + return str(o) diff --git a/libs/guessit/options.py b/libs/guessit/options.py index e39df3650..fcf39e8a7 100644 --- a/libs/guessit/options.py +++ b/libs/guessit/options.py @@ -42,10 +42,6 @@ def build_argument_parser(): help='Expected title to parse (can be used multiple times)') naming_opts.add_argument('-G', '--expected-group', action='append', dest='expected_group', default=None, help='Expected release group (can be used multiple times)') - naming_opts.add_argument('--includes', action='append', dest='includes', default=None, - help='List of properties to be detected') - naming_opts.add_argument('--excludes', action='append', dest='excludes', default=None, - help='List of properties to be ignored') input_opts = opts.add_argument_group("Input") input_opts.add_argument('-f', '--input-file', dest='input_file', default=None, @@ -96,7 +92,7 @@ def parse_options(options=None, api=False): :param options: :type options: :param api - :type api: boolean + :type boolean :return: :rtype: """ @@ -161,12 +157,10 @@ def load_config(options): if config_file_options: configurations.append(config_file_options) - embedded_options_data = pkgutil.get_data('guessit', 'config/options.json').decode("utf-8") - embedded_options = json.loads(embedded_options_data) if not options.get('no_embedded_config'): + embedded_options_data = pkgutil.get_data('guessit', 'config/options.json').decode("utf-8") + embedded_options = json.loads(embedded_options_data) configurations.append(embedded_options) - else: - configurations.append({'advanced_config': embedded_options['advanced_config']}) if configurations: configurations.append(options) diff --git a/libs/guessit/rules/__init__.py b/libs/guessit/rules/__init__.py index f16bc4e0f..d01bc6b28 100644 --- a/libs/guessit/rules/__init__.py +++ b/libs/guessit/rules/__init__.py @@ -10,7 +10,7 @@ from .markers.groups import groups from .properties.episodes import episodes from .properties.container import container -from .properties.source import source +from .properties.format import format_ from .properties.video_codec import video_codec from .properties.audio_codec import audio_codec from .properties.screen_size import screen_size @@ -24,7 +24,6 @@ from .properties.release_group import release_group from .properties.streaming_service import streaming_service from .properties.other import other from .properties.size import size -from .properties.bit_rate import bit_rate from .properties.edition import edition from .properties.cds import cds from .properties.bonus import bonus @@ -37,50 +36,44 @@ from .properties.type import type_ from .processors import processors -def rebulk_builder(config): +def rebulk_builder(): """ Default builder for main Rebulk object used by api. :return: Main Rebulk object :rtype: Rebulk """ - def _config(name): - return config.get(name, {}) - rebulk = Rebulk() - common_words = frozenset(_config('common_words')) - - rebulk.rebulk(path(_config('path'))) - rebulk.rebulk(groups(_config('groups'))) - - rebulk.rebulk(episodes(_config('episodes'))) - rebulk.rebulk(container(_config('container'))) - rebulk.rebulk(source(_config('source'))) - rebulk.rebulk(video_codec(_config('video_codec'))) - rebulk.rebulk(audio_codec(_config('audio_codec'))) - rebulk.rebulk(screen_size(_config('screen_size'))) - rebulk.rebulk(website(_config('website'))) - rebulk.rebulk(date(_config('date'))) - rebulk.rebulk(title(_config('title'))) - rebulk.rebulk(episode_title(_config('episode_title'))) - rebulk.rebulk(language(_config('language'), common_words)) - rebulk.rebulk(country(_config('country'), common_words)) - rebulk.rebulk(release_group(_config('release_group'))) - rebulk.rebulk(streaming_service(_config('streaming_service'))) - rebulk.rebulk(other(_config('other'))) - rebulk.rebulk(size(_config('size'))) - rebulk.rebulk(bit_rate(_config('bit_rate'))) - rebulk.rebulk(edition(_config('edition'))) - rebulk.rebulk(cds(_config('cds'))) - rebulk.rebulk(bonus(_config('bonus'))) - rebulk.rebulk(film(_config('film'))) - rebulk.rebulk(part(_config('part'))) - rebulk.rebulk(crc(_config('crc'))) - - rebulk.rebulk(processors(_config('processors'))) - - rebulk.rebulk(mimetype(_config('mimetype'))) - rebulk.rebulk(type_(_config('type'))) + rebulk.rebulk(path()) + rebulk.rebulk(groups()) + + rebulk.rebulk(episodes()) + rebulk.rebulk(container()) + rebulk.rebulk(format_()) + rebulk.rebulk(video_codec()) + rebulk.rebulk(audio_codec()) + rebulk.rebulk(screen_size()) + rebulk.rebulk(website()) + rebulk.rebulk(date()) + rebulk.rebulk(title()) + rebulk.rebulk(episode_title()) + rebulk.rebulk(language()) + rebulk.rebulk(country()) + rebulk.rebulk(release_group()) + rebulk.rebulk(streaming_service()) + rebulk.rebulk(other()) + rebulk.rebulk(size()) + rebulk.rebulk(edition()) + rebulk.rebulk(cds()) + rebulk.rebulk(bonus()) + rebulk.rebulk(film()) + rebulk.rebulk(part()) + rebulk.rebulk(crc()) + + rebulk.rebulk(processors()) + + rebulk.rebulk(mimetype()) + rebulk.rebulk(type_()) def customize_properties(properties): """ diff --git a/libs/guessit/rules/common/comparators.py b/libs/guessit/rules/common/comparators.py index f46f0c119..ee104ba68 100644 --- a/libs/guessit/rules/common/comparators.py +++ b/libs/guessit/rules/common/comparators.py @@ -13,12 +13,9 @@ def marker_comparator_predicate(match): """ Match predicate used in comparator """ - return ( - not match.private - and match.name not in ('proper_count', 'title') - and not (match.name == 'container' and 'extension' in match.tags) - and not (match.name == 'other' and match.value == 'Rip') - ) + return not match.private and \ + match.name not in ['proper_count', 'title', 'episode_title', 'alternative_title'] and \ + not (match.name == 'container' and 'extension' in match.tags) def marker_weight(matches, marker, predicate): @@ -53,8 +50,9 @@ def marker_comparator(matches, markers, predicate): matches_count = marker_weight(matches, marker2, predicate) - marker_weight(matches, marker1, predicate) if matches_count: return matches_count - - # give preference to rightmost path + len_diff = len(marker2) - len(marker1) + if len_diff: + return len_diff return markers.index(marker2) - markers.index(marker1) return comparator diff --git a/libs/guessit/rules/common/date.py b/libs/guessit/rules/common/date.py index cef31fdcd..d6fb523a1 100644 --- a/libs/guessit/rules/common/date.py +++ b/libs/guessit/rules/common/date.py @@ -42,7 +42,7 @@ def _is_int(string): return False -def _guess_day_first_parameter(groups): # pylint:disable=inconsistent-return-statements +def _guess_day_first_parameter(groups): """ If day_first is not defined, use some heuristic to fix it. It helps to solve issues with python dateutils 2.5.3 parser changes. @@ -67,7 +67,7 @@ def _guess_day_first_parameter(groups): # pylint:disable=inconsistent-return-st return True -def search_date(string, year_first=None, day_first=None): # pylint:disable=inconsistent-return-statements +def search_date(string, year_first=None, day_first=None): """Looks for date patterns, and if found return the date and group span. Assumes there are sentinels at the beginning and end of the string that diff --git a/libs/guessit/rules/common/pattern.py b/libs/guessit/rules/common/pattern.py deleted file mode 100644 index 5f560f2c9..000000000 --- a/libs/guessit/rules/common/pattern.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -Pattern utility functions -""" - - -def is_disabled(context, name): - """Whether a specific pattern is disabled. - - The context object might define an inclusion list (includes) or an exclusion list (excludes) - A pattern is considered disabled if it's found in the exclusion list or - it's not found in the inclusion list and the inclusion list is not empty or not defined. - - :param context: - :param name: - :return: - """ - if not context: - return False - - excludes = context.get('excludes') - if excludes and name in excludes: - return True - - includes = context.get('includes') - return includes and name not in includes diff --git a/libs/guessit/rules/common/quantity.py b/libs/guessit/rules/common/quantity.py deleted file mode 100644 index bbd41fbb9..000000000 --- a/libs/guessit/rules/common/quantity.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -Quantities: Size -""" -import re -from abc import abstractmethod - -import six - -from ..common import seps - - -class Quantity(object): - """ - Represent a quantity object with magnitude and units. - """ - - parser_re = re.compile(r'(?P<magnitude>\d+(?:[.]\d+)?)(?P<units>[^\d]+)?') - - def __init__(self, magnitude, units): - self.magnitude = magnitude - self.units = units - - @classmethod - @abstractmethod - def parse_units(cls, value): - """ - Parse a string to a proper unit notation. - """ - raise NotImplementedError - - @classmethod - def fromstring(cls, string): - """ - Parse the string into a quantity object. - :param string: - :return: - """ - values = cls.parser_re.match(string).groupdict() - try: - magnitude = int(values['magnitude']) - except ValueError: - magnitude = float(values['magnitude']) - units = cls.parse_units(values['units']) - - return cls(magnitude, units) - - def __hash__(self): - return hash(str(self)) - - def __eq__(self, other): - if isinstance(other, six.string_types): - return str(self) == other - if not isinstance(other, self.__class__): - return NotImplemented - return self.magnitude == other.magnitude and self.units == other.units - - def __ne__(self, other): - return not self == other - - def __repr__(self): - return '<{0} [{1}]>'.format(self.__class__.__name__, self) - - def __str__(self): - return '{0}{1}'.format(self.magnitude, self.units) - - -class Size(Quantity): - """ - Represent size. - - e.g.: 1.1GB, 300MB - """ - - @classmethod - def parse_units(cls, value): - return value.strip(seps).upper() - - -class BitRate(Quantity): - """ - Represent bit rate. - - e.g.: 320Kbps, 1.5Mbps - """ - - @classmethod - def parse_units(cls, value): - value = value.strip(seps).capitalize() - for token in ('bits', 'bit'): - value = value.replace(token, 'bps') - - return value - - -class FrameRate(Quantity): - """ - Represent frame rate. - - e.g.: 24fps, 60fps - """ - - @classmethod - def parse_units(cls, value): - return 'fps' diff --git a/libs/guessit/rules/common/words.py b/libs/guessit/rules/common/words.py index cccbc7d23..8882acb3d 100644 --- a/libs/guessit/rules/common/words.py +++ b/libs/guessit/rules/common/words.py @@ -32,3 +32,48 @@ def iter_words(string): i += 1 if inside_word: yield _Word(span=(last_sep_index+1, i), value=string[last_sep_index+1:i]) + + +# list of common words which could be interpreted as properties, but which +# are far too common to be able to say they represent a property in the +# middle of a string (where they most likely carry their commmon meaning) +COMMON_WORDS = frozenset([ + # english words + 'is', 'it', 'am', 'mad', 'men', 'man', 'run', 'sin', 'st', 'to', + 'no', 'non', 'war', 'min', 'new', 'car', 'day', 'bad', 'bat', 'fan', + 'fry', 'cop', 'zen', 'gay', 'fat', 'one', 'cherokee', 'got', 'an', 'as', + 'cat', 'her', 'be', 'hat', 'sun', 'may', 'my', 'mr', 'rum', 'pi', 'bb', + 'bt', 'tv', 'aw', 'by', 'md', 'mp', 'cd', 'lt', 'gt', 'in', 'ad', 'ice', + 'ay', 'at', 'star', 'so', 'he', 'do', 'ax', 'mx', + # french words + 'bas', 'de', 'le', 'son', 'ne', 'ca', 'ce', 'et', 'que', + 'mal', 'est', 'vol', 'or', 'mon', 'se', 'je', 'tu', 'me', + 'ne', 'ma', 'va', 'au', 'lu', + # japanese words, + 'wa', 'ga', 'ao', + # spanish words + 'la', 'el', 'del', 'por', 'mar', 'al', + # italian words + 'un', + # other + 'ind', 'arw', 'ts', 'ii', 'bin', 'chan', 'ss', 'san', 'oss', 'iii', + 'vi', 'ben', 'da', 'lt', 'ch', 'sr', 'ps', 'cx', 'vo', + # new from babelfish + 'mkv', 'avi', 'dmd', 'the', 'dis', 'cut', 'stv', 'des', 'dia', 'and', + 'cab', 'sub', 'mia', 'rim', 'las', 'une', 'par', 'srt', 'ano', 'toy', + 'job', 'gag', 'reel', 'www', 'for', 'ayu', 'csi', 'ren', 'moi', 'sur', + 'fer', 'fun', 'two', 'big', 'psy', 'air', + # movie title + 'brazil', 'jordan', + # release groups + 'bs', # Bosnian + 'kz', + # countries + 'gt', 'lt', 'im', + # part/pt + 'pt', + # screener + 'scr', + # quality + 'sd', 'hr' +]) diff --git a/libs/guessit/rules/markers/groups.py b/libs/guessit/rules/markers/groups.py index 4716d15d7..bbe69d1c3 100644 --- a/libs/guessit/rules/markers/groups.py +++ b/libs/guessit/rules/markers/groups.py @@ -6,20 +6,17 @@ Groups markers (...), [...] and {...} from rebulk import Rebulk -def groups(config): +def groups(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ rebulk = Rebulk() rebulk.defaults(name="group", marker=True) - starting = config['starting'] - ending = config['ending'] + starting = '([{' + ending = ')]}' def mark_groups(input_string): """ diff --git a/libs/guessit/rules/markers/path.py b/libs/guessit/rules/markers/path.py index 6d993b75a..5e487ea6b 100644 --- a/libs/guessit/rules/markers/path.py +++ b/libs/guessit/rules/markers/path.py @@ -8,12 +8,9 @@ from rebulk import Rebulk from rebulk.utils import find_all -def path(config): # pylint:disable=unused-argument +def path(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ @@ -25,7 +22,6 @@ def path(config): # pylint:disable=unused-argument Functional pattern to mark path elements. :param input_string: - :param context: :return: """ ret = [] diff --git a/libs/guessit/rules/processors.py b/libs/guessit/rules/processors.py index 6f5d731f6..0f21d0835 100644 --- a/libs/guessit/rules/processors.py +++ b/libs/guessit/rules/processors.py @@ -34,7 +34,8 @@ class EnlargeGroupMatches(CustomRule): for match in matches.ending(group.end - 1): ending.append(match) - return starting, ending + if starting or ending: + return starting, ending def then(self, matches, when_response, context): starting, ending = when_response @@ -225,12 +226,9 @@ class StripSeparators(CustomRule): match.raw_end -= 1 -def processors(config): # pylint:disable=unused-argument +def processors(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ diff --git a/libs/guessit/rules/properties/audio_codec.py b/libs/guessit/rules/properties/audio_codec.py index a1cf585e0..922df9289 100644 --- a/libs/guessit/rules/properties/audio_codec.py +++ b/libs/guessit/rules/properties/audio_codec.py @@ -6,20 +6,15 @@ audio_codec, audio_profile and audio_channels property from rebulk.remodule import re from rebulk import Rebulk, Rule, RemoveMatch - from ..common import dash -from ..common.pattern import is_disabled from ..common.validators import seps_before, seps_after audio_properties = ['audio_codec', 'audio_profile', 'audio_channels'] -def audio_codec(config): # pylint:disable=unused-argument +def audio_codec(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ @@ -41,38 +36,28 @@ def audio_codec(config): # pylint:disable=unused-argument return match1 return '__default__' - rebulk.defaults(name='audio_codec', - conflict_solver=audio_codec_priority, - disabled=lambda context: is_disabled(context, 'audio_codec')) + rebulk.defaults(name="audio_codec", conflict_solver=audio_codec_priority) rebulk.regex("MP3", "LAME", r"LAME(?:\d)+-?(?:\d)+", value="MP3") - rebulk.regex('Dolby', 'DolbyDigital', 'Dolby-Digital', 'DD', 'AC3D?', value='Dolby Digital') - rebulk.regex('Dolby-?Atmos', 'Atmos', value='Dolby Atmos') + rebulk.regex('Dolby', 'DolbyDigital', 'Dolby-Digital', 'DD', 'AC3D?', value='AC3') + rebulk.regex("DolbyAtmos", "Dolby-Atmos", "Atmos", value="DolbyAtmos") rebulk.string("AAC", value="AAC") - rebulk.string('EAC3', 'DDP', 'DD+', value='Dolby Digital Plus') + rebulk.string('EAC3', 'DDP', 'DD+', value="EAC3") rebulk.string("Flac", value="FLAC") rebulk.string("DTS", value="DTS") - rebulk.regex('DTS-?HD', 'DTS(?=-?MA)', value='DTS-HD', - conflict_solver=lambda match, other: other if other.name == 'audio_codec' else '__default__') - rebulk.regex('True-?HD', value='Dolby TrueHD') - rebulk.string('Opus', value='Opus') - rebulk.string('Vorbis', value='Vorbis') - rebulk.string('PCM', value='PCM') - rebulk.string('LPCM', value='LPCM') - - rebulk.defaults(name='audio_profile', disabled=lambda context: is_disabled(context, 'audio_profile')) - rebulk.string('MA', value='Master Audio', tags='DTS-HD') - rebulk.string('HR', 'HRA', value='High Resolution Audio', tags='DTS-HD') - rebulk.string('ES', value='Extended Surround', tags='DTS') - rebulk.string('HE', value='High Efficiency', tags='AAC') - rebulk.string('LC', value='Low Complexity', tags='AAC') - rebulk.string('HQ', value='High Quality', tags='Dolby Digital') - rebulk.string('EX', value='EX', tags='Dolby Digital') - - rebulk.defaults(name="audio_channels", disabled=lambda context: is_disabled(context, 'audio_channels')) - rebulk.regex(r'(7[\W_][01](?:ch)?)(?=[^\d]|$)', value='7.1', children=True) - rebulk.regex(r'(5[\W_][01](?:ch)?)(?=[^\d]|$)', value='5.1', children=True) - rebulk.regex(r'(2[\W_]0(?:ch)?)(?=[^\d]|$)', value='2.0', children=True) + rebulk.regex("True-?HD", value="TrueHD") + + rebulk.defaults(name="audio_profile") + rebulk.string("HD", value="HD", tags="DTS") + rebulk.regex("HD-?MA", value="HDMA", tags="DTS") + rebulk.string("HE", value="HE", tags="AAC") + rebulk.string("LC", value="LC", tags="AAC") + rebulk.string("HQ", value="HQ", tags="AC3") + + rebulk.defaults(name="audio_channels") + rebulk.regex(r'(7[\W_][01](?:ch)?)(?:[^\d]|$)', value='7.1', children=True) + rebulk.regex(r'(5[\W_][01](?:ch)?)(?:[^\d]|$)', value='5.1', children=True) + rebulk.regex(r'(2[\W_]0(?:ch)?)(?:[^\d]|$)', value='2.0', children=True) rebulk.regex('7[01]', value='7.1', validator=seps_after, tags='weak-audio_channels') rebulk.regex('5[01]', value='5.1', validator=seps_after, tags='weak-audio_channels') rebulk.string('20', value='2.0', validator=seps_after, tags='weak-audio_channels') @@ -81,7 +66,7 @@ def audio_codec(config): # pylint:disable=unused-argument rebulk.string('2ch', 'stereo', value='2.0') rebulk.string('1ch', 'mono', value='1.0') - rebulk.rules(DtsHDRule, AacRule, DolbyDigitalRule, AudioValidatorRule, HqConflictRule, AudioChannelsValidatorRule) + rebulk.rules(DtsRule, AacRule, Ac3Rule, AudioValidatorRule, HqConflictRule, AudioChannelsValidatorRule) return rebulk @@ -126,9 +111,6 @@ class AudioProfileRule(Rule): super(AudioProfileRule, self).__init__() self.codec = codec - def enabled(self, context): - return not is_disabled(context, 'audio_profile') - def when(self, matches, context): profile_list = matches.named('audio_profile', lambda match: self.codec in match.tags) ret = [] @@ -138,18 +120,16 @@ class AudioProfileRule(Rule): codec = matches.next(profile, lambda match: match.name == 'audio_codec' and match.value == self.codec) if not codec: ret.append(profile) - if codec: - ret.extend(matches.conflicting(profile)) return ret -class DtsHDRule(AudioProfileRule): +class DtsRule(AudioProfileRule): """ - Rule to validate DTS-HD profile + Rule to validate DTS profile """ def __init__(self): - super(DtsHDRule, self).__init__('DTS-HD') + super(DtsRule, self).__init__("DTS") class AacRule(AudioProfileRule): @@ -161,13 +141,13 @@ class AacRule(AudioProfileRule): super(AacRule, self).__init__("AAC") -class DolbyDigitalRule(AudioProfileRule): +class Ac3Rule(AudioProfileRule): """ - Rule to validate Dolby Digital profile + Rule to validate AC3 profile """ def __init__(self): - super(DolbyDigitalRule, self).__init__('Dolby Digital') + super(Ac3Rule, self).__init__("AC3") class HqConflictRule(Rule): @@ -175,16 +155,16 @@ class HqConflictRule(Rule): Solve conflict between HQ from other property and from audio_profile. """ - dependency = [DtsHDRule, AacRule, DolbyDigitalRule] + dependency = [DtsRule, AacRule, Ac3Rule] consequence = RemoveMatch - def enabled(self, context): - return not is_disabled(context, 'audio_profile') - def when(self, matches, context): - hq_audio = matches.named('audio_profile', lambda m: m.value == 'High Quality') + hq_audio = matches.named('audio_profile', lambda match: match.value == 'HQ') hq_audio_spans = [match.span for match in hq_audio] - return matches.named('other', lambda m: m.span in hq_audio_spans) + hq_other = matches.named('other', lambda match: match.span in hq_audio_spans) + + if hq_other: + return hq_other class AudioChannelsValidatorRule(Rule): @@ -194,9 +174,6 @@ class AudioChannelsValidatorRule(Rule): priority = 128 consequence = RemoveMatch - def enabled(self, context): - return not is_disabled(context, 'audio_channels') - def when(self, matches, context): ret = [] diff --git a/libs/guessit/rules/properties/bit_rate.py b/libs/guessit/rules/properties/bit_rate.py deleted file mode 100644 index 391f1d2fc..000000000 --- a/libs/guessit/rules/properties/bit_rate.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -video_bit_rate and audio_bit_rate properties -""" -import re - -from rebulk import Rebulk -from rebulk.rules import Rule, RemoveMatch, RenameMatch - -from ..common import dash, seps -from ..common.pattern import is_disabled -from ..common.quantity import BitRate -from ..common.validators import seps_surround - - -def bit_rate(config): # pylint:disable=unused-argument - """ - Builder for rebulk object. - - :param config: rule configuration - :type config: dict - :return: Created Rebulk object - :rtype: Rebulk - """ - rebulk = Rebulk(disabled=lambda context: (is_disabled(context, 'audio_bit_rate') - and is_disabled(context, 'video_bit_rate'))) - rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) - rebulk.defaults(name='audio_bit_rate', validator=seps_surround) - rebulk.regex(r'\d+-?[kmg]b(ps|its?)', r'\d+\.\d+-?[kmg]b(ps|its?)', - conflict_solver=( - lambda match, other: match - if other.name == 'audio_channels' and 'weak-audio_channels' not in other.tags - else other - ), - formatter=BitRate.fromstring, tags=['release-group-prefix']) - - rebulk.rules(BitRateTypeRule) - - return rebulk - - -class BitRateTypeRule(Rule): - """ - Convert audio bit rate guess into video bit rate. - """ - consequence = [RenameMatch('video_bit_rate'), RemoveMatch] - - def when(self, matches, context): - to_rename = [] - to_remove = [] - - if is_disabled(context, 'audio_bit_rate'): - to_remove.extend(matches.named('audio_bit_rate')) - else: - video_bit_rate_disabled = is_disabled(context, 'video_bit_rate') - for match in matches.named('audio_bit_rate'): - previous = matches.previous(match, index=0, - predicate=lambda m: m.name in ('source', 'screen_size', 'video_codec')) - if previous and not matches.holes(previous.end, match.start, predicate=lambda m: m.value.strip(seps)): - after = matches.next(match, index=0, predicate=lambda m: m.name == 'audio_codec') - if after and not matches.holes(match.end, after.start, predicate=lambda m: m.value.strip(seps)): - bitrate = match.value - if bitrate.units == 'Kbps' or (bitrate.units == 'Mbps' and bitrate.magnitude < 10): - continue - - if video_bit_rate_disabled: - to_remove.append(match) - else: - to_rename.append(match) - - return to_rename, to_remove diff --git a/libs/guessit/rules/properties/bonus.py b/libs/guessit/rules/properties/bonus.py index c4554cd06..e37613e9d 100644 --- a/libs/guessit/rules/properties/bonus.py +++ b/libs/guessit/rules/properties/bonus.py @@ -9,26 +9,21 @@ from rebulk import Rebulk, AppendMatch, Rule from .title import TitleFromPosition from ..common.formatters import cleanup -from ..common.pattern import is_disabled from ..common.validators import seps_surround -def bonus(config): # pylint:disable=unused-argument +def bonus(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'bonus')) - rebulk = rebulk.regex_defaults(flags=re.IGNORECASE) + rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE) rebulk.regex(r'x(\d+)', name='bonus', private_parent=True, children=True, formatter=int, validator={'__parent__': lambda match: seps_surround}, conflict_solver=lambda match, conflicting: match - if conflicting.name in ('video_codec', 'episode') and 'weak-episode' not in conflicting.tags + if conflicting.name in ['video_codec', 'episode'] and 'bonus-conflict' not in conflicting.tags else '__default__') rebulk.rules(BonusTitleRule) @@ -45,7 +40,7 @@ class BonusTitleRule(Rule): properties = {'bonus_title': [None]} - def when(self, matches, context): # pylint:disable=inconsistent-return-statements + def when(self, matches, context): bonus_number = matches.named('bonus', lambda match: not match.private, index=0) if bonus_number: filepath = matches.markers.at_match(bonus_number, lambda marker: marker.name == 'path', 0) diff --git a/libs/guessit/rules/properties/cds.py b/libs/guessit/rules/properties/cds.py index 873df6fef..db1407d65 100644 --- a/libs/guessit/rules/properties/cds.py +++ b/libs/guessit/rules/properties/cds.py @@ -6,22 +6,16 @@ cd and cd_count properties from rebulk.remodule import re from rebulk import Rebulk - from ..common import dash -from ..common.pattern import is_disabled -def cds(config): # pylint:disable=unused-argument +def cds(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'cd')) - rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) + rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) rebulk.regex(r'cd-?(?P<cd>\d+)(?:-?of-?(?P<cd_count>\d+))?', validator={'cd': lambda match: 0 < match.value < 100, diff --git a/libs/guessit/rules/properties/container.py b/libs/guessit/rules/properties/container.py index 77599509a..52889e143 100644 --- a/libs/guessit/rules/properties/container.py +++ b/libs/guessit/rules/properties/container.py @@ -8,35 +8,33 @@ from rebulk.remodule import re from rebulk import Rebulk from ..common import seps -from ..common.pattern import is_disabled from ..common.validators import seps_surround from ...reutils import build_or_pattern -def container(config): +def container(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'container')) - rebulk = rebulk.regex_defaults(flags=re.IGNORECASE).string_defaults(ignore_case=True) + rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE).string_defaults(ignore_case=True) rebulk.defaults(name='container', formatter=lambda value: value.strip(seps), tags=['extension'], conflict_solver=lambda match, other: other - if other.name in ('source', 'video_codec') or + if other.name in ['format', 'video_codec'] or other.name == 'container' and 'extension' not in other.tags else '__default__') - subtitles = config['subtitles'] - info = config['info'] - videos = config['videos'] - torrent = config['torrent'] - nzb = config['nzb'] + subtitles = ['srt', 'idx', 'sub', 'ssa', 'ass'] + info = ['nfo'] + videos = ['3g2', '3gp', '3gp2', 'asf', 'avi', 'divx', 'flv', 'm4v', 'mk2', + 'mka', 'mkv', 'mov', 'mp4', 'mp4a', 'mpeg', 'mpg', 'ogg', 'ogm', + 'ogv', 'qt', 'ra', 'ram', 'rm', 'ts', 'wav', 'webm', 'wma', 'wmv', + 'iso', 'vob'] + torrent = ['torrent'] + nzb = ['nzb'] rebulk.regex(r'\.'+build_or_pattern(subtitles)+'$', exts=subtitles, tags=['extension', 'subtitle']) rebulk.regex(r'\.'+build_or_pattern(info)+'$', exts=info, tags=['extension', 'info']) @@ -48,11 +46,11 @@ def container(config): validator=seps_surround, formatter=lambda s: s.lower(), conflict_solver=lambda match, other: match - if other.name in ('source', - 'video_codec') or other.name == 'container' and 'extension' in other.tags + if other.name in ['format', + 'video_codec'] or other.name == 'container' and 'extension' in other.tags else '__default__') - rebulk.string(*[sub for sub in subtitles if sub not in ('sub', 'ass')], tags=['subtitle']) + rebulk.string(*[sub for sub in subtitles if sub not in ['sub']], tags=['subtitle']) rebulk.string(*videos, tags=['video']) rebulk.string(*torrent, tags=['torrent']) rebulk.string(*nzb, tags=['nzb']) diff --git a/libs/guessit/rules/properties/country.py b/libs/guessit/rules/properties/country.py index 138c80a26..5b390df06 100644 --- a/libs/guessit/rules/properties/country.py +++ b/libs/guessit/rules/properties/country.py @@ -7,50 +7,41 @@ country property import babelfish from rebulk import Rebulk -from ..common.pattern import is_disabled -from ..common.words import iter_words +from ..common.words import COMMON_WORDS, iter_words -def country(config, common_words): +def country(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict - :param common_words: common words - :type common_words: set :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'country')) - rebulk = rebulk.defaults(name='country') - - def find_countries(string, context=None): - """ - Find countries in given string. - """ - allowed_countries = context.get('allowed_countries') if context else None - return CountryFinder(allowed_countries, common_words).find(string) + rebulk = Rebulk().defaults(name='country') rebulk.functional(find_countries, # Prefer language and any other property over country if not US or GB. conflict_solver=lambda match, other: match - if other.name != 'language' or match.value not in (babelfish.Country('US'), - babelfish.Country('GB')) + if other.name != 'language' or match.value not in [babelfish.Country('US'), + babelfish.Country('GB')] else other, - properties={'country': [None]}, - disabled=lambda context: not context.get('allowed_countries')) - - babelfish.country_converters['guessit'] = GuessitCountryConverter(config['synonyms']) + properties={'country': [None]}) return rebulk +COUNTRIES_SYN = {'ES': ['españa'], + 'GB': ['UK'], + 'BR': ['brazilian', 'bra'], + 'CA': ['québec', 'quebec', 'qc'], + # FIXME: this one is a bit of a stretch, not sure how to do it properly, though... + 'MX': ['Latinoamérica', 'latin america']} + + class GuessitCountryConverter(babelfish.CountryReverseConverter): # pylint: disable=missing-docstring - def __init__(self, synonyms): + def __init__(self): self.guessit_exceptions = {} - for alpha2, synlist in synonyms.items(): + for alpha2, synlist in COUNTRIES_SYN.items(): for syn in synlist: self.guessit_exceptions[syn.lower()] = alpha2 @@ -87,28 +78,32 @@ class GuessitCountryConverter(babelfish.CountryReverseConverter): # pylint: dis raise babelfish.CountryReverseError(name) -class CountryFinder(object): - """Helper class to search and return country matches.""" +babelfish.country_converters['guessit'] = GuessitCountryConverter() + - def __init__(self, allowed_countries, common_words): - self.allowed_countries = set([l.lower() for l in allowed_countries or []]) - self.common_words = common_words +def is_allowed_country(country_object, context=None): + """ + Check if country is allowed. + """ + if context and context.get('allowed_countries'): + allowed_countries = context.get('allowed_countries') + return country_object.name.lower() in allowed_countries or country_object.alpha2.lower() in allowed_countries + return True - def find(self, string): - """Return all matches for country.""" - for word_match in iter_words(string.strip().lower()): - word = word_match.value - if word.lower() in self.common_words: - continue - try: - country_object = babelfish.Country.fromguessit(word) - if (country_object.name.lower() in self.allowed_countries or - country_object.alpha2.lower() in self.allowed_countries): - yield self._to_rebulk_match(word_match, country_object) - except babelfish.Error: - continue - - @classmethod - def _to_rebulk_match(cls, word, value): - return word.span[0], word.span[1], {'value': value} +def find_countries(string, context=None): + """ + Find countries in given string. + """ + ret = [] + for word_match in iter_words(string.strip().lower()): + word = word_match.value + if word.lower() in COMMON_WORDS: + continue + try: + country_object = babelfish.Country.fromguessit(word) + if is_allowed_country(country_object, context): + ret.append((word_match.span[0], word_match.span[1], {'value': country_object})) + except babelfish.Error: + continue + return ret diff --git a/libs/guessit/rules/properties/crc.py b/libs/guessit/rules/properties/crc.py index c65ab7b37..f655bc131 100644 --- a/libs/guessit/rules/properties/crc.py +++ b/libs/guessit/rules/properties/crc.py @@ -6,21 +6,16 @@ crc and uuid properties from rebulk.remodule import re from rebulk import Rebulk -from ..common.pattern import is_disabled from ..common.validators import seps_surround -def crc(config): # pylint:disable=unused-argument +def crc(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'crc32')) - rebulk = rebulk.regex_defaults(flags=re.IGNORECASE) + rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE) rebulk.defaults(validator=seps_surround) rebulk.regex('(?:[a-fA-F]|[0-9]){8}', name='crc32', diff --git a/libs/guessit/rules/properties/date.py b/libs/guessit/rules/properties/date.py index 4db121c27..0b6083bd7 100644 --- a/libs/guessit/rules/properties/date.py +++ b/libs/guessit/rules/properties/date.py @@ -6,26 +6,21 @@ date and year properties from rebulk import Rebulk, RemoveMatch, Rule from ..common.date import search_date, valid_year -from ..common.pattern import is_disabled from ..common.validators import seps_surround -def date(config): # pylint:disable=unused-argument +def date(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ rebulk = Rebulk().defaults(validator=seps_surround) rebulk.regex(r"\d{4}", name="year", formatter=int, - disabled=lambda context: is_disabled(context, 'year'), validator=lambda match: seps_surround(match) and valid_year(match.value)) - def date_functional(string, context): # pylint:disable=inconsistent-return-statements + def date_functional(string, context): """ Search for date in the string and retrieves match @@ -38,9 +33,8 @@ def date(config): # pylint:disable=unused-argument return ret[0], ret[1], {'value': ret[2]} rebulk.functional(date_functional, name="date", properties={'date': [None]}, - disabled=lambda context: is_disabled(context, 'date'), conflict_solver=lambda match, other: other - if other.name in ('episode', 'season', 'crc32') + if other.name in ['episode', 'season'] else '__default__') rebulk.rules(KeepMarkedYearInFilepart) @@ -55,9 +49,6 @@ class KeepMarkedYearInFilepart(Rule): priority = 64 consequence = RemoveMatch - def enabled(self, context): - return not is_disabled(context, 'year') - def when(self, matches, context): ret = [] if len(matches.named('year')) > 1: diff --git a/libs/guessit/rules/properties/edition.py b/libs/guessit/rules/properties/edition.py index 822aa4ee3..a6d05a7e4 100644 --- a/libs/guessit/rules/properties/edition.py +++ b/libs/guessit/rules/properties/edition.py @@ -7,34 +7,28 @@ from rebulk.remodule import re from rebulk import Rebulk from ..common import dash -from ..common.pattern import is_disabled from ..common.validators import seps_surround -def edition(config): # pylint:disable=unused-argument +def edition(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'edition')) - rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]).string_defaults(ignore_case=True) + rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]).string_defaults(ignore_case=True) rebulk.defaults(name='edition', validator=seps_surround) - rebulk.regex('collector', "collector'?s?-edition", 'edition-collector', value='Collector') - rebulk.regex('special-edition', 'edition-special', value='Special', + rebulk.regex('collector', 'collector-edition', 'edition-collector', value='Collector Edition') + rebulk.regex('special-edition', 'edition-special', value='Special Edition', conflict_solver=lambda match, other: other if other.name == 'episode_details' and other.value == 'Special' else '__default__') - rebulk.string('se', value='Special', tags='has-neighbor') - rebulk.string('ddc', value="Director's Definitive Cut") - rebulk.regex('criterion-edition', 'edition-criterion', 'CC', value='Criterion') - rebulk.regex('deluxe', 'deluxe-edition', 'edition-deluxe', value='Deluxe') - rebulk.regex('limited', 'limited-edition', value='Limited', tags=['has-neighbor', 'release-group-prefix']) - rebulk.regex(r'theatrical-cut', r'theatrical-edition', r'theatrical', value='Theatrical') + rebulk.string('se', value='Special Edition', tags='has-neighbor') + rebulk.regex('criterion-edition', 'edition-criterion', value='Criterion Edition') + rebulk.regex('deluxe', 'deluxe-edition', 'edition-deluxe', value='Deluxe Edition') + rebulk.regex('limited', 'limited-edition', value='Limited Edition', tags=['has-neighbor', 'release-group-prefix']) + rebulk.regex(r'theatrical-cut', r'theatrical-edition', r'theatrical', value='Theatrical Edition') rebulk.regex(r"director'?s?-cut", r"director'?s?-cut-edition", r"edition-director'?s?-cut", 'DC', value="Director's Cut") rebulk.regex('extended', 'extended-?cut', 'extended-?version', @@ -43,10 +37,5 @@ def edition(config): # pylint:disable=unused-argument for value in ('Remastered', 'Uncensored', 'Uncut', 'Unrated'): rebulk.string(value, value=value, tags=['has-neighbor', 'release-group-prefix']) rebulk.string('Festival', value='Festival', tags=['has-neighbor-before', 'has-neighbor-after']) - rebulk.regex('imax', 'imax-edition', value='IMAX') - rebulk.regex('fan-edit(?:ion)?', 'fan-collection', value='Fan') - rebulk.regex('ultimate-edition', value='Ultimate') - rebulk.regex("ultimate-collector'?s?-edition", value=['Ultimate', 'Collector']) - rebulk.regex('ultimate-fan-edit(?:ion)?', 'ultimate-fan-collection', value=['Ultimate', 'Fan']) return rebulk diff --git a/libs/guessit/rules/properties/episode_title.py b/libs/guessit/rules/properties/episode_title.py index bcf605c0c..6d5016f13 100644 --- a/libs/guessit/rules/properties/episode_title.py +++ b/libs/guessit/rules/properties/episode_title.py @@ -9,31 +9,26 @@ from rebulk import Rebulk, Rule, AppendMatch, RemoveMatch, RenameMatch, POST_PRO from ..common import seps, title_seps from ..common.formatters import cleanup -from ..common.pattern import is_disabled from ..properties.title import TitleFromPosition, TitleBaseRule from ..properties.type import TypeProcessor -def episode_title(config): # pylint:disable=unused-argument +def episode_title(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ previous_names = ('episode', 'episode_details', 'episode_count', 'season', 'season_count', 'date', 'title', 'year') - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'episode_title')) - rebulk = rebulk.rules(RemoveConflictsWithEpisodeTitle(previous_names), - EpisodeTitleFromPosition(previous_names), - AlternativeTitleReplace(previous_names), - TitleToEpisodeTitle, - Filepart3EpisodeTitle, - Filepart2EpisodeTitle, - RenameEpisodeTitleWhenMovieType) + rebulk = Rebulk().rules(RemoveConflictsWithEpisodeTitle(previous_names), + EpisodeTitleFromPosition(previous_names), + AlternativeTitleReplace(previous_names), + TitleToEpisodeTitle, + Filepart3EpisodeTitle, + Filepart2EpisodeTitle, + RenameEpisodeTitleWhenMovieType) return rebulk @@ -48,7 +43,7 @@ class RemoveConflictsWithEpisodeTitle(Rule): def __init__(self, previous_names): super(RemoveConflictsWithEpisodeTitle, self).__init__() self.previous_names = previous_names - self.next_names = ('streaming_service', 'screen_size', 'source', + self.next_names = ('streaming_service', 'screen_size', 'format', 'video_codec', 'audio_codec', 'other', 'container') self.affected_if_holes_after = ('part', ) self.affected_names = ('part', 'year') @@ -58,11 +53,13 @@ class RemoveConflictsWithEpisodeTitle(Rule): for filepart in matches.markers.named('path'): for match in matches.range(filepart.start, filepart.end, predicate=lambda m: m.name in self.affected_names): - before = matches.range(filepart.start, match.start, predicate=lambda m: not m.private, index=-1) + before = matches.previous(match, index=0, + predicate=lambda m, fp=filepart: not m.private and m.start >= fp.start) if not before or before.name not in self.previous_names: continue - after = matches.range(match.end, filepart.end, predicate=lambda m: not m.private, index=0) + after = matches.next(match, index=0, + predicate=lambda m, fp=filepart: not m.private and m.end <= fp.end) if not after or after.name not in self.next_names: continue @@ -103,15 +100,16 @@ class TitleToEpisodeTitle(Rule): for title in titles: title_groups[title.value].append(title) - episode_titles = [] if len(title_groups) < 2: - return episode_titles + return + episode_titles = [] for title in titles: if matches.previous(title, lambda match: match.name == 'episode'): episode_titles.append(title) - return episode_titles + if episode_titles: + return episode_titles def then(self, matches, when_response, context): for title in when_response: @@ -152,7 +150,7 @@ class EpisodeTitleFromPosition(TitleBaseRule): return False return super(EpisodeTitleFromPosition, self).should_remove(match, matches, filepart, hole, context) - def when(self, matches, context): # pylint:disable=inconsistent-return-statements + def when(self, matches, context): if matches.named('episode_title'): return return super(EpisodeTitleFromPosition, self).when(matches, context) @@ -169,7 +167,7 @@ class AlternativeTitleReplace(Rule): super(AlternativeTitleReplace, self).__init__() self.previous_names = previous_names - def when(self, matches, context): # pylint:disable=inconsistent-return-statements + def when(self, matches, context): if matches.named('episode_title'): return @@ -204,7 +202,7 @@ class RenameEpisodeTitleWhenMovieType(Rule): dependency = TypeProcessor consequence = RenameMatch - def when(self, matches, context): # pylint:disable=inconsistent-return-statements + def when(self, matches, context): if matches.named('episode_title', lambda m: 'alternative-replaced' not in m.tags) \ and not matches.named('type', lambda m: m.value == 'episode'): return matches.named('episode_title') @@ -228,7 +226,7 @@ class Filepart3EpisodeTitle(Rule): """ consequence = AppendMatch('title') - def when(self, matches, context): # pylint:disable=inconsistent-return-statements + def when(self, matches, context): fileparts = matches.markers.named('path') if len(fileparts) < 3: return @@ -269,7 +267,7 @@ class Filepart2EpisodeTitle(Rule): """ consequence = AppendMatch('title') - def when(self, matches, context): # pylint:disable=inconsistent-return-statements + def when(self, matches, context): fileparts = matches.markers.named('path') if len(fileparts) < 2: return diff --git a/libs/guessit/rules/properties/episodes.py b/libs/guessit/rules/properties/episodes.py index 0f2e173cf..f74ae48e9 100644 --- a/libs/guessit/rules/properties/episodes.py +++ b/libs/guessit/rules/properties/episodes.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- """ -episode, season, disc, episode_count, season_count and episode_details properties +episode, season, episode_count, season_count and episode_details properties """ import copy from collections import defaultdict @@ -12,34 +12,24 @@ from rebulk.remodule import re from rebulk.utils import is_iterable from .title import TitleFromPosition -from ..common import dash, alt_dash, seps, seps_no_fs +from ..common import dash, alt_dash, seps from ..common.formatters import strip from ..common.numeral import numeral, parse_numeral -from ..common.pattern import is_disabled from ..common.validators import compose, seps_surround, seps_before, int_coercable from ...reutils import build_or_pattern -def episodes(config): +def episodes(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ # pylint: disable=too-many-branches,too-many-statements,too-many-locals - def is_season_episode_disabled(context): - """Whether season and episode rules should be enabled.""" - return is_disabled(context, 'episode') or is_disabled(context, 'season') - - rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE).string_defaults(ignore_case=True) + rebulk = Rebulk() + rebulk.regex_defaults(flags=re.IGNORECASE).string_defaults(ignore_case=True) rebulk.defaults(private_names=['episodeSeparator', 'seasonSeparator', 'episodeMarker', 'seasonMarker']) - episode_max_range = config['episode_max_range'] - season_max_range = config['season_max_range'] - def episodes_season_chain_breaker(matches): """ Break chains if there's more than 100 offset between two neighbor values. @@ -49,11 +39,11 @@ def episodes(config): :rtype: """ eps = matches.named('episode') - if len(eps) > 1 and abs(eps[-1].value - eps[-2].value) > episode_max_range: + if len(eps) > 1 and abs(eps[-1].value - eps[-2].value) > 100: return True seasons = matches.named('season') - if len(seasons) > 1 and abs(seasons[-1].value - seasons[-2].value) > season_max_range: + if len(seasons) > 1 and abs(seasons[-1].value - seasons[-2].value) > 100: return True return False @@ -67,41 +57,40 @@ def episodes(config): :param other: :return: """ - if match.name != other.name: - if match.name == 'episode' and other.name == 'year': + if match.name == 'episode' and other.name in \ + ['screen_size', 'video_codec', 'audio_codec', 'audio_channels', 'container', 'date', 'year'] \ + and 'weak-audio_channels' not in other.tags: + return match + if match.name == 'season' and other.name in \ + ['screen_size', 'video_codec', 'audio_codec', 'audio_channels', 'container', 'date'] \ + and 'weak-audio_channels' not in other.tags: + return match + if match.name in ['season', 'episode'] and other.name in ['season', 'episode'] \ + and match.initiator != other.initiator: + if 'weak-episode' in match.tags or 'x' in match.initiator.raw.lower(): return match - if match.name in ('season', 'episode'): - if other.name in ('video_codec', 'audio_codec', 'container', 'date'): - return match - if (other.name == 'audio_channels' and 'weak-audio_channels' not in other.tags - and not match.initiator.children.named(match.name + 'Marker')) or ( - other.name == 'screen_size' and not int_coercable(other.raw)): - - return match - if other.name in ('season', 'episode') and match.initiator != other.initiator: - if (match.initiator.name in ('weak_episode', 'weak_duplicate') - and other.initiator.name in ('weak_episode', 'weak_duplicate')): - return '__default__' - for current in (match, other): - if 'weak-episode' in current.tags or 'x' in current.initiator.raw.lower(): - return current + if 'weak-episode' in other.tags or 'x' in other.initiator.raw.lower(): + return other return '__default__' - season_words = config['season_words'] - episode_words = config['episode_words'] - of_words = config['of_words'] - all_words = config['all_words'] - season_markers = config['season_markers'] - season_ep_markers = config['season_ep_markers'] - disc_markers = config['disc_markers'] - episode_markers = config['episode_markers'] - range_separators = config['range_separators'] - weak_discrete_separators = list(sep for sep in seps_no_fs if sep not in range_separators) - strong_discrete_separators = config['discrete_separators'] + season_episode_seps = [] + season_episode_seps.extend(seps) + season_episode_seps.extend(['x', 'X', 'e', 'E']) + + season_words = ['season', 'saison', 'seizoen', 'serie', 'seasons', 'saisons', 'series', + 'tem', 'temp', 'temporada', 'temporadas', 'stagione'] + episode_words = ['episode', 'episodes', 'eps', 'ep', 'episodio', + 'episodios', 'capitulo', 'capitulos'] + of_words = ['of', 'sur'] + all_words = ['All'] + season_markers = ["S"] + season_ep_markers = ["x"] + episode_markers = ["xE", "Ex", "EP", "E", "x"] + range_separators = ['-', '~', 'to', 'a'] + weak_discrete_separators = list(sep for sep in seps if sep not in range_separators) + strong_discrete_separators = ['+', '&', 'and', 'et'] discrete_separators = strong_discrete_separators + weak_discrete_separators - max_range_gap = config['max_range_gap'] - def ordering_validator(match): """ Validator for season list. They should be in natural order to be validated. @@ -136,7 +125,7 @@ def episodes(config): separator = match.children.previous(current_match, lambda m: m.name == property_name + 'Separator', 0) if separator.raw not in range_separators and separator.raw in weak_discrete_separators: - if not 0 < current_match.value - previous_match.value <= max_range_gap + 1: + if not current_match.value - previous_match.value == 1: valid = False if separator.raw in strong_discrete_separators: valid = True @@ -154,13 +143,12 @@ def episodes(config): private_parent=True, validate_all=True, validator={'__parent__': ordering_validator}, - conflict_solver=season_episode_conflict_solver, - disabled=is_season_episode_disabled) \ + conflict_solver=season_episode_conflict_solver) \ .regex(build_or_pattern(season_markers, name='seasonMarker') + r'(?P<season>\d+)@?' + - build_or_pattern(episode_markers + disc_markers, name='episodeMarker') + r'@?(?P<episode>\d+)', + build_or_pattern(episode_markers, name='episodeMarker') + r'@?(?P<episode>\d+)', validate_all=True, validator={'__parent__': seps_before}).repeater('+') \ - .regex(build_or_pattern(episode_markers + disc_markers + discrete_separators + range_separators, + .regex(build_or_pattern(episode_markers + discrete_separators + range_separators, name='episodeSeparator', escape=True) + r'(?P<episode>\d+)').repeater('*') \ @@ -190,11 +178,9 @@ def episodes(config): r'(?P<season>\d+)').repeater('*') # episode_details property - for episode_detail in ('Special', 'Bonus', 'Pilot', 'Unaired', 'Final'): - rebulk.string(episode_detail, value=episode_detail, name='episode_details', - disabled=lambda context: is_disabled(context, 'episode_details')) - rebulk.regex(r'Extras?', 'Omake', name='episode_details', value='Extras', - disabled=lambda context: is_disabled(context, 'episode_details')) + for episode_detail in ('Special', 'Bonus', 'Omake', 'Ova', 'Oav', 'Pilot', 'Unaired'): + rebulk.string(episode_detail, value=episode_detail, name='episode_details') + rebulk.regex(r'Extras?', name='episode_details', value='Extras') def validate_roman(match): """ @@ -216,8 +202,7 @@ def episodes(config): formatter={'season': parse_numeral, 'count': parse_numeral}, validator={'__parent__': compose(seps_surround, ordering_validator), 'season': validate_roman, - 'count': validate_roman}, - disabled=lambda context: context.get('type') == 'movie' or is_disabled(context, 'season')) \ + 'count': validate_roman}) \ .defaults(validator=None) \ .regex(build_or_pattern(season_words, name='seasonMarker') + '@?(?P<season>' + numeral + ')') \ .regex(r'' + build_or_pattern(of_words) + '@?(?P<count>' + numeral + ')').repeater('?') \ @@ -229,7 +214,7 @@ def episodes(config): r'(?:v(?P<version>\d+))?' + r'(?:-?' + build_or_pattern(of_words) + r'-?(?P<count>\d+))?', # Episode 4 abbreviations=[dash], formatter={'episode': int, 'version': int, 'count': int}, - disabled=lambda context: context.get('type') == 'episode' or is_disabled(context, 'episode')) + disabled=lambda context: context.get('type') == 'episode') rebulk.regex(build_or_pattern(episode_words, name='episodeMarker') + r'-?(?P<episode>' + numeral + ')' + r'(?:v(?P<version>\d+))?' + @@ -237,44 +222,42 @@ def episodes(config): abbreviations=[dash], validator={'episode': validate_roman}, formatter={'episode': parse_numeral, 'version': int, 'count': int}, - disabled=lambda context: context.get('type') != 'episode' or is_disabled(context, 'episode')) + disabled=lambda context: context.get('type') != 'episode') rebulk.regex(r'S?(?P<season>\d+)-?(?:xE|Ex|E|x)-?(?P<other>' + build_or_pattern(all_words) + ')', tags=['SxxExx'], abbreviations=[dash], validator=None, - formatter={'season': int, 'other': lambda match: 'Complete'}, - disabled=lambda context: is_disabled(context, 'season')) + formatter={'season': int, 'other': lambda match: 'Complete'}) # 12, 13 - rebulk.chain(tags=['weak-episode'], formatter={'episode': int, 'version': int}, - disabled=lambda context: context.get('type') == 'movie' or is_disabled(context, 'episode')) \ + rebulk.chain(tags=['bonus-conflict', 'weak-movie', 'weak-episode'], formatter={'episode': int, 'version': int}, + disabled=lambda context: context.get('type') == 'movie') \ .defaults(validator=None) \ .regex(r'(?P<episode>\d{2})') \ .regex(r'v(?P<version>\d+)').repeater('?') \ .regex(r'(?P<episodeSeparator>[x-])(?P<episode>\d{2})').repeater('*') # 012, 013 - rebulk.chain(tags=['weak-episode'], formatter={'episode': int, 'version': int}, - disabled=lambda context: context.get('type') == 'movie' or is_disabled(context, 'episode')) \ + rebulk.chain(tags=['bonus-conflict', 'weak-movie', 'weak-episode'], formatter={'episode': int, 'version': int}, + disabled=lambda context: context.get('type') == 'movie') \ .defaults(validator=None) \ .regex(r'0(?P<episode>\d{1,2})') \ .regex(r'v(?P<version>\d+)').repeater('?') \ .regex(r'(?P<episodeSeparator>[x-])0(?P<episode>\d{1,2})').repeater('*') # 112, 113 - rebulk.chain(tags=['weak-episode'], - formatter={'episode': int, 'version': int}, - name='weak_episode', - disabled=lambda context: context.get('type') == 'movie' or is_disabled(context, 'episode')) \ + rebulk.chain(tags=['bonus-conflict', 'weak-movie', 'weak-episode'], formatter={'episode': int, 'version': int}, + disabled=lambda context: (not context.get('episode_prefer_number', False) or + context.get('type') == 'movie')) \ .defaults(validator=None) \ .regex(r'(?P<episode>\d{3,4})') \ .regex(r'v(?P<version>\d+)').repeater('?') \ .regex(r'(?P<episodeSeparator>[x-])(?P<episode>\d{3,4})').repeater('*') # 1, 2, 3 - rebulk.chain(tags=['weak-episode'], formatter={'episode': int, 'version': int}, - disabled=lambda context: context.get('type') != 'episode' or is_disabled(context, 'episode')) \ + rebulk.chain(tags=['bonus-conflict', 'weak-movie', 'weak-episode'], formatter={'episode': int, 'version': int}, + disabled=lambda context: context.get('type') != 'episode') \ .defaults(validator=None) \ .regex(r'(?P<episode>\d)') \ .regex(r'v(?P<version>\d+)').repeater('?') \ @@ -282,16 +265,14 @@ def episodes(config): # e112, e113 # TODO: Enhance rebulk for validator to be used globally (season_episode_validator) - rebulk.chain(formatter={'episode': int, 'version': int}, - disabled=lambda context: is_disabled(context, 'episode')) \ + rebulk.chain(formatter={'episode': int, 'version': int}) \ .defaults(validator=None) \ .regex(r'(?P<episodeMarker>e)(?P<episode>\d{1,4})') \ .regex(r'v(?P<version>\d+)').repeater('?') \ .regex(r'(?P<episodeSeparator>e|x|-)(?P<episode>\d{1,4})').repeater('*') # ep 112, ep113, ep112, ep113 - rebulk.chain(abbreviations=[dash], formatter={'episode': int, 'version': int}, - disabled=lambda context: is_disabled(context, 'episode')) \ + rebulk.chain(abbreviations=[dash], formatter={'episode': int, 'version': int}) \ .defaults(validator=None) \ .regex(r'ep-?(?P<episode>\d{1,4})') \ .regex(r'v(?P<version>\d+)').repeater('?') \ @@ -300,26 +281,23 @@ def episodes(config): # cap 112, cap 112_114 rebulk.chain(abbreviations=[dash], tags=['see-pattern'], - formatter={'season': int, 'episode': int}, - disabled=is_season_episode_disabled) \ + formatter={'season': int, 'episode': int}) \ .defaults(validator=None) \ .regex(r'(?P<seasonMarker>cap)-?(?P<season>\d{1,2})(?P<episode>\d{2})') \ .regex(r'(?P<episodeSeparator>-)(?P<season>\d{1,2})(?P<episode>\d{2})').repeater('?') # 102, 0102 - rebulk.chain(tags=['weak-episode', 'weak-duplicate'], + rebulk.chain(tags=['bonus-conflict', 'weak-movie', 'weak-episode', 'weak-duplicate'], formatter={'season': int, 'episode': int, 'version': int}, - name='weak_duplicate', - conflict_solver=season_episode_conflict_solver, + conflict_solver=lambda match, other: match if other.name == 'year' else '__default__', disabled=lambda context: (context.get('episode_prefer_number', False) or - context.get('type') == 'movie') or is_season_episode_disabled(context)) \ + context.get('type') == 'movie')) \ .defaults(validator=None) \ .regex(r'(?P<season>\d{1,2})(?P<episode>\d{2})') \ .regex(r'v(?P<version>\d+)').repeater('?') \ .regex(r'(?P<episodeSeparator>x|-)(?P<episode>\d{2})').repeater('*') - rebulk.regex(r'v(?P<version>\d+)', children=True, private_parent=True, formatter=int, - disabled=lambda context: is_disabled(context, 'version')) + rebulk.regex(r'v(?P<version>\d+)', children=True, private_parent=True, formatter=int) rebulk.defaults(private_names=['episodeSeparator', 'seasonSeparator']) @@ -327,100 +305,19 @@ def episodes(config): # detached of X count (season/episode) rebulk.regex(r'(?P<episode>\d+)-?' + build_or_pattern(of_words) + r'-?(?P<count>\d+)-?' + build_or_pattern(episode_words) + '?', - abbreviations=[dash], children=True, private_parent=True, formatter=int, - disabled=lambda context: is_disabled(context, 'episode')) + abbreviations=[dash], children=True, private_parent=True, formatter=int) - rebulk.regex(r'Minisodes?', name='episode_format', value="Minisode", - disabled=lambda context: is_disabled(context, 'episode_format')) + rebulk.regex(r'Minisodes?', name='episode_format', value="Minisode") - rebulk.rules(WeakConflictSolver, RemoveInvalidSeason, RemoveInvalidEpisode, - SeePatternRange(range_separators + ['_']), - EpisodeNumberSeparatorRange(range_separators), + rebulk.rules(RemoveInvalidSeason, RemoveInvalidEpisode, + SeePatternRange(range_separators + ['_']), EpisodeNumberSeparatorRange(range_separators), SeasonSeparatorRange(range_separators), RemoveWeakIfMovie, RemoveWeakIfSxxExx, RemoveWeakDuplicate, EpisodeDetailValidator, RemoveDetachedEpisodeNumber, VersionValidator, - RemoveWeak, RenameToAbsoluteEpisode, CountValidator, EpisodeSingleDigitValidator, RenameToDiscMatch) + CountValidator, EpisodeSingleDigitValidator) return rebulk -class WeakConflictSolver(Rule): - """ - Rule to decide whether weak-episode or weak-duplicate matches should be kept. - - If an anime is detected: - - weak-duplicate matches should be removed - - weak-episode matches should be tagged as anime - Otherwise: - - weak-episode matches are removed unless they're part of an episode range match. - """ - priority = 128 - consequence = [RemoveMatch, AppendMatch] - - def enabled(self, context): - return context.get('type') != 'movie' - - @classmethod - def is_anime(cls, matches): - """Return True if it seems to be an anime. - - Anime characteristics: - - version, crc32 matches - - screen_size inside brackets - - release_group at start and inside brackets - """ - if matches.named('version') or matches.named('crc32'): - return True - - for group in matches.markers.named('group'): - if matches.range(group.start, group.end, predicate=lambda m: m.name == 'screen_size'): - return True - if matches.markers.starting(group.start, predicate=lambda m: m.name == 'path'): - hole = matches.holes(group.start, group.end, index=0) - if hole and hole.raw == group.raw: - return True - - return False - - def when(self, matches, context): - to_remove = [] - to_append = [] - anime_detected = self.is_anime(matches) - for filepart in matches.markers.named('path'): - weak_matches = matches.range(filepart.start, filepart.end, predicate=( - lambda m: m.initiator.name == 'weak_episode')) - weak_dup_matches = matches.range(filepart.start, filepart.end, predicate=( - lambda m: m.initiator.name == 'weak_duplicate')) - if anime_detected: - if weak_matches: - to_remove.extend(weak_dup_matches) - for match in matches.range(filepart.start, filepart.end, predicate=( - lambda m: m.name == 'episode' and m.initiator.name != 'weak_duplicate')): - episode = copy.copy(match) - episode.tags = episode.tags + ['anime'] - to_append.append(episode) - to_remove.append(match) - elif weak_dup_matches: - episodes_in_range = matches.range(filepart.start, filepart.end, predicate=( - lambda m: - m.name == 'episode' and m.initiator.name == 'weak_episode' - and m.initiator.children.named('episodeSeparator') - )) - if not episodes_in_range and not matches.range(filepart.start, filepart.end, - predicate=lambda m: 'SxxExx' in m.tags): - to_remove.extend(weak_matches) - else: - for match in episodes_in_range: - episode = copy.copy(match) - episode.tags = [] - to_append.append(episode) - to_remove.append(match) - - if to_append: - to_remove.extend(weak_dup_matches) - - return to_remove, to_append - - class CountValidator(Rule): """ Validate count property and rename it @@ -499,16 +396,14 @@ class AbstractSeparatorRange(Rule): to_append = [] for separator in matches.named(self.property_name + 'Separator'): - previous_match = matches.previous(separator, lambda m: m.name == self.property_name, 0) - next_match = matches.next(separator, lambda m: m.name == self.property_name, 0) - initiator = separator.initiator + previous_match = matches.previous(separator, lambda match: match.name == self.property_name, 0) + next_match = matches.next(separator, lambda match: match.name == self.property_name, 0) if previous_match and next_match and separator.value in self.range_separators: to_remove.append(next_match) for episode_number in range(previous_match.value + 1, next_match.value): match = copy.copy(next_match) match.value = episode_number - initiator.children.append(match) to_append.append(match) to_append.append(next_match) to_remove.append(separator) @@ -520,11 +415,9 @@ class AbstractSeparatorRange(Rule): if separator not in self.range_separators: separator = strip(separator) if separator in self.range_separators: - initiator = previous_match.initiator for episode_number in range(previous_match.value + 1, next_match.value): match = copy.copy(next_match) match.value = episode_number - initiator.children.append(match) to_append.append(match) to_append.append(Match(previous_match.end, next_match.start - 1, name=self.property_name + 'Separator', @@ -538,46 +431,12 @@ class AbstractSeparatorRange(Rule): return to_remove, to_append -class RenameToAbsoluteEpisode(Rule): - """ - Rename episode to absolute_episodes. - - Absolute episodes are only used if two groups of episodes are detected: - S02E04-06 25-27 - 25-27 S02E04-06 - 2x04-06 25-27 - 28. Anime Name S02E05 - The matches in the group with higher episode values are renamed to absolute_episode. - """ - - consequence = RenameMatch('absolute_episode') - - def when(self, matches, context): # pylint:disable=inconsistent-return-statements - initiators = set([match.initiator for match in matches.named('episode') - if len(match.initiator.children.named('episode')) > 1]) - if len(initiators) != 2: - ret = [] - for filepart in matches.markers.named('path'): - if matches.range(filepart.start + 1, filepart.end, predicate=lambda m: m.name == 'episode'): - ret.extend( - matches.starting(filepart.start, predicate=lambda m: m.initiator.name == 'weak_episode')) - return ret - - initiators = sorted(initiators, key=lambda item: item.end) - if not matches.holes(initiators[0].end, initiators[1].start, predicate=lambda m: m.raw.strip(seps)): - first_range = matches.named('episode', predicate=lambda m: m.initiator == initiators[0]) - second_range = matches.named('episode', predicate=lambda m: m.initiator == initiators[1]) - if len(first_range) == len(second_range): - if second_range[0].value > first_range[0].value: - return second_range - if first_range[0].value > second_range[0].value: - return first_range - - class EpisodeNumberSeparatorRange(AbstractSeparatorRange): """ Remove separator matches and create matches for episoderNumber range. """ + priority = 128 + consequence = [RemoveMatch, AppendMatch] def __init__(self, range_separators): super(EpisodeNumberSeparatorRange, self).__init__(range_separators, "episode") @@ -587,6 +446,8 @@ class SeasonSeparatorRange(AbstractSeparatorRange): """ Remove separator matches and create matches for season range. """ + priority = 128 + consequence = [RemoveMatch, AppendMatch] def __init__(self, range_separators): super(SeasonSeparatorRange, self).__init__(range_separators, "season") @@ -594,7 +455,7 @@ class SeasonSeparatorRange(AbstractSeparatorRange): class RemoveWeakIfMovie(Rule): """ - Remove weak-episode tagged matches if it seems to be a movie. + Remove weak-movie tagged matches if it seems to be a movie. """ priority = 64 consequence = RemoveMatch @@ -610,48 +471,19 @@ class RemoveWeakIfMovie(Rule): year = matches.range(filepart.start, filepart.end, predicate=lambda m: m.name == 'year', index=0) if year: remove = True - next_match = matches.range(year.end, filepart.end, predicate=lambda m: m.private, index=0) - if (next_match and not matches.holes(year.end, next_match.start, predicate=lambda m: m.raw.strip(seps)) - and not matches.at_match(next_match, predicate=lambda m: m.name == 'year')): + next_match = matches.next(year, predicate=lambda m, fp=filepart: m.private and m.end <= fp.end, index=0) + if next_match and not matches.at_match(next_match, predicate=lambda m: m.name == 'year'): to_ignore.add(next_match.initiator) - to_ignore.update(matches.range(filepart.start, filepart.end, - predicate=lambda m: len(m.children.named('episode')) > 1)) - - to_remove.extend(matches.conflicting(year)) if remove: - to_remove.extend(matches.tagged('weak-episode', predicate=( - lambda m: m.initiator not in to_ignore and 'anime' not in m.tags))) + to_remove.extend(matches.tagged('weak-movie', predicate=lambda m: m.initiator not in to_ignore)) return to_remove -class RemoveWeak(Rule): - """ - Remove weak-episode matches which appears after video, source, and audio matches. - """ - priority = 16 - consequence = RemoveMatch - - def when(self, matches, context): - to_remove = [] - for filepart in matches.markers.named('path'): - weaks = matches.range(filepart.start, filepart.end, predicate=lambda m: 'weak-episode' in m.tags) - if weaks: - previous = matches.previous(weaks[0], predicate=lambda m: m.name in ( - 'audio_codec', 'screen_size', 'streaming_service', 'source', 'video_profile', - 'audio_channels', 'audio_profile'), index=0) - if previous and not matches.holes( - previous.end, weaks[0].start, predicate=lambda m: m.raw.strip(seps)): - to_remove.extend(weaks) - return to_remove - - class RemoveWeakIfSxxExx(Rule): """ - Remove weak-episode tagged matches if SxxExx pattern is matched. - - Weak episodes at beginning of filepart are kept. + Remove weak-movie tagged matches if SxxExx pattern is matched. """ priority = 64 consequence = RemoveMatch @@ -660,10 +492,9 @@ class RemoveWeakIfSxxExx(Rule): to_remove = [] for filepart in matches.markers.named('path'): if matches.range(filepart.start, filepart.end, - predicate=lambda m: not m.private and 'SxxExx' in m.tags): - for match in matches.range(filepart.start, filepart.end, predicate=lambda m: 'weak-episode' in m.tags): - if match.start != filepart.start or match.initiator.name != 'weak_episode': - to_remove.append(match) + predicate=lambda match: not match.private and 'SxxExx' in match.tags): + to_remove.extend(matches.range( + filepart.start, filepart.end, predicate=lambda match: 'weak-movie' in match.tags)) return to_remove @@ -744,7 +575,7 @@ class RemoveWeakDuplicate(Rule): for filepart in matches.markers.named('path'): patterns = defaultdict(list) for match in reversed(matches.range(filepart.start, filepart.end, - predicate=lambda m: 'weak-duplicate' in m.tags)): + predicate=lambda match: 'weak-duplicate' in match.tags)): if match.pattern in patterns[match.name]: to_remove.append(match) else: @@ -784,12 +615,12 @@ class RemoveDetachedEpisodeNumber(Rule): episode_numbers = [] episode_values = set() - for match in matches.named('episode', lambda m: not m.private and 'weak-episode' in m.tags): + for match in matches.named('episode', lambda match: not match.private and 'weak-movie' in match.tags): if match.value not in episode_values: episode_numbers.append(match) episode_values.add(match.value) - episode_numbers = list(sorted(episode_numbers, key=lambda m: m.value)) + episode_numbers = list(sorted(episode_numbers, key=lambda match: match.value)) if len(episode_numbers) > 1 and \ episode_numbers[0].value < 10 and \ episode_numbers[1].value - episode_numbers[0].value != 1: @@ -833,29 +664,3 @@ class EpisodeSingleDigitValidator(Rule): if not matches.range(*group.span, predicate=lambda match: match.name == 'title'): ret.append(episode) return ret - - -class RenameToDiscMatch(Rule): - """ - Rename episodes detected with `d` episodeMarkers to `disc`. - """ - - consequence = [RenameMatch('disc'), RenameMatch('discMarker'), RemoveMatch] - - def when(self, matches, context): - discs = [] - markers = [] - to_remove = [] - - disc_disabled = is_disabled(context, 'disc') - - for marker in matches.named('episodeMarker', predicate=lambda m: m.value.lower() == 'd'): - if disc_disabled: - to_remove.append(marker) - to_remove.extend(marker.initiator.children) - continue - - markers.append(marker) - discs.extend(sorted(marker.initiator.children.named('episode'), key=lambda m: m.value)) - - return discs, markers, to_remove diff --git a/libs/guessit/rules/properties/film.py b/libs/guessit/rules/properties/film.py index 3c7e6c0ff..8cd0561e4 100644 --- a/libs/guessit/rules/properties/film.py +++ b/libs/guessit/rules/properties/film.py @@ -7,11 +7,10 @@ from rebulk import Rebulk, AppendMatch, Rule from rebulk.remodule import re from ..common.formatters import cleanup -from ..common.pattern import is_disabled from ..common.validators import seps_surround -def film(config): # pylint:disable=unused-argument +def film(): """ Builder for rebulk object. :return: Created Rebulk object @@ -19,8 +18,7 @@ def film(config): # pylint:disable=unused-argument """ rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE, validate_all=True, validator={'__parent__': seps_surround}) - rebulk.regex(r'f(\d{1,2})', name='film', private_parent=True, children=True, formatter=int, - disabled=lambda context: is_disabled(context, 'film')) + rebulk.regex(r'f(\d{1,2})', name='film', private_parent=True, children=True, formatter=int) rebulk.rules(FilmTitleRule) @@ -35,10 +33,7 @@ class FilmTitleRule(Rule): properties = {'film_title': [None]} - def enabled(self, context): - return not is_disabled(context, 'film_title') - - def when(self, matches, context): # pylint:disable=inconsistent-return-statements + def when(self, matches, context): bonus_number = matches.named('film', lambda match: not match.private, index=0) if bonus_number: filepath = matches.markers.at_match(bonus_number, lambda marker: marker.name == 'path', 0) diff --git a/libs/guessit/rules/properties/format.py b/libs/guessit/rules/properties/format.py new file mode 100644 index 000000000..83a9a2f65 --- /dev/null +++ b/libs/guessit/rules/properties/format.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +format property +""" +from rebulk.remodule import re + +from rebulk import Rebulk, RemoveMatch, Rule +from ..common import dash +from ..common.validators import seps_before, seps_after + + +def format_(): + """ + Builder for rebulk object. + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) + rebulk.defaults(name="format", tags=['video-codec-prefix', 'streaming_service.suffix']) + + rebulk.regex("VHS", "VHS-?Rip", value="VHS") + rebulk.regex("CAM", "CAM-?Rip", "HD-?CAM", value="Cam") + rebulk.regex("TELESYNC", "TS", "HD-?TS", value="Telesync") + rebulk.regex("WORKPRINT", "WP", value="Workprint") + rebulk.regex("TELECINE", "TC", value="Telecine") + rebulk.regex("PPV", "PPV-?Rip", value="PPV") # Pay Per View + rebulk.regex("SD-?TV", "SD-?TV-?Rip", "Rip-?SD-?TV", "TV-?Rip", + "Rip-?TV", "TV-?(?=Dub)", value="TV") # TV is too common to allow matching + rebulk.regex("DVB-?Rip", "DVB", "PD-?TV", value="DVB") + rebulk.regex("DVD", "DVD-?Rip", "VIDEO-?TS", "DVD-?R(?:$|(?!E))", # "DVD-?R(?:$|^E)" => DVD-Real ... + "DVD-?9", "DVD-?5", value="DVD") + + rebulk.regex("HD-?TV", "TV-?RIP-?HD", "HD-?TV-?RIP", "HD-?RIP", value="HDTV", + conflict_solver=lambda match, other: other if other.name == 'other' else '__default__') + rebulk.regex("VOD", "VOD-?Rip", value="VOD") + rebulk.regex("WEB-?Rip", "WEB-?DL-?Rip", "WEB-?Cap", value="WEBRip") + rebulk.regex("WEB-?DL", "WEB-?HD", "WEB", "DL-?WEB", "DL(?=-?Mux)", value="WEB-DL") + rebulk.regex("HD-?DVD-?Rip", "HD-?DVD", value="HD-DVD") + rebulk.regex("Blu-?ray(?:-?Rip)?", "B[DR]", "B[DR]-?Rip", "BD[59]", "BD25", "BD50", value="BluRay") + rebulk.regex("AHDTV", value="AHDTV") + rebulk.regex('UHD-?TV', 'UHD-?Rip', value='UHDTV', + conflict_solver=lambda match, other: other if other.name == 'other' else '__default__') + rebulk.regex("HDTC", value="HDTC") + rebulk.regex("DSR", "DSR?-?Rip", "SAT-?Rip", "DTH", "DTH-?Rip", value="SATRip") + + rebulk.rules(ValidateFormat) + + return rebulk + + +class ValidateFormat(Rule): + """ + Validate format with screener property, with video_codec property or separated + """ + priority = 64 + consequence = RemoveMatch + + def when(self, matches, context): + ret = [] + for format_match in matches.named('format'): + if not seps_before(format_match) and \ + not matches.range(format_match.start - 1, format_match.start - 2, + lambda match: 'format-prefix' in match.tags): + ret.append(format_match) + continue + if not seps_after(format_match) and \ + not matches.range(format_match.end, format_match.end + 1, + lambda match: 'format-suffix' in match.tags): + ret.append(format_match) + continue + return ret diff --git a/libs/guessit/rules/properties/language.py b/libs/guessit/rules/properties/language.py index 0cc4b94a8..af60c6d9d 100644 --- a/libs/guessit/rules/properties/language.py +++ b/libs/guessit/rules/properties/language.py @@ -11,80 +11,55 @@ import babelfish from rebulk import Rebulk, Rule, RemoveMatch, RenameMatch from rebulk.remodule import re -from ..common import seps -from ..common.pattern import is_disabled -from ..common.words import iter_words +from ..common.words import iter_words, COMMON_WORDS from ..common.validators import seps_surround -def language(config, common_words): +def language(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict - :param common_words: common words - :type common_words: set :return: Created Rebulk object :rtype: Rebulk """ - subtitle_both = config['subtitle_affixes'] - subtitle_prefixes = sorted(subtitle_both + config['subtitle_prefixes'], key=length_comparator) - subtitle_suffixes = sorted(subtitle_both + config['subtitle_suffixes'], key=length_comparator) - lang_both = config['language_affixes'] - lang_prefixes = sorted(lang_both + config['language_prefixes'], key=length_comparator) - lang_suffixes = sorted(lang_both + config['language_suffixes'], key=length_comparator) - weak_affixes = frozenset(config['weak_affixes']) - - rebulk = Rebulk(disabled=lambda context: (is_disabled(context, 'language') and - is_disabled(context, 'subtitle_language'))) + rebulk = Rebulk() rebulk.string(*subtitle_prefixes, name="subtitle_language.prefix", ignore_case=True, private=True, - validator=seps_surround, tags=['release-group-prefix'], - disabled=lambda context: is_disabled(context, 'subtitle_language')) + validator=seps_surround, tags=['release-group-prefix']) rebulk.string(*subtitle_suffixes, name="subtitle_language.suffix", ignore_case=True, private=True, - validator=seps_surround, - disabled=lambda context: is_disabled(context, 'subtitle_language')) + validator=seps_surround) rebulk.string(*lang_suffixes, name="language.suffix", ignore_case=True, private=True, - validator=seps_surround, tags=['source-suffix'], - disabled=lambda context: is_disabled(context, 'language')) - - def find_languages(string, context=None): - """Find languages in the string - - :return: list of tuple (property, Language, lang_word, word) - """ - return LanguageFinder(context, subtitle_prefixes, subtitle_suffixes, - lang_prefixes, lang_suffixes, weak_affixes).find(string) - - rebulk.functional(find_languages, - properties={'language': [None]}, - disabled=lambda context: not context.get('allowed_languages')) - rebulk.rules(SubtitleExtensionRule, - SubtitlePrefixLanguageRule, - SubtitleSuffixLanguageRule, - RemoveLanguage, - RemoveInvalidLanguages(common_words)) - - babelfish.language_converters['guessit'] = GuessitConverter(config['synonyms']) + validator=seps_surround, tags=['format-suffix']) + rebulk.functional(find_languages, properties={'language': [None]}) + rebulk.rules(SubtitlePrefixLanguageRule, SubtitleSuffixLanguageRule, SubtitleExtensionRule) return rebulk +COMMON_WORDS_STRICT = frozenset(['brazil']) + UNDETERMINED = babelfish.Language('und') +SYN = {('ell', None): ['gr', 'greek'], + ('spa', None): ['esp', 'español', 'espanol'], + ('fra', None): ['français', 'vf', 'vff', 'vfi', 'vfq'], + ('swe', None): ['se'], + ('por', 'BR'): ['po', 'pb', 'pob', 'ptbr', 'br', 'brazilian'], + ('cat', None): ['català', 'castellano', 'espanol castellano', 'español castellano'], + ('ces', None): ['cz'], + ('ukr', None): ['ua'], + ('zho', None): ['cn'], + ('jpn', None): ['jp'], + ('hrv', None): ['scr'], + ('mul', None): ['multi', 'dl']} # http://scenelingo.wordpress.com/2009/03/24/what-does-dl-mean/ + class GuessitConverter(babelfish.LanguageReverseConverter): # pylint: disable=missing-docstring _with_country_regexp = re.compile(r'(.*)\((.*)\)') _with_country_regexp2 = re.compile(r'(.*)-(.*)') - def __init__(self, synonyms): + def __init__(self): self.guessit_exceptions = {} - for code, synlist in synonyms.items(): - if '_' in code: - (alpha3, country) = code.split('_') - else: - (alpha3, country) = (code, None) + for (alpha3, country), synlist in SYN.items(): for syn in synlist: self.guessit_exceptions[syn.lower()] = (alpha3, country, None) @@ -101,7 +76,15 @@ class GuessitConverter(babelfish.LanguageReverseConverter): # pylint: disable=m return str(babelfish.Language(alpha3, country, script)) def reverse(self, name): # pylint:disable=arguments-differ + with_country = (GuessitConverter._with_country_regexp.match(name) or + GuessitConverter._with_country_regexp2.match(name)) + name = name.lower() + if with_country: + lang = babelfish.Language.fromguessit(with_country.group(1).strip()) + lang.country = babelfish.Country.fromguessit(with_country.group(2).strip()) + return lang.alpha3, lang.country.alpha2 if lang.country else None, lang.script or None + # exceptions come first, as they need to override a potential match # with any of the other guessers try: @@ -113,8 +96,7 @@ class GuessitConverter(babelfish.LanguageReverseConverter): # pylint: disable=m babelfish.Language.fromalpha3b, babelfish.Language.fromalpha2, babelfish.Language.fromname, - babelfish.Language.fromopensubtitles, - babelfish.Language.fromietf]: + babelfish.Language.fromopensubtitles]: try: reverse = conv(name) return reverse.alpha3, reverse.country, reverse.script @@ -131,6 +113,24 @@ def length_comparator(value): return len(value) +babelfish.language_converters['guessit'] = GuessitConverter() + + +subtitle_both = ['sub', 'subs', 'subbed', 'custom subbed', 'custom subs', + 'custom sub', 'customsubbed', 'customsubs', 'customsub', + 'soft subtitles', 'soft subs'] +subtitle_prefixes = sorted(subtitle_both + + ['st', 'vost', 'subforced', 'fansub', 'hardsub', + 'legenda', 'legendas', 'legendado', 'subtitulado', + 'soft', 'subtitles'], key=length_comparator) +subtitle_suffixes = sorted(subtitle_both + + ['subforced', 'fansub', 'hardsub'], key=length_comparator) +lang_both = ['dublado', 'dubbed', 'dub'] +lang_suffixes = sorted(lang_both + ['audio'], key=length_comparator) +lang_prefixes = sorted(lang_both + ['true'], key=length_comparator) + +weak_prefixes = ('audio', 'true') + _LanguageMatch = namedtuple('_LanguageMatch', ['property_name', 'word', 'lang']) @@ -149,7 +149,7 @@ class LanguageWord(object): self.next_word = next_word @property - def extended_word(self): # pylint:disable=inconsistent-return-statements + def extended_word(self): """ Return the extended word for this instance, if any. """ @@ -175,17 +175,10 @@ def to_rebulk_match(language_match): end = word.end name = language_match.property_name if language_match.lang == UNDETERMINED: - return start, end, { - 'name': name, - 'value': word.value.lower(), - 'formatter': babelfish.Language, - 'tags': ['weak-language'] - } + return start, end, dict(name=name, value=word.value.lower(), + formatter=babelfish.Language, tags=['weak-language']) - return start, end, { - 'name': name, - 'value': language_match.lang - } + return start, end, dict(name=name, value=language_match.lang) class LanguageFinder(object): @@ -193,21 +186,10 @@ class LanguageFinder(object): Helper class to search and return language matches: 'language' and 'subtitle_language' properties """ - def __init__(self, context, - subtitle_prefixes, subtitle_suffixes, - lang_prefixes, lang_suffixes, weak_affixes): - allowed_languages = context.get('allowed_languages') if context else None - self.allowed_languages = set([l.lower() for l in allowed_languages or []]) - self.weak_affixes = weak_affixes - self.prefixes_map = {} - self.suffixes_map = {} - - if not is_disabled(context, 'subtitle_language'): - self.prefixes_map['subtitle_language'] = subtitle_prefixes - self.suffixes_map['subtitle_language'] = subtitle_suffixes - - self.prefixes_map['language'] = lang_prefixes - self.suffixes_map['language'] = lang_suffixes + def __init__(self, allowed_languages): + self.parsed = dict() + self.allowed_languages = allowed_languages + self.common_words = COMMON_WORDS_STRICT if allowed_languages else COMMON_WORDS def find(self, string): """ @@ -268,11 +250,11 @@ class LanguageFinder(object): """ tuples = [ (language_word, language_word.next_word, - self.prefixes_map, + dict(subtitle_language=subtitle_prefixes, language=lang_prefixes), lambda string, prefix: string.startswith(prefix), lambda string, prefix: string[len(prefix):]), (language_word.next_word, language_word, - self.suffixes_map, + dict(subtitle_language=subtitle_suffixes, language=lang_suffixes), lambda string, suffix: string.endswith(suffix), lambda string, suffix: string[:len(string) - len(suffix)]) ] @@ -289,7 +271,7 @@ class LanguageFinder(object): if match: yield match - def find_match_for_word(self, word, fallback_word, affixes, is_affix, strip_affix): # pylint:disable=inconsistent-return-statements + def find_match_for_word(self, word, fallback_word, affixes, is_affix, strip_affix): """ Return the language match for the given word and affixes. """ @@ -298,6 +280,8 @@ class LanguageFinder(object): continue word_lang = current_word.value.lower() + if word_lang in self.common_words: + continue for key, parts in affixes.items(): for part in parts: @@ -307,31 +291,30 @@ class LanguageFinder(object): match = None value = strip_affix(word_lang, part) if not value: - if fallback_word and ( - abs(fallback_word.start - word.end) <= 1 or abs(word.start - fallback_word.end) <= 1): - match = self.find_language_match_for_word(fallback_word, key=key) + if fallback_word: + match = self.find_language_match_for_word(fallback_word, key=key, force=True) - if not match and part not in self.weak_affixes: + if not match and part not in weak_prefixes: match = self.create_language_match(key, LanguageWord(current_word.start, current_word.end, 'und', current_word.input_string)) - else: + elif value not in self.common_words: match = self.create_language_match(key, LanguageWord(current_word.start, current_word.end, value, current_word.input_string)) if match: return match - def find_language_match_for_word(self, word, key='language'): # pylint:disable=inconsistent-return-statements + def find_language_match_for_word(self, word, key='language', force=False): """ Return the language match for the given word. """ for current_word in (word.extended_word, word): - if current_word: + if current_word and (force or current_word.value.lower() not in self.common_words): match = self.create_language_match(key, current_word) if match: return match - def create_language_match(self, key, word): # pylint:disable=inconsistent-return-statements + def create_language_match(self, key, word): """ Create a LanguageMatch for a given word """ @@ -340,21 +323,40 @@ class LanguageFinder(object): if lang is not None: return _LanguageMatch(property_name=key, word=word, lang=lang) - def parse_language(self, lang_word): # pylint:disable=inconsistent-return-statements + def parse_language(self, lang_word): """ Parse the lang_word into a valid Language. Multi and Undetermined languages are also valid languages. """ + if lang_word in self.parsed: + return self.parsed[lang_word] + try: lang = babelfish.Language.fromguessit(lang_word) - if ((hasattr(lang, 'name') and lang.name.lower() in self.allowed_languages) or - (hasattr(lang, 'alpha2') and lang.alpha2.lower() in self.allowed_languages) or - lang.alpha3.lower() in self.allowed_languages): + if self.allowed_languages: + if (hasattr(lang, 'name') and lang.name.lower() in self.allowed_languages) \ + or (hasattr(lang, 'alpha2') and lang.alpha2.lower() in self.allowed_languages) \ + or lang.alpha3.lower() in self.allowed_languages: + self.parsed[lang_word] = lang + return lang + # Keep language with alpha2 equivalent. Others are probably + # uncommon languages. + elif lang in ('mul', UNDETERMINED) or hasattr(lang, 'alpha2'): + self.parsed[lang_word] = lang return lang + self.parsed[lang_word] = None except babelfish.Error: - pass + self.parsed[lang_word] = None + + +def find_languages(string, context=None): + """Find languages in the string + + :return: list of tuple (property, Language, lang_word, word) + """ + return LanguageFinder(context.get('allowed_languages')).find(string) class SubtitlePrefixLanguageRule(Rule): @@ -365,9 +367,6 @@ class SubtitlePrefixLanguageRule(Rule): properties = {'subtitle_language': [None]} - def enabled(self, context): - return not is_disabled(context, 'subtitle_language') - def when(self, matches, context): to_rename = [] to_remove = matches.named('subtitle_language.prefix') @@ -413,9 +412,6 @@ class SubtitleSuffixLanguageRule(Rule): properties = {'subtitle_language': [None]} - def enabled(self, context): - return not is_disabled(context, 'subtitle_language') - def when(self, matches, context): to_append = [] to_remove = matches.named('subtitle_language.suffix') @@ -440,64 +436,17 @@ class SubtitleExtensionRule(Rule): """ Convert language guess as subtitle_language if next match is a subtitle extension. - Since it's a strong match, it also removes any conflicting source with it. + Since it's a strong match, it also removes any conflicting format with it. """ consequence = [RemoveMatch, RenameMatch('subtitle_language')] properties = {'subtitle_language': [None]} - def enabled(self, context): - return not is_disabled(context, 'subtitle_language') - - def when(self, matches, context): # pylint:disable=inconsistent-return-statements + def when(self, matches, context): subtitle_extension = matches.named('container', lambda match: 'extension' in match.tags and 'subtitle' in match.tags, 0) if subtitle_extension: subtitle_lang = matches.previous(subtitle_extension, lambda match: match.name == 'language', 0) if subtitle_lang: - for weak in matches.named('subtitle_language', predicate=lambda m: 'weak-language' in m.tags): - weak.private = True - - return matches.conflicting(subtitle_lang, lambda m: m.name == 'source'), subtitle_lang - - -class RemoveLanguage(Rule): - """Remove language matches that were not converted to subtitle_language when language is disabled.""" - - consequence = RemoveMatch - - def enabled(self, context): - return is_disabled(context, 'language') - - def when(self, matches, context): - return matches.named('language') - - -class RemoveInvalidLanguages(Rule): - """Remove language matches that matches the blacklisted common words.""" - - consequence = RemoveMatch - - def __init__(self, common_words): - """Constructor.""" - super(RemoveInvalidLanguages, self).__init__() - self.common_words = common_words - - def when(self, matches, context): - to_remove = [] - for match in matches.range(0, len(matches.input_string), - predicate=lambda m: m.name in ('language', 'subtitle_language')): - if match.raw.lower() not in self.common_words: - continue - - group = matches.markers.at_match(match, index=0, predicate=lambda m: m.name == 'group') - if group and ( - not matches.range( - group.start, group.end, predicate=lambda m: m.name not in ('language', 'subtitle_language') - ) and (not matches.holes(group.start, group.end, predicate=lambda m: m.value.strip(seps)))): - continue - - to_remove.append(match) - - return to_remove + return matches.conflicting(subtitle_lang, lambda m: m.name == 'format'), subtitle_lang diff --git a/libs/guessit/rules/properties/mimetype.py b/libs/guessit/rules/properties/mimetype.py index f9e642ffa..c57ada778 100644 --- a/libs/guessit/rules/properties/mimetype.py +++ b/libs/guessit/rules/properties/mimetype.py @@ -8,23 +8,16 @@ import mimetypes from rebulk import Rebulk, CustomRule, POST_PROCESS from rebulk.match import Match -from ..common.pattern import is_disabled from ...rules.processors import Processors -def mimetype(config): # pylint:disable=unused-argument +def mimetype(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'mimetype')) - rebulk.rules(Mimetype) - - return rebulk + return Rebulk().rules(Mimetype) class Mimetype(CustomRule): diff --git a/libs/guessit/rules/properties/other.py b/libs/guessit/rules/properties/other.py index b3d49caa5..5fead16ef 100644 --- a/libs/guessit/rules/properties/other.py +++ b/libs/guessit/rules/properties/other.py @@ -5,43 +5,38 @@ other property """ import copy -from rebulk import Rebulk, Rule, RemoveMatch, RenameMatch, POST_PROCESS, AppendMatch +from rebulk import Rebulk, Rule, RemoveMatch, POST_PROCESS, AppendMatch from rebulk.remodule import re from ..common import dash from ..common import seps -from ..common.pattern import is_disabled from ..common.validators import seps_after, seps_before, seps_surround, compose from ...reutils import build_or_pattern from ...rules.common.formatters import raw_cleanup -def other(config): # pylint:disable=unused-argument +def other(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'other')) - rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]).string_defaults(ignore_case=True) + rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]).string_defaults(ignore_case=True) rebulk.defaults(name="other", validator=seps_surround) - rebulk.regex('Audio-?Fix', 'Audio-?Fixed', value='Audio Fixed') - rebulk.regex('Sync-?Fix', 'Sync-?Fixed', value='Sync Fixed') - rebulk.regex('Dual', 'Dual-?Audio', value='Dual Audio') - rebulk.regex('ws', 'wide-?screen', value='Widescreen') - rebulk.regex('Re-?Enc(?:oded)?', value='Reencoded') + rebulk.regex('Audio-?Fix', 'Audio-?Fixed', value='AudioFix') + rebulk.regex('Sync-?Fix', 'Sync-?Fixed', value='SyncFix') + rebulk.regex('Dual', 'Dual-?Audio', value='DualAudio') + rebulk.regex('ws', 'wide-?screen', value='WideScreen') + rebulk.regex('Re-?Enc(?:oded)?', value='ReEncoded') rebulk.string('Real', 'Fix', 'Fixed', value='Proper', tags=['has-neighbor-before', 'has-neighbor-after']) rebulk.string('Proper', 'Repack', 'Rerip', 'Dirfix', 'Nfofix', 'Prooffix', value='Proper', tags=['streaming_service.prefix', 'streaming_service.suffix']) rebulk.regex('(?:Proof-?)?Sample-?Fix', value='Proper', tags=['streaming_service.prefix', 'streaming_service.suffix']) - rebulk.string('Fansub', value='Fan Subtitled', tags='has-neighbor') - rebulk.string('Fastsub', value='Fast Subtitled', tags='has-neighbor') + rebulk.string('Fansub', value='Fansub', tags='has-neighbor') + rebulk.string('Fastsub', value='Fastsub', tags='has-neighbor') season_words = build_or_pattern(["seasons?", "series?"]) complete_articles = build_or_pattern(["The"]) @@ -66,38 +61,29 @@ def other(config): # pylint:disable=unused-argument value={'other': 'Complete'}, tags=['release-group-prefix'], validator={'__parent__': compose(seps_surround, validate_complete)}) - rebulk.string('R5', value='Region 5') - rebulk.string('RC', value='Region C') + rebulk.string('R5', 'RC', value='R5') rebulk.regex('Pre-?Air', value='Preair') rebulk.regex('(?:PS-?)?Vita', value='PS Vita') - rebulk.regex('(HD)(?P<another>Rip)', value={'other': 'HD', 'another': 'Rip'}, - private_parent=True, children=True, validator={'__parent__': seps_surround}, validate_all=True) - for value in ('Screener', 'Remux', '3D', 'PAL', 'SECAM', 'NTSC', 'XXX'): + for value in ( + 'Screener', 'Remux', '3D', 'mHD', 'HDLight', 'HQ', 'DDC', 'HR', 'PAL', 'SECAM', 'NTSC', + 'CC', 'LD', 'MD', 'XXX'): rebulk.string(value, value=value) - rebulk.string('HQ', value='High Quality', tags='uhdbluray-neighbor') - rebulk.string('HR', value='High Resolution') - rebulk.string('LD', value='Line Dubbed') - rebulk.string('MD', value='Mic Dubbed') - rebulk.string('mHD', 'HDLight', value='Micro HD') - rebulk.string('LDTV', value='Low Definition') - rebulk.string('HFR', value='High Frame Rate') + rebulk.string('LDTV', value='LD') rebulk.string('HD', value='HD', validator=None, tags=['streaming_service.prefix', 'streaming_service.suffix']) - rebulk.regex('Full-?HD', 'FHD', value='Full HD', validator=None, + rebulk.regex('Full-?HD', 'FHD', value='FullHD', validator=None, tags=['streaming_service.prefix', 'streaming_service.suffix']) - rebulk.regex('Ultra-?(?:HD)?', 'UHD', value='Ultra HD', validator=None, + rebulk.regex('Ultra-?(?:HD)?', 'UHD', value='UltraHD', validator=None, tags=['streaming_service.prefix', 'streaming_service.suffix']) - rebulk.regex('Upscaled?', value='Upscaled') - for value in ('Complete', 'Classic', 'Bonus', 'Trailer', 'Retail', + for value in ('Complete', 'Classic', 'LiNE', 'Bonus', 'Trailer', 'FINAL', 'Retail', 'Colorized', 'Internal'): rebulk.string(value, value=value, tags=['has-neighbor', 'release-group-prefix']) - rebulk.regex('LiNE', value='Line Audio', tags=['has-neighbor-before', 'has-neighbor-after', 'release-group-prefix']) rebulk.regex('Read-?NFO', value='Read NFO') rebulk.string('CONVERT', value='Converted', tags='has-neighbor') - rebulk.string('DOCU', 'DOKU', value='Documentary', tags='has-neighbor') + rebulk.string('DOCU', value='Documentary', tags='has-neighbor') rebulk.string('OM', value='Open Matte', tags='has-neighbor') rebulk.string('STV', value='Straight to Video', tags='has-neighbor') rebulk.string('OAR', value='Original Aspect Ratio', tags='has-neighbor') @@ -106,28 +92,16 @@ def other(config): # pylint:disable=unused-argument for coast in ('East', 'West'): rebulk.regex(r'(?:Live-)?(?:Episode-)?' + coast + '-?(?:Coast-)?Feed', value=coast + ' Coast Feed') - rebulk.string('VO', 'OV', value='Original Video', tags='has-neighbor') - rebulk.string('Ova', 'Oav', value='Original Animated Video') + rebulk.string('VO', 'OV', value='OV', tags='has-neighbor') rebulk.regex('Scr(?:eener)?', value='Screener', validator=None, - tags=['other.validate.screener', 'source-prefix', 'source-suffix']) + tags=['other.validate.screener', 'format-prefix', 'format-suffix']) rebulk.string('Mux', value='Mux', validator=seps_after, - tags=['other.validate.mux', 'video-codec-prefix', 'source-suffix']) - rebulk.string('HC', 'vost', value='Hardcoded Subtitles') - - rebulk.string('SDR', value='Standard Dynamic Range', tags='uhdbluray-neighbor') - rebulk.regex('HDR(?:10)?', value='HDR10', tags='uhdbluray-neighbor') - rebulk.regex('Dolby-?Vision', value='Dolby Vision', tags='uhdbluray-neighbor') - rebulk.regex('BT-?2020', value='BT.2020', tags='uhdbluray-neighbor') + tags=['other.validate.mux', 'video-codec-prefix', 'format-suffix']) + rebulk.string('HC', value='Hardcoded Subtitles') - rebulk.string('Sample', value='Sample', tags=['at-end', 'not-a-release-group']) - rebulk.string('Proof', value='Proof', tags=['at-end', 'not-a-release-group']) - rebulk.string('Obfuscated', 'Scrambled', value='Obfuscated', tags=['at-end', 'not-a-release-group']) - rebulk.string('xpost', 'postbot', 'asrequested', value='Repost', tags='not-a-release-group') - - rebulk.rules(RenameAnotherToOther, ValidateHasNeighbor, ValidateHasNeighborAfter, ValidateHasNeighborBefore, - ValidateScreenerRule, ValidateMuxRule, ValidateHardcodedSubs, ValidateStreamingServiceNeighbor, - ValidateAtEnd, ProperCountRule) + rebulk.rules(ValidateHasNeighbor, ValidateHasNeighborAfter, ValidateHasNeighborBefore, ValidateScreenerRule, + ValidateMuxRule, ValidateHardcodedSubs, ValidateStreamingServiceNeighbor, ProperCountRule) return rebulk @@ -142,7 +116,7 @@ class ProperCountRule(Rule): properties = {'proper_count': [None]} - def when(self, matches, context): # pylint:disable=inconsistent-return-statements + def when(self, matches, context): propers = matches.named('other', lambda match: match.value == 'Proper') if propers: raws = {} # Count distinct raw values @@ -154,23 +128,11 @@ class ProperCountRule(Rule): return proper_count_match -class RenameAnotherToOther(Rule): - """ - Rename `another` properties to `other` - """ - priority = 32 - consequence = RenameMatch('other') - - def when(self, matches, context): - return matches.named('another') - - class ValidateHasNeighbor(Rule): """ Validate tag has-neighbor """ consequence = RemoveMatch - priority = 64 def when(self, matches, context): ret = [] @@ -196,7 +158,6 @@ class ValidateHasNeighborBefore(Rule): Validate tag has-neighbor-before that previous match exists. """ consequence = RemoveMatch - priority = 64 def when(self, matches, context): ret = [] @@ -216,7 +177,6 @@ class ValidateHasNeighborAfter(Rule): Validate tag has-neighbor-after that next match exists. """ consequence = RemoveMatch - priority = 64 def when(self, matches, context): ret = [] @@ -241,8 +201,8 @@ class ValidateScreenerRule(Rule): def when(self, matches, context): ret = [] for screener in matches.named('other', lambda match: 'other.validate.screener' in match.tags): - source_match = matches.previous(screener, lambda match: match.initiator.name == 'source', 0) - if not source_match or matches.input_string[source_match.end:screener.start].strip(seps): + format_match = matches.previous(screener, lambda match: match.name == 'format', 0) + if not format_match or matches.input_string[format_match.end:screener.start].strip(seps): ret.append(screener) return ret @@ -257,8 +217,8 @@ class ValidateMuxRule(Rule): def when(self, matches, context): ret = [] for mux in matches.named('other', lambda match: 'other.validate.mux' in match.tags): - source_match = matches.previous(mux, lambda match: match.initiator.name == 'source', 0) - if not source_match: + format_match = matches.previous(mux, lambda match: match.name == 'format', 0) + if not format_match: ret.append(mux) return ret @@ -297,18 +257,16 @@ class ValidateStreamingServiceNeighbor(Rule): def when(self, matches, context): to_remove = [] for match in matches.named('other', - predicate=lambda m: (m.initiator.name != 'source' - and ('streaming_service.prefix' in m.tags - or 'streaming_service.suffix' in m.tags))): - match = match.initiator + predicate=lambda m: ('streaming_service.prefix' in m.tags or + 'streaming_service.suffix' in m.tags)): + if not seps_after(match): if 'streaming_service.prefix' in match.tags: next_match = matches.next(match, lambda m: m.name == 'streaming_service', 0) if next_match and not matches.holes(match.end, next_match.start, predicate=lambda m: m.value.strip(seps)): continue - if match.children: - to_remove.extend(match.children) + to_remove.append(match) elif not seps_before(match): @@ -318,27 +276,6 @@ class ValidateStreamingServiceNeighbor(Rule): predicate=lambda m: m.value.strip(seps)): continue - if match.children: - to_remove.extend(match.children) to_remove.append(match) return to_remove - - -class ValidateAtEnd(Rule): - """Validate other which should occur at the end of a filepart.""" - - priority = 32 - consequence = RemoveMatch - - def when(self, matches, context): - to_remove = [] - for filepart in matches.markers.named('path'): - for match in matches.range(filepart.start, filepart.end, - predicate=lambda m: m.name == 'other' and 'at-end' in m.tags): - if (matches.holes(match.end, filepart.end, predicate=lambda m: m.value.strip(seps)) or - matches.range(match.end, filepart.end, predicate=lambda m: m.name not in ( - 'other', 'container'))): - to_remove.append(match) - - return to_remove diff --git a/libs/guessit/rules/properties/part.py b/libs/guessit/rules/properties/part.py index ec038b187..d274f7fbb 100644 --- a/libs/guessit/rules/properties/part.py +++ b/libs/guessit/rules/properties/part.py @@ -7,25 +7,20 @@ from rebulk.remodule import re from rebulk import Rebulk from ..common import dash -from ..common.pattern import is_disabled from ..common.validators import seps_surround, int_coercable, compose from ..common.numeral import numeral, parse_numeral from ...reutils import build_or_pattern -def part(config): # pylint:disable=unused-argument +def part(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'part')) - rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash], validator={'__parent__': seps_surround}) + rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE, abbreviations=[dash], validator={'__parent__': seps_surround}) - prefixes = config['prefixes'] + prefixes = ['pt', 'part'] def validate_roman(match): """ diff --git a/libs/guessit/rules/properties/release_group.py b/libs/guessit/rules/properties/release_group.py index 5144a9024..ace3f0eb3 100644 --- a/libs/guessit/rules/properties/release_group.py +++ b/libs/guessit/rules/properties/release_group.py @@ -6,53 +6,22 @@ release_group property import copy from rebulk import Rebulk, Rule, AppendMatch, RemoveMatch -from rebulk.match import Match from ..common import seps from ..common.expected import build_expected_function from ..common.comparators import marker_sorted from ..common.formatters import cleanup -from ..common.pattern import is_disabled from ..common.validators import int_coercable, seps_surround from ..properties.title import TitleFromPosition -def release_group(config): +def release_group(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - forbidden_groupnames = config['forbidden_names'] - - groupname_ignore_seps = config['ignored_seps'] - groupname_seps = ''.join([c for c in seps if c not in groupname_ignore_seps]) - - def clean_groupname(string): - """ - Removes and strip separators from input_string - :param string: - :type string: - :return: - :rtype: - """ - string = string.strip(groupname_seps) - if not (string.endswith(tuple(groupname_ignore_seps)) and string.startswith(tuple(groupname_ignore_seps))) \ - and not any(i in string.strip(groupname_ignore_seps) for i in groupname_ignore_seps): - string = string.strip(groupname_ignore_seps) - for forbidden in forbidden_groupnames: - if string.lower().startswith(forbidden) and string[len(forbidden):len(forbidden) + 1] in seps: - string = string[len(forbidden):] - string = string.strip(groupname_seps) - if string.lower().endswith(forbidden) and string[-len(forbidden) - 1:-len(forbidden)] in seps: - string = string[:len(forbidden)] - string = string.strip(groupname_seps) - return string - - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'release_group')) + rebulk = Rebulk() expected_group = build_expected_function('expected_group') @@ -61,135 +30,42 @@ def release_group(config): conflict_solver=lambda match, other: other, disabled=lambda context: not context.get('expected_group')) - return rebulk.rules( - DashSeparatedReleaseGroup(clean_groupname), - SceneReleaseGroup(clean_groupname), - AnimeReleaseGroup - ) + return rebulk.rules(SceneReleaseGroup, AnimeReleaseGroup) -_scene_previous_names = ('video_codec', 'source', 'video_api', 'audio_codec', 'audio_profile', 'video_profile', - 'audio_channels', 'screen_size', 'other', 'container', 'language', 'subtitle_language', - 'subtitle_language.suffix', 'subtitle_language.prefix', 'language.suffix') +forbidden_groupnames = ['rip', 'by', 'for', 'par', 'pour', 'bonus'] -_scene_previous_tags = ('release-group-prefix', ) +groupname_ignore_seps = '[]{}()' +groupname_seps = ''.join([c for c in seps if c not in groupname_ignore_seps]) -class DashSeparatedReleaseGroup(Rule): +def clean_groupname(string): """ - Detect dash separated release groups that might appear at the end or at the beginning of a release name. - - Series.S01E02.Pilot.DVDRip.x264-CS.mkv - release_group: CS - abc-the.title.name.1983.1080p.bluray.x264.mkv - release_group: abc - - At the end: Release groups should be dash-separated and shouldn't contain spaces nor - appear in a group with other matches. The preceding matches should be separated by dot. - If a release group is found, the conflicting matches are removed. - - At the beginning: Release groups should be dash-separated and shouldn't contain spaces nor appear in a group. - It should be followed by a hole with dot-separated words. - Detection only happens if no matches exist at the beginning. + Removes and strip separators from input_string + :param string: + :type string: + :return: + :rtype: """ - consequence = [RemoveMatch, AppendMatch] - - def __init__(self, value_formatter): - """Default constructor.""" - super(DashSeparatedReleaseGroup, self).__init__() - self.value_formatter = value_formatter - - @classmethod - def is_valid(cls, matches, candidate, start, end, at_end): # pylint:disable=inconsistent-return-statements - """ - Whether a candidate is a valid release group. - """ - if not at_end: - if len(candidate.value) <= 1: - return False - - if matches.markers.at_match(candidate, predicate=lambda m: m.name == 'group'): - return False - - first_hole = matches.holes(candidate.end, end, predicate=lambda m: m.start == candidate.end, index=0) - if not first_hole: - return False - - raw_value = first_hole.raw - return raw_value[0] == '-' and '-' not in raw_value[1:] and '.' in raw_value and ' ' not in raw_value - - group = matches.markers.at_match(candidate, predicate=lambda m: m.name == 'group', index=0) - if group and matches.at_match(group, predicate=lambda m: not m.private and m.span != candidate.span): - return False - - count = 0 - match = candidate - while match: - current = matches.range(start, match.start, index=-1, predicate=lambda m: not m.private) - if not current: - break - - separator = match.input_string[current.end:match.start] - if not separator and match.raw[0] == '-': - separator = '-' - - match = current - - if count == 0: - if separator != '-': - break - - count += 1 - continue - - if separator == '.': - return True - - def detect(self, matches, start, end, at_end): # pylint:disable=inconsistent-return-statements - """ - Detect release group at the end or at the beginning of a filepart. - """ - candidate = None - if at_end: - container = matches.ending(end, lambda m: m.name == 'container', index=0) - if container: - end = container.start - - candidate = matches.ending(end, index=0, predicate=( - lambda m: not m.private and not ( - m.name == 'other' and 'not-a-release-group' in m.tags - ) and '-' not in m.raw and m.raw.strip() == m.raw)) - - if not candidate: - if at_end: - candidate = matches.holes(start, end, seps=seps, index=-1, - predicate=lambda m: m.end == end and m.raw.strip(seps) and m.raw[0] == '-') - else: - candidate = matches.holes(start, end, seps=seps, index=0, - predicate=lambda m: m.start == start and m.raw.strip(seps)) - - if candidate and self.is_valid(matches, candidate, start, end, at_end): - return candidate - - def when(self, matches, context): # pylint:disable=inconsistent-return-statements - if matches.named('release_group'): - return - - to_remove = [] - to_append = [] - for filepart in matches.markers.named('path'): - candidate = self.detect(matches, filepart.start, filepart.end, True) - if candidate: - to_remove.extend(matches.at_match(candidate)) - else: - candidate = self.detect(matches, filepart.start, filepart.end, False) - - if candidate: - releasegroup = Match(candidate.start, candidate.end, name='release_group', - formatter=self.value_formatter, input_string=candidate.input_string) + string = string.strip(groupname_seps) + if not (string.endswith(tuple(groupname_ignore_seps)) and string.startswith(tuple(groupname_ignore_seps))) \ + and not any(i in string.strip(groupname_ignore_seps) for i in groupname_ignore_seps): + string = string.strip(groupname_ignore_seps) + for forbidden in forbidden_groupnames: + if string.lower().startswith(forbidden) and string[len(forbidden):len(forbidden)+1] in seps: + string = string[len(forbidden):] + string = string.strip(groupname_seps) + if string.lower().endswith(forbidden) and string[-len(forbidden)-1:-len(forbidden)] in seps: + string = string[:len(forbidden)] + string = string.strip(groupname_seps) + return string + + +_scene_previous_names = ['video_codec', 'format', 'video_api', 'audio_codec', 'audio_profile', 'video_profile', + 'audio_channels', 'screen_size', 'other', 'container', 'language', 'subtitle_language', + 'subtitle_language.suffix', 'subtitle_language.prefix', 'language.suffix'] - to_append.append(releasegroup) - return to_remove, to_append +_scene_previous_tags = ['release-group-prefix'] class SceneReleaseGroup(Rule): @@ -203,12 +79,7 @@ class SceneReleaseGroup(Rule): properties = {'release_group': [None]} - def __init__(self, value_formatter): - """Default constructor.""" - super(SceneReleaseGroup, self).__init__() - self.value_formatter = value_formatter - - def when(self, matches, context): # pylint:disable=too-many-locals + def when(self, matches, context): # If a release_group is found before, ignore this kind of release_group rule. ret = [] @@ -216,8 +87,6 @@ class SceneReleaseGroup(Rule): for filepart in marker_sorted(matches.markers.named('path'), matches): # pylint:disable=cell-var-from-loop start, end = filepart.span - if matches.named('release_group', predicate=lambda m: m.start >= start and m.end <= end): - continue titles = matches.named('title', predicate=lambda m: m.start >= start and m.end <= end) @@ -232,7 +101,7 @@ class SceneReleaseGroup(Rule): """ return match in titles[1:] - last_hole = matches.holes(start, end + 1, formatter=self.value_formatter, + last_hole = matches.holes(start, end + 1, formatter=clean_groupname, ignore=keep_only_first_title, predicate=lambda hole: cleanup(hole.value), index=-1) @@ -265,7 +134,7 @@ class SceneReleaseGroup(Rule): # if hole is inside a group marker with same value, remove [](){} ... group = matches.markers.at_match(last_hole, lambda marker: marker.name == 'group', 0) if group: - group.formatter = self.value_formatter + group.formatter = clean_groupname if group.value == last_hole.value: last_hole.start = group.start + 1 last_hole.end = group.end - 1 @@ -296,11 +165,11 @@ class AnimeReleaseGroup(Rule): # If a release_group is found before, ignore this kind of release_group rule. if matches.named('release_group'): - return to_remove, to_append + return if not matches.named('episode') and not matches.named('season') and matches.named('release_group'): # This doesn't seems to be an anime, and we already found another release_group. - return to_remove, to_append + return for filepart in marker_sorted(matches.markers.named('path'), matches): diff --git a/libs/guessit/rules/properties/screen_size.py b/libs/guessit/rules/properties/screen_size.py index 83a797c1f..b7732ab61 100644 --- a/libs/guessit/rules/properties/screen_size.py +++ b/libs/guessit/rules/properties/screen_size.py @@ -3,115 +3,67 @@ """ screen_size property """ -from rebulk.match import Match from rebulk.remodule import re -from rebulk import Rebulk, Rule, RemoveMatch, AppendMatch - -from ..common.pattern import is_disabled -from ..common.quantity import FrameRate +from rebulk import Rebulk, Rule, RemoveMatch from ..common.validators import seps_surround from ..common import dash, seps -from ...reutils import build_or_pattern -def screen_size(config): +def screen_size(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - interlaced = frozenset({res for res in config['interlaced']}) - progressive = frozenset({res for res in config['progressive']}) - frame_rates = [re.escape(rate) for rate in config['frame_rates']] - min_ar = config['min_ar'] - max_ar = config['max_ar'] - - rebulk = Rebulk() - rebulk = rebulk.string_defaults(ignore_case=True).regex_defaults(flags=re.IGNORECASE) - - rebulk.defaults(name='screen_size', validator=seps_surround, abbreviations=[dash], - disabled=lambda context: is_disabled(context, 'screen_size')) - - frame_rate_pattern = build_or_pattern(frame_rates, name='frame_rate') - interlaced_pattern = build_or_pattern(interlaced, name='height') - progressive_pattern = build_or_pattern(progressive, name='height') - - res_pattern = r'(?:(?P<width>\d{3,4})(?:x|\*))?' - rebulk.regex(res_pattern + interlaced_pattern + r'(?P<scan_type>i)' + frame_rate_pattern + '?') - rebulk.regex(res_pattern + progressive_pattern + r'(?P<scan_type>p)' + frame_rate_pattern + '?') - rebulk.regex(res_pattern + progressive_pattern + r'(?P<scan_type>p)?(?:hd)') - rebulk.regex(res_pattern + progressive_pattern + r'(?P<scan_type>p)?x?') - rebulk.string('4k', value='2160p') - rebulk.regex(r'(?P<width>\d{3,4})-?(?:x|\*)-?(?P<height>\d{3,4})', + def conflict_solver(match, other): + """ + Conflict solver for most screen_size. + """ + if other.name == 'screen_size': + if 'resolution' in other.tags: + # The chtouile to solve conflict in "720 x 432" string matching both 720p pattern + int_value = _digits_re.findall(match.raw)[-1] + if other.value.startswith(int_value): + return match + return other + return '__default__' + + rebulk = Rebulk().string_defaults(ignore_case=True).regex_defaults(flags=re.IGNORECASE) + rebulk.defaults(name="screen_size", validator=seps_surround, conflict_solver=conflict_solver) + + rebulk.regex(r"(?:\d{3,}(?:x|\*))?360(?:i|p?x?)", value="360p") + rebulk.regex(r"(?:\d{3,}(?:x|\*))?368(?:i|p?x?)", value="368p") + rebulk.regex(r"(?:\d{3,}(?:x|\*))?480(?:i|p?x?)", value="480p") + rebulk.regex(r"(?:\d{3,}(?:x|\*))?576(?:i|p?x?)", value="576p") + rebulk.regex(r"(?:\d{3,}(?:x|\*))?720(?:i|p?(?:50|60)?x?)", value="720p") + rebulk.regex(r"(?:\d{3,}(?:x|\*))?720(?:p(?:50|60)?x?)", value="720p") + rebulk.regex(r"(?:\d{3,}(?:x|\*))?720p?hd", value="720p") + rebulk.regex(r"(?:\d{3,}(?:x|\*))?900(?:i|p?x?)", value="900p") + rebulk.regex(r"(?:\d{3,}(?:x|\*))?1080i", value="1080i") + rebulk.regex(r"(?:\d{3,}(?:x|\*))?1080p?x?", value="1080p") + rebulk.regex(r"(?:\d{3,}(?:x|\*))?1080(?:p(?:50|60)?x?)", value="1080p") + rebulk.regex(r"(?:\d{3,}(?:x|\*))?1080p?hd", value="1080p") + rebulk.regex(r"(?:\d{3,}(?:x|\*))?2160(?:i|p?x?)", value="4K") + rebulk.string('4k', value='4K') + + _digits_re = re.compile(r'\d+') + + rebulk.defaults(name="screen_size", validator=seps_surround) + rebulk.regex(r'\d{3,}-?(?:x|\*)-?\d{3,}', + formatter=lambda value: 'x'.join(_digits_re.findall(value)), + abbreviations=[dash], + tags=['resolution'], conflict_solver=lambda match, other: '__default__' if other.name == 'screen_size' else other) - rebulk.regex(frame_rate_pattern + '(p|fps)', name='frame_rate', - formatter=FrameRate.fromstring, disabled=lambda context: is_disabled(context, 'frame_rate')) - - rebulk.rules(PostProcessScreenSize(progressive, min_ar, max_ar), ScreenSizeOnlyOne, ResolveScreenSizeConflicts) + rebulk.rules(ScreenSizeOnlyOne, RemoveScreenSizeConflicts) return rebulk -class PostProcessScreenSize(Rule): - """ - Process the screen size calculating the aspect ratio if available. - - Convert to a standard notation (720p, 1080p, etc) when it's a standard resolution and - aspect ratio is valid or not available. - - It also creates an aspect_ratio match when available. - """ - consequence = AppendMatch - - def __init__(self, standard_heights, min_ar, max_ar): - super(PostProcessScreenSize, self).__init__() - self.standard_heights = standard_heights - self.min_ar = min_ar - self.max_ar = max_ar - - def when(self, matches, context): - to_append = [] - for match in matches.named('screen_size'): - if not is_disabled(context, 'frame_rate'): - for frame_rate in match.children.named('frame_rate'): - frame_rate.formatter = FrameRate.fromstring - to_append.append(frame_rate) - - values = match.children.to_dict() - if 'height' not in values: - continue - - scan_type = (values.get('scan_type') or 'p').lower() - height = values['height'] - if 'width' not in values: - match.value = '{0}{1}'.format(height, scan_type) - continue - - width = values['width'] - calculated_ar = float(width) / float(height) - - aspect_ratio = Match(match.start, match.end, input_string=match.input_string, - name='aspect_ratio', value=round(calculated_ar, 3)) - - if not is_disabled(context, 'aspect_ratio'): - to_append.append(aspect_ratio) - - if height in self.standard_heights and self.min_ar < calculated_ar < self.max_ar: - match.value = '{0}{1}'.format(height, scan_type) - else: - match.value = '{0}x{1}'.format(width, height) - - return to_append - - class ScreenSizeOnlyOne(Rule): """ - Keep a single screen_size per filepath part. + Keep a single screen_size pet filepath part. """ consequence = RemoveMatch @@ -120,15 +72,15 @@ class ScreenSizeOnlyOne(Rule): for filepart in matches.markers.named('path'): screensize = list(reversed(matches.range(filepart.start, filepart.end, lambda match: match.name == 'screen_size'))) - if len(screensize) > 1 and len(set((match.value for match in screensize))) > 1: + if len(screensize) > 1: to_remove.extend(screensize[1:]) return to_remove -class ResolveScreenSizeConflicts(Rule): +class RemoveScreenSizeConflicts(Rule): """ - Resolve screen_size conflicts with season and episode matches. + Remove season and episode matches which conflicts with screen_size match. """ consequence = RemoveMatch @@ -143,21 +95,14 @@ class ResolveScreenSizeConflicts(Rule): if not conflicts: continue - has_neighbor = False video_profile = matches.range(screensize.end, filepart.end, lambda match: match.name == 'video_profile', 0) if video_profile and not matches.holes(screensize.end, video_profile.start, predicate=lambda h: h.value and h.value.strip(seps)): to_remove.extend(conflicts) - has_neighbor = True - previous = matches.previous(screensize, index=0, predicate=( - lambda m: m.name in ('date', 'source', 'other', 'streaming_service'))) - if previous and not matches.holes(previous.end, screensize.start, - predicate=lambda h: h.value and h.value.strip(seps)): + date = matches.previous(screensize, lambda match: match.name == 'date', 0) + if date and not matches.holes(date.end, screensize.start, + predicate=lambda h: h.value and h.value.strip(seps)): to_remove.extend(conflicts) - has_neighbor = True - - if not has_neighbor: - to_remove.append(screensize) return to_remove diff --git a/libs/guessit/rules/properties/size.py b/libs/guessit/rules/properties/size.py index c61580c04..84f0303ca 100644 --- a/libs/guessit/rules/properties/size.py +++ b/libs/guessit/rules/properties/size.py @@ -7,24 +7,23 @@ import re from rebulk import Rebulk -from ..common import dash -from ..common.quantity import Size -from ..common.pattern import is_disabled from ..common.validators import seps_surround +from ..common import dash -def size(config): # pylint:disable=unused-argument +def size(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'size')) - rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) + + def format_size(value): + """Format size using uppercase and no space.""" + return re.sub(r'(?<=\d)[.](?=[^\d])', '', value.upper()) + + rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) rebulk.defaults(name='size', validator=seps_surround) - rebulk.regex(r'\d+-?[mgt]b', r'\d+\.\d+-?[mgt]b', formatter=Size.fromstring, tags=['release-group-prefix']) + rebulk.regex(r'\d+\.?[mgt]b', r'\d+\.\d+[mgt]b', formatter=format_size, tags=['release-group-prefix']) return rebulk diff --git a/libs/guessit/rules/properties/source.py b/libs/guessit/rules/properties/source.py deleted file mode 100644 index ae9a7b03a..000000000 --- a/libs/guessit/rules/properties/source.py +++ /dev/null @@ -1,201 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -source property -""" -import copy - -from rebulk.remodule import re - -from rebulk import AppendMatch, Rebulk, RemoveMatch, Rule - -from .audio_codec import HqConflictRule -from ..common import dash, seps -from ..common.pattern import is_disabled -from ..common.validators import seps_before, seps_after - - -def source(config): # pylint:disable=unused-argument - """ - Builder for rebulk object. - - :param config: rule configuration - :type config: dict - :return: Created Rebulk object - :rtype: Rebulk - """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'source')) - rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash], private_parent=True, children=True) - rebulk.defaults(name='source', tags=['video-codec-prefix', 'streaming_service.suffix']) - - rip_prefix = '(?P<other>Rip)-?' - rip_suffix = '-?(?P<other>Rip)' - rip_optional_suffix = '(?:' + rip_suffix + ')?' - - def build_source_pattern(*patterns, **kwargs): - """Helper pattern to build source pattern.""" - prefix_format = kwargs.get('prefix') or '' - suffix_format = kwargs.get('suffix') or '' - - string_format = prefix_format + '({0})' + suffix_format - return [string_format.format(pattern) for pattern in patterns] - - def demote_other(match, other): # pylint: disable=unused-argument - """Default conflict solver with 'other' property.""" - return other if other.name == 'other' else '__default__' - - rebulk.regex(*build_source_pattern('VHS', suffix=rip_optional_suffix), - value={'source': 'VHS', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('CAM', suffix=rip_optional_suffix), - value={'source': 'Camera', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('HD-?CAM', suffix=rip_optional_suffix), - value={'source': 'HD Camera', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('TELESYNC', 'TS', suffix=rip_optional_suffix), - value={'source': 'Telesync', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('HD-?TELESYNC', 'HD-?TS', suffix=rip_optional_suffix), - value={'source': 'HD Telesync', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('WORKPRINT', 'WP'), value='Workprint') - rebulk.regex(*build_source_pattern('TELECINE', 'TC', suffix=rip_optional_suffix), - value={'source': 'Telecine', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('HD-?TELECINE', 'HD-?TC', suffix=rip_optional_suffix), - value={'source': 'HD Telecine', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('PPV', suffix=rip_optional_suffix), - value={'source': 'Pay-per-view', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('SD-?TV', suffix=rip_optional_suffix), - value={'source': 'TV', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('TV', suffix=rip_suffix), # TV is too common to allow matching - value={'source': 'TV', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('TV', 'SD-?TV', prefix=rip_prefix), - value={'source': 'TV', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('TV-?(?=Dub)'), value='TV') - rebulk.regex(*build_source_pattern('DVB', 'PD-?TV', suffix=rip_optional_suffix), - value={'source': 'Digital TV', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('DVD', suffix=rip_optional_suffix), - value={'source': 'DVD', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('DM', suffix=rip_optional_suffix), - value={'source': 'Digital Master', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('VIDEO-?TS', 'DVD-?R(?:$|(?!E))', # 'DVD-?R(?:$|^E)' => DVD-Real ... - 'DVD-?9', 'DVD-?5'), value='DVD') - - rebulk.regex(*build_source_pattern('HD-?TV', suffix=rip_optional_suffix), conflict_solver=demote_other, - value={'source': 'HDTV', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('TV-?HD', suffix=rip_suffix), conflict_solver=demote_other, - value={'source': 'HDTV', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('TV', suffix='-?(?P<other>Rip-?HD)'), conflict_solver=demote_other, - value={'source': 'HDTV', 'other': 'Rip'}) - - rebulk.regex(*build_source_pattern('VOD', suffix=rip_optional_suffix), - value={'source': 'Video on Demand', 'other': 'Rip'}) - - rebulk.regex(*build_source_pattern('WEB', 'WEB-?DL', suffix=rip_suffix), - value={'source': 'Web', 'other': 'Rip'}) - # WEBCap is a synonym to WEBRip, mostly used by non english - rebulk.regex(*build_source_pattern('WEB-?(?P<another>Cap)', suffix=rip_optional_suffix), - value={'source': 'Web', 'other': 'Rip', 'another': 'Rip'}) - rebulk.regex(*build_source_pattern('WEB-?DL', 'WEB-?U?HD', 'WEB', 'DL-?WEB', 'DL(?=-?Mux)'), - value={'source': 'Web'}) - - rebulk.regex(*build_source_pattern('HD-?DVD', suffix=rip_optional_suffix), - value={'source': 'HD-DVD', 'other': 'Rip'}) - - rebulk.regex(*build_source_pattern('Blu-?ray', 'BD', 'BD[59]', 'BD25', 'BD50', suffix=rip_optional_suffix), - value={'source': 'Blu-ray', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('(?P<another>BR)-?(?=Scr(?:eener)?)', '(?P<another>BR)-?(?=Mux)'), # BRRip - value={'source': 'Blu-ray', 'another': 'Reencoded'}) - rebulk.regex(*build_source_pattern('(?P<another>BR)', suffix=rip_suffix), # BRRip - value={'source': 'Blu-ray', 'other': 'Rip', 'another': 'Reencoded'}) - - rebulk.regex(*build_source_pattern('Ultra-?Blu-?ray', 'Blu-?ray-?Ultra'), value='Ultra HD Blu-ray') - - rebulk.regex(*build_source_pattern('AHDTV'), value='Analog HDTV') - rebulk.regex(*build_source_pattern('UHD-?TV', suffix=rip_optional_suffix), conflict_solver=demote_other, - value={'source': 'Ultra HDTV', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('UHD', suffix=rip_suffix), conflict_solver=demote_other, - value={'source': 'Ultra HDTV', 'other': 'Rip'}) - - rebulk.regex(*build_source_pattern('DSR', 'DTH', suffix=rip_optional_suffix), - value={'source': 'Satellite', 'other': 'Rip'}) - rebulk.regex(*build_source_pattern('DSR?', 'SAT', suffix=rip_suffix), - value={'source': 'Satellite', 'other': 'Rip'}) - - rebulk.rules(ValidateSource, UltraHdBlurayRule) - - return rebulk - - -class UltraHdBlurayRule(Rule): - """ - Replace other:Ultra HD and source:Blu-ray with source:Ultra HD Blu-ray - """ - dependency = HqConflictRule - consequence = [RemoveMatch, AppendMatch] - - @classmethod - def find_ultrahd(cls, matches, start, end, index): - """Find Ultra HD match.""" - return matches.range(start, end, index=index, predicate=( - lambda m: not m.private and m.name == 'other' and m.value == 'Ultra HD' - )) - - @classmethod - def validate_range(cls, matches, start, end): - """Validate no holes or invalid matches exist in the specified range.""" - return ( - not matches.holes(start, end, predicate=lambda m: m.value.strip(seps)) and - not matches.range(start, end, predicate=( - lambda m: not m.private and ( - m.name not in ('screen_size', 'color_depth') and ( - m.name != 'other' or 'uhdbluray-neighbor' not in m.tags)))) - ) - - def when(self, matches, context): - to_remove = [] - to_append = [] - for filepart in matches.markers.named('path'): - for match in matches.range(filepart.start, filepart.end, predicate=( - lambda m: not m.private and m.name == 'source' and m.value == 'Blu-ray')): - other = self.find_ultrahd(matches, filepart.start, match.start, -1) - if not other or not self.validate_range(matches, other.end, match.start): - other = self.find_ultrahd(matches, match.end, filepart.end, 0) - if not other or not self.validate_range(matches, match.end, other.start): - if not matches.range(filepart.start, filepart.end, predicate=( - lambda m: m.name == 'screen_size' and m.value == '2160p')): - continue - - if other: - other.private = True - - new_source = copy.copy(match) - new_source.value = 'Ultra HD Blu-ray' - to_remove.append(match) - to_append.append(new_source) - - return to_remove, to_append - - -class ValidateSource(Rule): - """ - Validate source with screener property, with video_codec property or separated - """ - priority = 64 - consequence = RemoveMatch - - def when(self, matches, context): - ret = [] - for match in matches.named('source'): - match = match.initiator - if not seps_before(match) and \ - not matches.range(match.start - 1, match.start - 2, - lambda m: 'source-prefix' in m.tags): - if match.children: - ret.extend(match.children) - ret.append(match) - continue - if not seps_after(match) and \ - not matches.range(match.end, match.end + 1, - lambda m: 'source-suffix' in m.tags): - if match.children: - ret.extend(match.children) - ret.append(match) - continue - return ret diff --git a/libs/guessit/rules/properties/streaming_service.py b/libs/guessit/rules/properties/streaming_service.py index 1302befb0..b31690d33 100644 --- a/libs/guessit/rules/properties/streaming_service.py +++ b/libs/guessit/rules/properties/streaming_service.py @@ -8,150 +8,64 @@ import re from rebulk import Rebulk from rebulk.rules import Rule, RemoveMatch -from ..common.pattern import is_disabled from ...rules.common import seps, dash -from ...rules.common.validators import seps_before, seps_after -def streaming_service(config): # pylint: disable=too-many-statements,unused-argument +def streaming_service(): """Streaming service property. - :param config: rule configuration - :type config: dict :return: :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'streaming_service')) - rebulk = rebulk.string_defaults(ignore_case=True).regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) - rebulk.defaults(name='streaming_service', tags=['source-prefix']) + rebulk = Rebulk().string_defaults(ignore_case=True).regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) + rebulk.defaults(name='streaming_service', tags=['format-prefix']) rebulk.string('AE', 'A&E', value='A&E') rebulk.string('AMBC', value='ABC') - rebulk.string('AUBC', value='ABC Australia') - rebulk.string('AJAZ', value='Al Jazeera English') rebulk.string('AMC', value='AMC') - rebulk.string('AMZN', 'Amazon', value='Amazon Prime') - rebulk.regex('Amazon-?Prime', value='Amazon Prime') - rebulk.string('AS', value='Adult Swim') - rebulk.regex('Adult-?Swim', value='Adult Swim') - rebulk.string('ATK', value="America's Test Kitchen") - rebulk.string('ANPL', value='Animal Planet') - rebulk.string('ANLB', value='AnimeLab') - rebulk.string('AOL', value='AOL') - rebulk.string('ARD', value='ARD') - rebulk.string('iP', value='BBC iPlayer') - rebulk.regex('BBC-?iPlayer', value='BBC iPlayer') - rebulk.string('BRAV', value='BravoTV') - rebulk.string('CNLP', value='Canal+') - rebulk.string('CN', value='Cartoon Network') - rebulk.string('CBC', value='CBC') + rebulk.string('AMZN', 'AmazonPrime', value='Amazon Prime') + rebulk.regex('Amazon-Prime', value='Amazon Prime') + rebulk.string('AS', 'AdultSwim', value='Adult Swim') + rebulk.regex('Adult-Swim', value='Adult Swim') + rebulk.string('iP', 'BBCiPlayer', value='BBC iPlayer') + rebulk.regex('BBC-iPlayer', value='BBC iPlayer') rebulk.string('CBS', value='CBS') - rebulk.string('CNBC', value='CNBC') - rebulk.string('CC', value='Comedy Central') - rebulk.string('4OD', value='Channel 4') - rebulk.string('CHGD', value='CHRGD') - rebulk.string('CMAX', value='Cinemax') - rebulk.string('CMT', value='Country Music Television') - rebulk.regex('Comedy-?Central', value='Comedy Central') - rebulk.string('CCGC', value='Comedians in Cars Getting Coffee') - rebulk.string('CR', value='Crunchy Roll') - rebulk.string('CRKL', value='Crackle') - rebulk.regex('Crunchy-?Roll', value='Crunchy Roll') - rebulk.string('CSPN', value='CSpan') - rebulk.string('CTV', value='CTV') - rebulk.string('CUR', value='CuriosityStream') - rebulk.string('CWS', value='CWSeed') - rebulk.string('DSKI', value='Daisuki') - rebulk.string('DHF', value='Deadhouse Films') - rebulk.string('DDY', value='Digiturk Diledigin Yerde') + rebulk.string('CC', 'ComedyCentral', value='Comedy Central') + rebulk.regex('Comedy-Central', value='Comedy Central') + rebulk.string('CR', 'CrunchyRoll', value='Crunchy Roll') + rebulk.regex('Crunchy-Roll', value='Crunchy Roll') + rebulk.string('CW', 'TheCW', value='The CW') + rebulk.regex('The-CW', value='The CW') rebulk.string('DISC', 'Discovery', value='Discovery') - rebulk.string('DSNY', 'Disney', value='Disney') rebulk.string('DIY', value='DIY Network') - rebulk.string('DOCC', value='Doc Club') - rebulk.string('DPLY', value='DPlay') - rebulk.string('ETV', value='E!') - rebulk.string('EPIX', value='ePix') - rebulk.string('ETTV', value='El Trece') - rebulk.string('ESPN', value='ESPN') - rebulk.string('ESQ', value='Esquire') - rebulk.string('FAM', value='Family') - rebulk.string('FJR', value='Family Jr') - rebulk.string('FOOD', value='Food Network') - rebulk.string('FOX', value='Fox') - rebulk.string('FREE', value='Freeform') - rebulk.string('FYI', value='FYI Network') - rebulk.string('GLBL', value='Global') - rebulk.string('GLOB', value='GloboSat Play') - rebulk.string('HLMK', value='Hallmark') - rebulk.string('HBO', value='HBO Go') - rebulk.regex('HBO-?Go', value='HBO Go') - rebulk.string('HGTV', value='HGTV') + rebulk.string('DSNY', 'Disney', value='Disney') + rebulk.string('EPIX', 'ePix', value='ePix') + rebulk.string('HBO', 'HBOGo', value='HBO Go') + rebulk.regex('HBO-Go', value='HBO Go') rebulk.string('HIST', 'History', value='History') - rebulk.string('HULU', value='Hulu') rebulk.string('ID', value='Investigation Discovery') - rebulk.string('IFC', value='IFC') - rebulk.string('iTunes', 'iT', value='iTunes') - rebulk.string('ITV', value='ITV') - rebulk.string('KNOW', value='Knowledge Network') - rebulk.string('LIFE', value='Lifetime') - rebulk.string('MTOD', value='Motor Trend OnDemand') - rebulk.string('MNBC', value='MSNBC') - rebulk.string('MTV', value='MTV') - rebulk.string('NATG', value='National Geographic') - rebulk.regex('National-?Geographic', value='National Geographic') - rebulk.string('NBA', value='NBA TV') - rebulk.regex('NBA-?TV', value='NBA TV') + rebulk.string('IFC', 'IFC', value='IFC') + rebulk.string('PBS', 'PBS', value='PBS') + rebulk.string('NATG', 'NationalGeographic', value='National Geographic') + rebulk.regex('National-Geographic', value='National Geographic') + rebulk.string('NBA', 'NBATV', value='NBA TV') + rebulk.regex('NBA-TV', value='NBA TV') rebulk.string('NBC', value='NBC') - rebulk.string('NF', 'Netflix', value='Netflix') rebulk.string('NFL', value='NFL') - rebulk.string('NFLN', value='NFL Now') - rebulk.string('GC', value='NHL GameCenter') rebulk.string('NICK', 'Nickelodeon', value='Nickelodeon') - rebulk.string('NRK', value='Norsk Rikskringkasting') - rebulk.string('PBS', value='PBS') - rebulk.string('PBSK', value='PBS Kids') - rebulk.string('PSN', value='Playstation Network') - rebulk.string('PLUZ', value='Pluzz') - rebulk.string('RTE', value='RTE One') - rebulk.string('SBS', value='SBS (AU)') + rebulk.string('NF', 'Netflix', value='Netflix') + rebulk.string('iTunes', value='iTunes') + rebulk.string('RTE', value='RTÉ One') rebulk.string('SESO', 'SeeSo', value='SeeSo') - rebulk.string('SHMI', value='Shomi') - rebulk.string('SPIK', value='Spike') - rebulk.string('SPKE', value='Spike TV') - rebulk.regex('Spike-?TV', value='Spike TV') - rebulk.string('SNET', value='Sportsnet') - rebulk.string('SPRT', value='Sprout') - rebulk.string('STAN', value='Stan') - rebulk.string('STZ', value='Starz') - rebulk.string('SVT', value='Sveriges Television') - rebulk.string('SWER', value='SwearNet') - rebulk.string('SYFY', value='Syfy') - rebulk.string('TBS', value='TBS') - rebulk.string('TFOU', value='TFou') - rebulk.string('CW', value='The CW') - rebulk.regex('The-?CW', value='The CW') + rebulk.string('SPKE', 'SpikeTV', 'Spike TV', value='Spike TV') + rebulk.string('SYFY', 'Syfy', value='Syfy') + rebulk.string('TFOU', 'TFou', value='TFou') rebulk.string('TLC', value='TLC') - rebulk.string('TUBI', value='TubiTV') rebulk.string('TV3', value='TV3 Ireland') rebulk.string('TV4', value='TV4 Sweeden') - rebulk.string('TVL', value='TV Land') - rebulk.regex('TV-?Land', value='TV Land') + rebulk.string('TVL', 'TVLand', 'TV Land', value='TV Land') rebulk.string('UFC', value='UFC') - rebulk.string('UKTV', value='UKTV') - rebulk.string('UNIV', value='Univision') rebulk.string('USAN', value='USA Network') - rebulk.string('VLCT', value='Velocity') - rebulk.string('VH1', value='VH1') - rebulk.string('VICE', value='Viceland') - rebulk.string('VMEO', value='Vimeo') - rebulk.string('VRV', value='VRV') - rebulk.string('WNET', value='W Network') - rebulk.string('WME', value='WatchMe') - rebulk.string('WWEN', value='WWE Network') - rebulk.string('XBOX', value='Xbox Video') - rebulk.string('YHOO', value='Yahoo') - rebulk.string('RED', value='YouTube Red') - rebulk.string('ZDF', value='ZDF') rebulk.rules(ValidateStreamingService) @@ -165,7 +79,7 @@ class ValidateStreamingService(Rule): consequence = RemoveMatch def when(self, matches, context): - """Streaming service is always before source. + """Streaming service is always before format. :param matches: :type matches: rebulk.match.Matches @@ -179,20 +93,16 @@ class ValidateStreamingService(Rule): previous_match = matches.previous(service, lambda match: 'streaming_service.prefix' in match.tags, 0) has_other = service.initiator and service.initiator.children.named('other') - if not has_other: - if (not next_match or - matches.holes(service.end, next_match.start, - predicate=lambda match: match.value.strip(seps)) or - not seps_before(service)): - if (not previous_match or - matches.holes(previous_match.end, service.start, - predicate=lambda match: match.value.strip(seps)) or - not seps_after(service)): - to_remove.append(service) - continue + if not has_other and \ + (not next_match or matches.holes(service.end, next_match.start, + predicate=lambda match: match.value.strip(seps))) and \ + (not previous_match or matches.holes(previous_match.end, service.start, + predicate=lambda match: match.value.strip(seps))): + to_remove.append(service) + continue if service.value == 'Comedy Central': - # Current match is a valid streaming service, removing invalid Criterion Collection (CC) matches - to_remove.extend(matches.named('edition', predicate=lambda match: match.value == 'Criterion')) + # Current match is a valid streaming service, removing invalid closed caption (CC) matches + to_remove.extend(matches.named('other', predicate=lambda match: match.value == 'CC')) return to_remove diff --git a/libs/guessit/rules/properties/title.py b/libs/guessit/rules/properties/title.py index 798df1e2a..e87ceb6de 100644 --- a/libs/guessit/rules/properties/title.py +++ b/libs/guessit/rules/properties/title.py @@ -13,21 +13,16 @@ from ..common import seps, title_seps from ..common.comparators import marker_sorted from ..common.expected import build_expected_function from ..common.formatters import cleanup, reorder_title -from ..common.pattern import is_disabled from ..common.validators import seps_surround -def title(config): # pylint:disable=unused-argument +def title(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'title')) - rebulk.rules(TitleFromPosition, PreferTitleWithYear) + rebulk = Rebulk().rules(TitleFromPosition, PreferTitleWithYear) expected_title = build_expected_function('expected_title') @@ -99,7 +94,7 @@ class TitleBaseRule(Rule): Full word language and countries won't be ignored if they are uppercase. """ - return not (len(match) > 3 and match.raw.isupper()) and match.name in ('language', 'country', 'episode_details') + return not (len(match) > 3 and match.raw.isupper()) and match.name in ['language', 'country', 'episode_details'] def should_keep(self, match, to_keep, matches, filepart, hole, starting): """ @@ -119,7 +114,7 @@ class TitleBaseRule(Rule): :return: :rtype: """ - if match.name in ('language', 'country'): + if match.name in ['language', 'country']: # Keep language if exactly matching the hole. if len(hole.value) == len(match.raw): return True @@ -132,7 +127,7 @@ class TitleBaseRule(Rule): lambda c_match: c_match.name == match.name and c_match not in to_keep)) - if not other_languages and (not starting or len(match.raw) <= 3): + if not other_languages: return True return False @@ -150,7 +145,7 @@ class TitleBaseRule(Rule): return match.start >= hole.start and match.end <= hole.end return True - def check_titles_in_filepart(self, filepart, matches, context): # pylint:disable=inconsistent-return-statements + def check_titles_in_filepart(self, filepart, matches, context): """ Find title in filepart (ignoring language) """ @@ -159,11 +154,12 @@ class TitleBaseRule(Rule): holes = matches.holes(start, end + 1, formatter=formatters(cleanup, reorder_title), ignore=self.is_ignored, - predicate=lambda m: m.value) + predicate=lambda hole: hole.value) holes = self.holes_process(holes, matches) for hole in holes: + # pylint:disable=cell-var-from-loop if not hole or (self.hole_filter and not self.hole_filter(hole, matches)): continue @@ -174,8 +170,8 @@ class TitleBaseRule(Rule): if ignored_matches: for ignored_match in reversed(ignored_matches): - # pylint:disable=undefined-loop-variable, cell-var-from-loop - trailing = matches.chain_before(hole.end, seps, predicate=lambda m: m == ignored_match) + # pylint:disable=undefined-loop-variable + trailing = matches.chain_before(hole.end, seps, predicate=lambda match: match == ignored_match) if trailing: should_keep = self.should_keep(ignored_match, to_keep, matches, filepart, hole, False) if should_keep: @@ -192,7 +188,7 @@ class TitleBaseRule(Rule): for ignored_match in ignored_matches: if ignored_match not in to_keep: starting = matches.chain_after(hole.start, seps, - predicate=lambda m: m == ignored_match) + predicate=lambda match: match == ignored_match) if starting: should_keep = self.should_keep(ignored_match, to_keep, matches, filepart, hole, True) if should_keep: @@ -218,7 +214,7 @@ class TitleBaseRule(Rule): hole.tags = self.match_tags if self.alternative_match_name: # Split and keep values that can be a title - titles = hole.split(title_seps, lambda m: m.value) + titles = hole.split(title_seps, lambda match: match.value) for title_match in list(titles[1:]): previous_title = titles[titles.index(title_match) - 1] separator = matches.input_string[previous_title.end:title_match.start] @@ -235,15 +231,14 @@ class TitleBaseRule(Rule): return titles, to_remove def when(self, matches, context): - ret = [] - to_remove = [] - if matches.named(self.match_name, lambda match: 'expected' in match.tags): - return ret, to_remove + return fileparts = [filepart for filepart in list(marker_sorted(matches.markers.named('path'), matches)) if not self.filepart_filter or self.filepart_filter(filepart, matches)] + to_remove = [] + # Priorize fileparts containing the year years_fileparts = [] for filepart in fileparts: @@ -251,6 +246,7 @@ class TitleBaseRule(Rule): if year_match: years_fileparts.append(filepart) + ret = [] for filepart in fileparts: try: years_fileparts.remove(filepart) @@ -286,9 +282,6 @@ class TitleFromPosition(TitleBaseRule): def __init__(self): super(TitleFromPosition, self).__init__('title', ['title'], 'alternative_title') - def enabled(self, context): - return not is_disabled(context, 'alternative_title') - class PreferTitleWithYear(Rule): """ @@ -309,7 +302,7 @@ class PreferTitleWithYear(Rule): if filepart: year_match = matches.range(filepart.start, filepart.end, lambda match: match.name == 'year', 0) if year_match: - group = matches.markers.at_match(year_match, lambda m: m.name == 'group') + group = matches.markers.at_match(year_match, lambda group: group.name == 'group') if group: with_year_in_group.append(title_match) else: diff --git a/libs/guessit/rules/properties/type.py b/libs/guessit/rules/properties/type.py index 6a2877ef9..6d798b643 100644 --- a/libs/guessit/rules/properties/type.py +++ b/libs/guessit/rules/properties/type.py @@ -6,7 +6,6 @@ type property from rebulk import CustomRule, Rebulk, POST_PROCESS from rebulk.match import Match -from ..common.pattern import is_disabled from ...rules.processors import Processors @@ -20,19 +19,13 @@ def _type(matches, value): matches.append(Match(len(matches.input_string), len(matches.input_string), name='type', value=value)) -def type_(config): # pylint:disable=unused-argument +def type_(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'type')) - rebulk = rebulk.rules(TypeProcessor) - - return rebulk + return Rebulk().rules(TypeProcessor) class TypeProcessor(CustomRule): @@ -52,10 +45,9 @@ class TypeProcessor(CustomRule): episode = matches.named('episode') season = matches.named('season') - absolute_episode = matches.named('absolute_episode') episode_details = matches.named('episode_details') - if episode or season or episode_details or absolute_episode: + if episode or season or episode_details: return 'episode' film = matches.named('film') diff --git a/libs/guessit/rules/properties/video_codec.py b/libs/guessit/rules/properties/video_codec.py index 1f8f75d37..86661469c 100644 --- a/libs/guessit/rules/properties/video_codec.py +++ b/libs/guessit/rules/properties/video_codec.py @@ -8,62 +8,42 @@ from rebulk.remodule import re from rebulk import Rebulk, Rule, RemoveMatch from ..common import dash -from ..common.pattern import is_disabled from ..common.validators import seps_after, seps_before, seps_surround -def video_codec(config): # pylint:disable=unused-argument +def video_codec(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk() - rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]).string_defaults(ignore_case=True) - rebulk.defaults(name="video_codec", - tags=['source-suffix', 'streaming_service.suffix'], - disabled=lambda context: is_disabled(context, 'video_codec')) - - rebulk.regex(r'Rv\d{2}', value='RealVideo') - rebulk.regex('Mpe?g-?2', '[hx]-?262', value='MPEG-2') - rebulk.string("DVDivX", "DivX", value="DivX") - rebulk.string('XviD', value='Xvid') - rebulk.regex('VC-?1', value='VC-1') - rebulk.string('VP7', value='VP7') - rebulk.string('VP8', 'VP80', value='VP8') - rebulk.string('VP9', value='VP9') - rebulk.regex('[hx]-?263', value='H.263') - rebulk.regex('[hx]-?264(?:-?AVC(?:HD)?)?(?:-?SC)?', 'MPEG-?4(?:-?AVC(?:HD)?)', 'AVC(?:HD)?(?:-?SC)?', value='H.264') - rebulk.regex('[hx]-?265(?:-?HEVC)?', 'HEVC', value='H.265') - rebulk.regex('(?P<video_codec>hevc)(?P<color_depth>10)', value={'video_codec': 'H.265', 'color_depth': '10-bit'}, + rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]).string_defaults(ignore_case=True) + rebulk.defaults(name="video_codec", tags=['format-suffix', 'streaming_service.suffix']) + + rebulk.regex(r"Rv\d{2}", value="Real") + rebulk.regex("Mpeg2", value="Mpeg2") + rebulk.regex("DVDivX", "DivX", value="DivX") + rebulk.regex("XviD", value="XviD") + rebulk.regex("[hx]-?264(?:-?AVC(HD)?)?", "MPEG-?4(?:-?AVC(HD)?)", "AVC(?:HD)?", value="h264") + rebulk.regex("[hx]-?265(?:-?HEVC)?", "HEVC", value="h265") + rebulk.regex('(?P<video_codec>hevc)(?P<video_profile>10)', value={'video_codec': 'h265', 'video_profile': '10bit'}, tags=['video-codec-suffix'], children=True) # http://blog.mediacoderhq.com/h264-profiles-and-levels/ # http://fr.wikipedia.org/wiki/H.264 - rebulk.defaults(name="video_profile", - validator=seps_surround, - disabled=lambda context: is_disabled(context, 'video_profile')) - - rebulk.string('BP', value='Baseline', tags='video_profile.rule') - rebulk.string('XP', 'EP', value='Extended', tags='video_profile.rule') - rebulk.string('MP', value='Main', tags='video_profile.rule') - rebulk.string('HP', 'HiP', value='High', tags='video_profile.rule') - rebulk.regex('Hi422P', value='High 4:2:2') - rebulk.regex('Hi444PP', value='High 4:4:4 Predictive') - rebulk.regex('Hi10P?', value='High 10') # no profile validation is required - - rebulk.string('DXVA', value='DXVA', name='video_api', - disabled=lambda context: is_disabled(context, 'video_api')) - - rebulk.defaults(name='color_depth', - validator=seps_surround, - disabled=lambda context: is_disabled(context, 'color_depth')) - rebulk.regex('12.?bits?', value='12-bit') - rebulk.regex('10.?bits?', 'YUV420P10', 'Hi10P?', value='10-bit') - rebulk.regex('8.?bits?', value='8-bit') + rebulk.defaults(name="video_profile", validator=seps_surround) + + rebulk.regex('10.?bits?', 'Hi10P?', 'YUV420P10', value='10bit') + rebulk.regex('8.?bits?', value='8bit') + + rebulk.string('BP', value='BP', tags='video_profile.rule') + rebulk.string('XP', 'EP', value='XP', tags='video_profile.rule') + rebulk.string('MP', value='MP', tags='video_profile.rule') + rebulk.string('HP', 'HiP', value='HP', tags='video_profile.rule') + rebulk.regex('Hi422P', value='Hi422P', tags='video_profile.rule') + rebulk.regex('Hi444PP', value='Hi444PP', tags='video_profile.rule') + + rebulk.string('DXVA', value='DXVA', name='video_api') rebulk.rules(ValidateVideoCodec, VideoProfileRule) @@ -72,14 +52,11 @@ def video_codec(config): # pylint:disable=unused-argument class ValidateVideoCodec(Rule): """ - Validate video_codec with source property or separated + Validate video_codec with format property or separated """ priority = 64 consequence = RemoveMatch - def enabled(self, context): - return not is_disabled(context, 'video_codec') - def when(self, matches, context): ret = [] for codec in matches.named('video_codec'): @@ -100,9 +77,6 @@ class VideoProfileRule(Rule): """ consequence = RemoveMatch - def enabled(self, context): - return not is_disabled(context, 'video_profile') - def when(self, matches, context): profile_list = matches.named('video_profile', lambda match: 'video_profile.rule' in match.tags) ret = [] diff --git a/libs/guessit/rules/properties/website.py b/libs/guessit/rules/properties/website.py index 6df16be65..afca57abb 100644 --- a/libs/guessit/rules/properties/website.py +++ b/libs/guessit/rules/properties/website.py @@ -9,32 +9,28 @@ from rebulk.remodule import re from rebulk import Rebulk, Rule, RemoveMatch from ..common import seps from ..common.formatters import cleanup -from ..common.pattern import is_disabled from ..common.validators import seps_surround from ...reutils import build_or_pattern -def website(config): +def website(): """ Builder for rebulk object. - - :param config: rule configuration - :type config: dict :return: Created Rebulk object :rtype: Rebulk """ - rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'website')) - rebulk = rebulk.regex_defaults(flags=re.IGNORECASE).string_defaults(ignore_case=True) + rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE).string_defaults(ignore_case=True) rebulk.defaults(name="website") tlds = [l.strip().decode('utf-8') for l in resource_stream('guessit', 'tlds-alpha-by-domain.txt').readlines() if b'--' not in l][1:] # All registered domain extension - safe_tlds = config['safe_tlds'] # For sure a website extension - safe_subdomains = config['safe_subdomains'] # For sure a website subdomain - safe_prefix = config['safe_prefixes'] # Those words before a tlds are sure - website_prefixes = config['prefixes'] + safe_tlds = ['com', 'org', 'net'] # For sure a website extension + safe_subdomains = ['www'] # For sure a website subdomain + safe_prefix = ['co', 'com', 'org', 'net'] # Those words before a tlds are sure + + website_prefixes = ['from'] rebulk.regex(r'(?:[^a-z0-9]|^)((?:'+build_or_pattern(safe_subdomains) + r'\.)+(?:[a-z-]+\.)+(?:'+build_or_pattern(tlds) + diff --git a/libs/guessit/test/enable_disable_properties.yml b/libs/guessit/test/enable_disable_properties.yml deleted file mode 100644 index e330e37db..000000000 --- a/libs/guessit/test/enable_disable_properties.yml +++ /dev/null @@ -1,335 +0,0 @@ -? vorbis -: options: --exclude audio_codec - -audio_codec: Vorbis - -? DTS-ES -: options: --exclude audio_profile - audio_codec: DTS - -audio_profile: Extended Surround - -? DTS.ES -: options: --include audio_codec - audio_codec: DTS - -audio_profile: Extended Surround - -? 5.1 -? 5ch -? 6ch -: options: --exclude audio_channels - -audio_channels: '5.1' - -? Movie Title-x01-Other Title.mkv -? Movie Title-x01-Other Title -? directory/Movie Title-x01-Other Title/file.mkv -: options: --exclude bonus - -bonus: 1 - -bonus_title: Other Title - -? Title-x02-Bonus Title.mkv -: options: --include bonus - bonus: 2 - -bonus_title: Other Title - -? cd 1of3 -: options: --exclude cd - -cd: 1 - -cd_count: 3 - -? This.Is.Us -: options: --exclude country - title: This Is Us - -country: US - -? 2015.01.31 -: options: --exclude date - year: 2015 - -date: 2015-01-31 - -? Something 2 mar 2013) -: options: --exclude date - -date: 2013-03-02 - -? 2012 2009 S01E02 2015 # If no year is marked, the second one is guessed. -: options: --exclude year - -year: 2009 - -? Director's cut -: options: --exclude edition - -edition: Director's Cut - -? 2x5 -? 2X5 -? 02x05 -? 2X05 -? 02x5 -? S02E05 -? s02e05 -? s02e5 -? s2e05 -? s02ep05 -? s2EP5 -: options: --exclude season - -season: 2 - -episode: 5 - -? 2x6 -? 2X6 -? 02x06 -? 2X06 -? 02x6 -? S02E06 -? s02e06 -? s02e6 -? s2e06 -? s02ep06 -? s2EP6 -: options: --exclude episode - -season: 2 - -episode: 6 - -? serie Season 2 other -: options: --exclude season - -season: 2 - -? Some Dummy Directory/S02 Some Series/E01-Episode title.mkv -: options: --exclude episode_title - -episode_title: Episode title - season: 2 - episode: 1 - -? Another Dummy Directory/S02 Some Series/E01-Episode title.mkv -: options: --include season --include episode - -episode_title: Episode title - season: 2 - episode: 1 - -# pattern contains season and episode: it wont work enabling only one -? Some Series S03E01E02 -: options: --include episode - -season: 3 - -episode: [1, 2] - -# pattern contains season and episode: it wont work enabling only one -? Another Series S04E01E02 -: options: --include season - -season: 4 - -episode: [1, 2] - -? Show.Name.Season.4.Episode.1 -: options: --include episode - -season: 4 - episode: 1 - -? Another.Show.Name.Season.4.Episode.1 -: options: --include season - season: 4 - -episode: 1 - -? Some Series S01 02 03 -: options: --exclude season - -season: [1, 2, 3] - -? Some Series E01 02 04 -: options: --exclude episode - -episode: [1, 2, 4] - -? A very special episode s06 special -: options: -t episode --exclude episode_details - season: 6 - -episode_details: Special - -? S01D02.3-5-GROUP -: options: --exclude disc - -season: 1 - -disc: [2, 3, 4, 5] - -episode: [2, 3, 4, 5] - -? S01D02&4-6&8 -: options: --exclude season - -season: 1 - -disc: [2, 4, 5, 6, 8] - -episode: [2, 4, 5, 6, 8] - -? Film Title-f01-Series Title.mkv -: options: --exclude film - -film: 1 - -film_title: Film Title - -? Another Film Title-f01-Series Title.mkv -: options: --exclude film_title - film: 1 - -film_title: Film Title - -? English -? .ENG. -: options: --exclude language - -language: English - -? SubFrench -? SubFr -? STFr -: options: --exclude subtitle_language - -language: French - -subtitle_language: French - -? ST.FR -: options: --exclude subtitle_language - language: French - -subtitle_language: French - -? ENG.-.sub.FR -? ENG.-.FR Sub -: options: --include language - language: [English, French] - -subtitle_language: French - -? ENG.-.SubFR -: options: --include language - language: English - -subtitle_language: French - -? ENG.-.FRSUB -? ENG.-.FRSUBS -? ENG.-.FR-SUBS -: options: --include subtitle_language - -language: English - subtitle_language: French - -? DVD.Real.XViD -? DVD.fix.XViD -: options: --exclude other - -other: Proper - -proper_count: 1 - -? Part 3 -? Part III -? Part Three -? Part Trois -? Part3 -: options: --exclude part - -part: 3 - -? Some.Title.XViD-by.Artik[SEDG].avi -: options: --exclude release_group - -release_group: Artik[SEDG] - -? "[ABC] Some.Title.avi" -? some/folder/[ABC]Some.Title.avi -: options: --exclude release_group - -release_group: ABC - -? 360p -? 360px -? "360" -? +500x360 -: options: --exclude screen_size - -screen_size: 360p - -? 640x360 -: options: --exclude aspect_ratio - screen_size: 360p - -aspect_ratio: 1.778 - -? 8196x4320 -: options: --exclude screen_size - -screen_size: 4320p - -aspect_ratio: 1.897 - -? 4.3gb -: options: --exclude size - -size: 4.3GB - -? VhS_rip -? VHS.RIP -: options: --exclude source - -source: VHS - -other: Rip - -? DVD.RIP -: options: --include other - -source: DVD - -other: Rip - -? Title Only.avi -: options: --exclude title - -title: Title Only - -? h265 -? x265 -? h.265 -? x.265 -? hevc -: options: --exclude video_codec - -video_codec: H.265 - -? hevc10 -: options: --include color_depth - -video_codec: H.265 - -color_depth: 10-bit - -? HEVC-YUV420P10 -: options: --include color_depth - -video_codec: H.265 - color_depth: 10-bit - -? h265-HP -: options: --exclude video_profile - video_codec: H.265 - -video_profile: High - -? House.of.Cards.2013.S02E03.1080p.NF.WEBRip.DD5.1.x264-NTb.mkv -? House.of.Cards.2013.S02E03.1080p.Netflix.WEBRip.DD5.1.x264-NTb.mkv -: options: --exclude streaming_service - -streaming_service: Netflix - -? wawa.co.uk -: options: --exclude website - -website: wawa.co.uk - -? movie.mkv -: options: --exclude mimetype - -mimetype: video/x-matroska - -? another movie.mkv -: options: --exclude container - -container: mkv - -? series s02e01 -: options: --exclude type - -type: episode - -? series s02e01 -: options: --exclude type - -type: episode - -? Hotel.Hell.S01E01.720p.DD5.1.448kbps-ALANiS -: options: --exclude audio_bit_rate - -audio_bit_rate: 448Kbps - -? Katy Perry - Pepsi & Billboard Summer Beats Concert Series 2012 1080i HDTV 20 Mbps DD2.0 MPEG2-TrollHD.ts -: options: --exclude video_bit_rate - -video_bit_rate: 20Mbps - -? "[Figmentos] Monster 34 - At the End of Darkness [781219F1].mkv" -: options: --exclude crc32 - -crc32: 781219F1 - -? 1080p25 -: options: --exclude frame_rate - screen_size: 1080p - -frame_rate: 25fps - -? 1080p25 -: options: --exclude screen_size - -screen_size: 1080p - -frame_rate: 25fps - -? 1080p25 -: options: --include frame_rate - -screen_size: 1080p - -frame_rate: 25fps - -? 1080p 30fps -: options: --exclude screen_size - -screen_size: 1080p - frame_rate: 30fps diff --git a/libs/guessit/test/episodes.yml b/libs/guessit/test/episodes.yml index 97320c809..3b563709a 100644 --- a/libs/guessit/test/episodes.yml +++ b/libs/guessit/test/episodes.yml @@ -6,8 +6,8 @@ season: 2 episode: 5 episode_title: Vaginatown - source: HDTV - video_codec: Xvid + format: HDTV + video_codec: XviD release_group: 0TV container: avi @@ -18,8 +18,8 @@ episode_title: Hello, Bandit language: English subtitle_language: French - source: HDTV - video_codec: Xvid + format: HDTV + video_codec: XviD release_group: AlFleNi-TeaM website: tvu.org.ru container: avi @@ -29,8 +29,8 @@ season: 1 episode: 3 episode_title: Right Place, Wrong Time - source: HDTV - video_codec: Xvid + format: HDTV + video_codec: XviD release_group: NoTV ? Series/Duckman/Duckman - S1E13 Joking The Chicken (unedited).avi @@ -89,7 +89,7 @@ episode: 2 episode_title: 65 Million Years Off language: english - source: DVD + format: DVD other: Complete ? series/Psych/Psych S02 Season 2 Complete English DVD/Psych.S02E03.Psy.Vs.Psy.Français.srt @@ -97,7 +97,7 @@ season: 2 episode: 3 episode_title: Psy Vs Psy - source: DVD + format: DVD language: English subtitle_language: French other: Complete @@ -107,7 +107,7 @@ season: 1 episode: 1 episode_title: Toutes Couleurs Unies - source: Digital TV + format: DVB release_group: Kceb language: french website: tvu.org.ru @@ -132,16 +132,15 @@ episode_title: 18-5-4 language: english subtitle_language: french - source: HDTV - video_codec: Xvid + format: HDTV + video_codec: XviD release_group: AlFleNi-TeaM website: tvu.org.ru ? series/__ Incomplete __/Dr Slump (Catalan)/Dr._Slump_-_003_DVB-Rip_Catalan_by_kelf.avi : title: Dr Slump episode: 3 - source: Digital TV - other: Rip + format: DVB language: catalan # Disabling this test because it just doesn't looks like a serie ... @@ -167,8 +166,7 @@ season: 4 episode: 7 episode_title: Cherokee Hair Tampons - source: DVD - other: Rip + format: DVD website: tvu.org.ru ? Series/Kaamelott/Kaamelott - Livre V - Ep 23 - Le Forfait.avi @@ -194,18 +192,16 @@ episode_format: Minisode episode: 1 episode_title: Good Cop Bad Cop - source: Web - other: Rip - video_codec: Xvid + format: WEBRip + video_codec: XviD ? Series/My Name Is Earl/My.Name.Is.Earl.S01Extras.-.Bad.Karma.DVDRip.XviD.avi : title: My Name Is Earl season: 1 episode_title: Extras - Bad Karma - source: DVD - other: Rip + format: DVD episode_details: Extras - video_codec: Xvid + video_codec: XviD ? series/Freaks And Geeks/Season 1/Episode 4 - Kim Kelly Is My Friend-eng(1).srt : title: Freaks And Geeks @@ -260,7 +256,7 @@ : title: new girl season: 1 episode: 17 - source: HDTV + format: HDTV release_group: lol ? Kaamelott - 5x44x45x46x47x48x49x50.avi @@ -300,8 +296,8 @@ season: 1 episode: 3 episode_title: Health Care - source: HDTV - video_codec: Xvid + format: HDTV + video_codec: XviD release_group: LOL ? /Volumes/data-1/Series/Futurama/Season 3/Futurama_-_S03_DVD_Bonus_-_Deleted_Scenes_Part_3.ogm @@ -310,15 +306,15 @@ part: 3 other: Bonus episode_title: Deleted Scenes - source: DVD + format: DVD ? Ben.and.Kate.S01E02.720p.HDTV.X264-DIMENSION.mkv : title: Ben and Kate season: 1 episode: 2 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: DIMENSION ? /volume1/TV Series/Drawn Together/Season 1/Drawn Together 1x04 Requiem for a Reality Show.avi @@ -332,10 +328,10 @@ season: 5 episode: 6 screen_size: 720p - source: Web + format: WEB-DL audio_channels: "5.1" - audio_codec: Dolby Digital - video_codec: H.264 + audio_codec: AC3 + video_codec: h264 release_group: CtrlHD ? /media/bdc64bfe-e36f-4af8-b550-e6fd2dfaa507/TV_Shows/Doctor Who (2005)/Saison 6/Doctor Who (2005) - S06E13 - The Wedding of River Song.mkv @@ -358,10 +354,10 @@ episode: 3 episode_title: Adventures in Baby-Getting screen_size: 720p - source: Web + format: WEB-DL audio_channels: "5.1" - audio_codec: Dolby Digital - video_codec: H.264 + audio_codec: AC3 + video_codec: h264 release_group: CtrlHD ? /home/disaster/Videos/TV/Merlin/merlin_2008.5x02.arthurs_bane_part_two.repack.720p_hdtv_x264-fov.mkv @@ -371,8 +367,8 @@ part: 2 episode_title: arthurs bane screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: fov year: 2008 other: Proper @@ -390,28 +386,28 @@ episode: 18 episode_title: Sheltered screen_size: 720p - source: Web + format: WEB-DL audio_channels: "5.1" - audio_codec: Dolby Digital - video_codec: H.264 + audio_codec: AC3 + video_codec: h264 ? Game of Thrones S03E06 1080i HDTV DD5.1 MPEG2-TrollHD.ts : title: Game of Thrones season: 3 episode: 6 screen_size: 1080i - source: HDTV + format: HDTV audio_channels: "5.1" - audio_codec: Dolby Digital - video_codec: MPEG-2 + audio_codec: AC3 + video_codec: Mpeg2 release_group: TrollHD ? gossip.girl.s01e18.hdtv.xvid-2hd.eng.srt : title: gossip girl season: 1 episode: 18 - source: HDTV - video_codec: Xvid + format: HDTV + video_codec: XviD release_group: 2hd subtitle_language: english @@ -420,8 +416,8 @@ season: 3 episode: [1, 2] screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: IMMERSE ? Wheels.S03E01-02.720p.HDTV.x264-IMMERSE.mkv @@ -429,8 +425,8 @@ season: 3 episode: [1, 2] screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: IMMERSE ? Wheels.S03E01-E02.720p.HDTV.x264-IMMERSE.mkv @@ -438,8 +434,8 @@ season: 3 episode: [1, 2] screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: IMMERSE ? Wheels.S03E01-04.720p.HDTV.x264-IMMERSE.mkv @@ -447,8 +443,8 @@ season: 3 episode: [1, 2, 3, 4] screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: IMMERSE ? Marvels.Agents.of.S.H.I.E.L.D-S01E06.720p.HDTV.X264-DIMENSION.mkv @@ -456,8 +452,8 @@ season: 1 episode: 6 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: DIMENSION ? Marvels.Agents.of.S.H.I.E.L.D.S01E06.720p.HDTV.X264-DIMENSION.mkv @@ -465,8 +461,8 @@ season: 1 episode: 6 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: DIMENSION ? Marvels.Agents.of.S.H.I.E.L.D..S01E06.720p.HDTV.X264-DIMENSION.mkv @@ -474,8 +470,8 @@ season: 1 episode: 6 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: DIMENSION ? Series/Friday Night Lights/Season 1/Friday Night Lights S01E19 - Ch-Ch-Ch-Ch-Changes.avi @@ -487,24 +483,22 @@ ? Dexter Saison VII FRENCH.BDRip.XviD-MiND.nfo : title: Dexter season: 7 - video_codec: Xvid + video_codec: XviD language: French - source: Blu-ray - other: Rip + format: BluRay release_group: MiND ? Dexter Saison sept FRENCH.BDRip.XviD-MiND.nfo : title: Dexter season: 7 - video_codec: Xvid + video_codec: XviD language: French - source: Blu-ray - other: Rip + format: BluRay release_group: MiND ? "Pokémon S16 - E29 - 1280*720 HDTV VF.mkv" : title: Pokémon - source: HDTV + format: HDTV language: French season: 16 episode: 29 @@ -512,20 +506,20 @@ ? One.Piece.E576.VOSTFR.720p.HDTV.x264-MARINE-FORD.mkv : episode: 576 - video_codec: H.264 - source: HDTV + video_codec: h264 + format: HDTV title: One Piece release_group: MARINE-FORD subtitle_language: French screen_size: 720p ? Dexter.S08E12.FINAL.MULTi.1080p.BluRay.x264-MiND.mkv -: video_codec: H.264 +: video_codec: h264 episode: 12 season: 8 - source: Blu-ray + format: BluRay title: Dexter - episode_details: Final + other: FINAL language: Multiple languages release_group: MiND screen_size: 1080p @@ -542,30 +536,30 @@ screen_size: 720p season: 1 title: Falling Skies - video_codec: H.264 - other: Micro HD + video_codec: h264 + other: HDLight ? Sleepy.Hollow.S01E09.720p.WEB-DL.DD5.1.H.264-BP.mkv : episode: 9 - video_codec: H.264 - source: Web + video_codec: h264 + format: WEB-DL title: Sleepy Hollow audio_channels: "5.1" screen_size: 720p season: 1 -# video_profile: BP # TODO: related to https://github.com/guessit-io/guessit/issues/458#issuecomment-305719715 - audio_codec: Dolby Digital + video_profile: BP + audio_codec: AC3 ? Sleepy.Hollow.S01E09.720p.WEB-DL.DD5.1.H.264-BS.mkv : episode: 9 - video_codec: H.264 - source: Web + video_codec: h264 + format: WEB-DL title: Sleepy Hollow audio_channels: "5.1" screen_size: 720p season: 1 release_group: BS - audio_codec: Dolby Digital + audio_codec: AC3 ? Battlestar.Galactica.S00.Pilot.FRENCH.DVDRip.XviD-NOTAG.avi : title: Battlestar Galactica @@ -573,9 +567,8 @@ episode_details: Pilot episode_title: Pilot language: French - source: DVD - other: Rip - video_codec: Xvid + format: DVD + video_codec: XviD release_group: NOTAG ? The Big Bang Theory S00E00 Unaired Pilot VOSTFR TVRip XviD-VioCs @@ -583,9 +576,8 @@ season: 0 episode: 0 subtitle_language: French - source: TV - other: Rip - video_codec: Xvid + format: TV + video_codec: XviD release_group: VioCs episode_details: [Unaired, Pilot] @@ -593,10 +585,10 @@ : title: The Big Bang Theory season: 1 episode: 0 - source: TV - video_codec: Xvid + format: TV + video_codec: XviD release_group: GIGGITY - other: [Proper, Rip] + other: Proper proper_count: 1 episode_details: [Unaired, Pilot] @@ -606,8 +598,8 @@ year: 2014 episode: 18 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: KILLERS ? 2.Broke.Girls.S03E10.480p.HDTV.x264-mSD.mkv @@ -615,15 +607,29 @@ season: 3 episode: 10 screen_size: 480p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: mSD +? House.of.Cards.2013.S02E03.1080p.NF.WEBRip.DD5.1.x264-NTb.mkv +? House.of.Cards.2013.S02E03.1080p.Netflix.WEBRip.DD5.1.x264-NTb.mkv +: title: House of Cards + year: 2013 + season: 2 + episode: 3 + screen_size: 1080p + streaming_service: Netflix + format: WEBRip + audio_channels: "5.1" + audio_codec: AC3 + video_codec: h264 + release_group: NTb + ? the.100.109.hdtv-lol.mp4 : title: the 100 season: 1 episode: 9 - source: HDTV + format: HDTV release_group: lol ? Criminal.Minds.5x03.Reckoner.ENG.-.sub.FR.HDTV.XviD-STi.[tvu.org.ru].avi @@ -632,8 +638,8 @@ subtitle_language: French season: 5 episode: 3 - video_codec: Xvid - source: HDTV + video_codec: XviD + format: HDTV website: tvu.org.ru release_group: STi episode_title: Reckoner @@ -645,7 +651,7 @@ ? '[Evil-Saizen]_Laughing_Salesman_14_[DVD][1C98686A].mkv' : crc32: 1C98686A episode: 14 - source: DVD + format: DVD release_group: Evil-Saizen title: Laughing Salesman @@ -674,22 +680,22 @@ : audio_codec: AAC crc32: 99E8E009 episode: 1 - source: Blu-ray + format: BluRay release_group: Daisei screen_size: 720p title: Free!:Iwatobi Swim Club - color_depth: 10-bit + video_profile: 10bit ? '[Tsundere] Boku wa Tomodachi ga Sukunai - 03 [BDRip h264 1920x1080 10bit FLAC][AF0C22CC].mkv' : audio_codec: FLAC crc32: AF0C22CC episode: 3 - source: Blu-ray + format: BluRay release_group: Tsundere screen_size: 1080p title: Boku wa Tomodachi ga Sukunai - video_codec: H.264 - color_depth: 10-bit + video_codec: h264 + video_profile: 10bit ? '[t.3.3.d]_Mikakunin_de_Shinkoukei_-_12_[720p][5DDC1352].mkv' : crc32: 5DDC1352 @@ -704,12 +710,12 @@ release_group: Anime-Koi screen_size: 720p title: Sabagebu! - video_codec: H.264 + video_codec: h264 ? '[aprm-Diogo4D] [BD][1080p] Nagi no Asukara 08 [4D102B7C].mkv' : crc32: 4D102B7C episode: 8 - source: Blu-ray + format: BluRay release_group: aprm-Diogo4D screen_size: 1080p title: Nagi no Asukara @@ -742,7 +748,7 @@ ? '[DeadFish] Tari Tari - 01 [BD][720p][AAC].mp4' : audio_codec: AAC episode: 1 - source: Blu-ray + format: BluRay release_group: DeadFish screen_size: 720p title: Tari Tari @@ -753,12 +759,12 @@ release_group: NoobSubs screen_size: 720p title: Sword Art Online II - color_depth: 8-bit + video_profile: 8bit ? '[DeadFish] 01 - Tari Tari [BD][720p][AAC].mp4' : audio_codec: AAC episode: 1 - source: Blu-ray + format: BluRay release_group: DeadFish screen_size: 720p title: Tari Tari @@ -769,12 +775,12 @@ release_group: NoobSubs screen_size: 720p title: Sword Art Online II - color_depth: 8-bit + video_profile: 8bit ? '[DeadFish] 12 - Tari Tari [BD][720p][AAC].mp4' : audio_codec: AAC episode: 12 - source: Blu-ray + format: BluRay release_group: DeadFish screen_size: 720p title: Tari Tari @@ -782,7 +788,7 @@ ? Something.Season.2.1of4.Ep.Title.HDTV.torrent : episode_count: 4 episode: 1 - source: HDTV + format: HDTV season: 2 title: Something episode_title: Title @@ -791,7 +797,7 @@ ? Something.Season.2of5.3of9.Ep.Title.HDTV.torrent : episode_count: 9 episode: 3 - source: HDTV + format: HDTV season: 2 season_count: 5 title: Something @@ -799,7 +805,7 @@ container: torrent ? Something.Other.Season.3of5.Complete.HDTV.torrent -: source: HDTV +: format: HDTV other: Complete season: 3 season_count: 5 @@ -821,22 +827,22 @@ ? W2Test.123.HDTV.XViD-FlexGet : episode: 23 season: 1 - source: HDTV + format: HDTV release_group: FlexGet title: W2Test - video_codec: Xvid + video_codec: XviD ? W2Test.123.HDTV.XViD-FlexGet : options: --episode-prefer-number episode: 123 - source: HDTV + format: HDTV release_group: FlexGet title: W2Test - video_codec: Xvid + video_codec: XviD ? FooBar.0307.PDTV-FlexGet : episode: 7 - source: Digital TV + format: DVB release_group: FlexGet season: 3 title: FooBar @@ -845,51 +851,53 @@ ? FooBar.307.PDTV-FlexGet : options: --episode-prefer-number episode: 307 - source: Digital TV + format: DVB release_group: FlexGet title: FooBar ? FooBar.07.PDTV-FlexGet -: episode: 7 - source: Digital TV +: options: --episode-prefer-number + episode: 7 + format: DVB release_group: FlexGet title: FooBar ? FooBar.7.PDTV-FlexGet -: episode: 7 - source: Digital TV +: options: --episode-prefer-number + episode: 7 + format: DVB release_group: FlexGet title: FooBar ? FooBar.0307.PDTV-FlexGet : episode: 7 - source: Digital TV + format: DVB release_group: FlexGet season: 3 title: FooBar ? FooBar.307.PDTV-FlexGet : episode: 7 - source: Digital TV + format: DVB release_group: FlexGet season: 3 title: FooBar ? FooBar.07.PDTV-FlexGet : episode: 7 - source: Digital TV + format: DVB release_group: FlexGet title: FooBar ? FooBar.07v4.PDTV-FlexGet : episode: 7 version: 4 - source: Digital TV + format: DVB release_group: FlexGet title: FooBar ? FooBar.7.PDTV-FlexGet -: source: Digital TV +: format: DVB release_group: FlexGet title: FooBar 7 type: movie @@ -897,7 +905,7 @@ ? FooBar.7.PDTV-FlexGet : options: -t episode episode: 7 - source: Digital TV + format: DVB release_group: FlexGet title: FooBar @@ -905,13 +913,13 @@ : options: -t episode episode: 7 version: 3 - source: Digital TV + format: DVB release_group: FlexGet title: FooBar ? Test.S02E01.hdtv.real.proper : episode: 1 - source: HDTV + format: HDTV other: Proper proper_count: 2 season: 2 @@ -919,7 +927,7 @@ ? Real.Test.S02E01.hdtv.proper : episode: 1 - source: HDTV + format: HDTV other: Proper proper_count: 1 season: 2 @@ -927,7 +935,7 @@ ? Test.Real.S02E01.hdtv.proper : episode: 1 - source: HDTV + format: HDTV other: Proper proper_count: 1 season: 2 @@ -935,7 +943,7 @@ ? Test.S02E01.hdtv.proper : episode: 1 - source: HDTV + format: HDTV other: Proper proper_count: 1 season: 2 @@ -943,7 +951,7 @@ ? Test.S02E01.hdtv.real.repack.proper : episode: 1 - source: HDTV + format: HDTV other: Proper proper_count: 3 season: 2 @@ -951,10 +959,10 @@ ? Date.Show.03-29-2012.HDTV.XViD-FlexGet : date: 2012-03-29 - source: HDTV + format: HDTV release_group: FlexGet title: Date Show - video_codec: Xvid + video_codec: XviD ? Something.1x5.Season.Complete-FlexGet : episode: 5 @@ -992,13 +1000,13 @@ audio_codec: AAC country: US episode: 14 - source: HDTV + format: HDTV release_group: NOGRP screen_size: 720p season: 2013 title: FlexGet episode_title: Title Here - video_codec: H.264 + video_codec: h264 year: 2013 ? FlexGet.14.of.21.Title.Here.720p.HDTV.AAC5.1.x264-NOGRP @@ -1006,25 +1014,25 @@ audio_codec: AAC episode_count: 21 episode: 14 - source: HDTV + format: HDTV release_group: NOGRP screen_size: 720p title: FlexGet episode_title: Title Here - video_codec: H.264 + video_codec: h264 ? FlexGet.Series.2013.14.of.21.Title.Here.720p.HDTV.AAC5.1.x264-NOGRP : audio_channels: '5.1' audio_codec: AAC episode_count: 21 episode: 14 - source: HDTV + format: HDTV release_group: NOGRP screen_size: 720p season: 2013 title: FlexGet episode_title: Title Here - video_codec: H.264 + video_codec: h264 year: 2013 ? Something.S04E05E09 @@ -1047,14 +1055,12 @@ title: FooBar ? FooBar 360 -: season: 3 - episode: 60 +: screen_size: 360p title: FooBar - -screen_size: 360p ? BarFood christmas special HDTV : options: --expected-title BarFood - source: HDTV + format: HDTV title: BarFood episode_title: christmas special episode_details: Special @@ -1076,47 +1082,47 @@ ? Test.13.HDTV-Ignored : episode: 13 - source: HDTV + format: HDTV release_group: Ignored title: Test ? Test.13.HDTV-Ignored : options: --expected-series test episode: 13 - source: HDTV + format: HDTV release_group: Ignored title: Test ? Test.13.HDTV-Ignored : title: Test episode: 13 - source: HDTV + format: HDTV release_group: Ignored ? Test.13.HDTV-Ignored : episode: 13 - source: HDTV + format: HDTV release_group: Ignored title: Test ? Test.13.HDTV-FlexGet : episode: 13 - source: HDTV + format: HDTV release_group: FlexGet title: Test ? Test.14.HDTV-Name : episode: 14 - source: HDTV + format: HDTV release_group: Name title: Test ? Real.Time.With.Bill.Maher.2014.10.31.HDTV.XviD-AFG.avi : date: 2014-10-31 - source: HDTV + format: HDTV release_group: AFG title: Real Time With Bill Maher - video_codec: Xvid + video_codec: XviD ? Arrow.S03E21.Al.Sah-Him.1080p.WEB-DL.DD5.1.H.264-BS.mkv : title: Arrow @@ -1124,11 +1130,11 @@ episode: 21 episode_title: Al Sah-Him screen_size: 1080p - audio_codec: Dolby Digital + audio_codec: AC3 audio_channels: "5.1" - video_codec: H.264 + video_codec: h264 release_group: BS - source: Web + format: WEB-DL ? How to Make It in America - S02E06 - I'm Sorry, Who's Yosi?.mkv : title: How to Make It in America @@ -1138,27 +1144,63 @@ ? 24.S05E07.FRENCH.DVDRip.XviD-FiXi0N.avi : episode: 7 - source: DVD - other: Rip + format: DVD language: fr season: 5 title: '24' - video_codec: Xvid + video_codec: XviD release_group: FiXi0N ? 12.Monkeys.S01E12.FRENCH.BDRip.x264-VENUE.mkv : episode: 12 - source: Blu-ray - other: Rip + format: BluRay language: fr release_group: VENUE season: 1 title: 12 Monkeys - video_codec: H.264 + video_codec: h264 + +? The.Daily.Show.2015.07.01.Kirsten.Gillibrand.Extended.720p.CC.WEBRip.AAC2.0.x264-BTW.mkv +? The.Daily.Show.2015.07.01.Kirsten.Gillibrand.Extended.720p.ComedyCentral.WEBRip.AAC2.0.x264-BTW.mkv +? The.Daily.Show.2015.07.01.Kirsten.Gillibrand.Extended.720p.Comedy.Central.WEBRip.AAC2.0.x264-BTW.mkv +: audio_channels: '2.0' + audio_codec: AAC + date: 2015-07-01 + format: WEBRip + edition: Extended + release_group: BTW + screen_size: 720p + streaming_service: Comedy Central + title: The Daily Show + episode_title: Kirsten Gillibrand + video_codec: h264 + +? The.Daily.Show.2015.07.01.Kirsten.Gillibrand.Extended.Interview.720p.CC.WEBRip.AAC2.0.x264-BTW.mkv +: audio_channels: '2.0' + audio_codec: AAC + date: 2015-07-01 + format: WEBRip + release_group: BTW + screen_size: 720p + streaming_service: Comedy Central + title: The Daily Show + episode_title: Kirsten Gillibrand Extended Interview + video_codec: h264 + +? The.Daily.Show.2015.07.02.Sarah.Vowell.CC.WEBRip.AAC2.0.x264-BTW.mkv +: audio_channels: '2.0' + audio_codec: AAC + date: 2015-07-02 + format: WEBRip + release_group: BTW + streaming_service: Comedy Central + title: The Daily Show + episode_title: Sarah Vowell + video_codec: h264 ? 90.Day.Fiance.S02E07.I.Have.To.Tell.You.Something.720p.HDTV.x264-W4F : episode: 7 - source: HDTV + format: HDTV screen_size: 720p season: 2 title: 90 Day Fiance @@ -1167,44 +1209,42 @@ ? Doctor.Who.2005.S04E06.FRENCH.LD.DVDRip.XviD-TRACKS.avi : episode: 6 - source: DVD + format: DVD language: fr release_group: TRACKS season: 4 title: Doctor Who - other: [Line Dubbed, Rip] - video_codec: Xvid + other: LD + video_codec: XviD year: 2005 ? Astro.Le.Petit.Robot.S01E01+02.FRENCH.DVDRiP.X264.INT-BOOLZ.mkv : episode: [1, 2] - source: DVD - other: Rip + format: DVD language: fr release_group: INT-BOOLZ season: 1 title: Astro Le Petit Robot - video_codec: H.264 + video_codec: h264 ? Annika.Bengtzon.2012.E01.Le.Testament.De.Nobel.FRENCH.DVDRiP.XViD-STVFRV.avi : episode: 1 - source: DVD - other: Rip + format: DVD language: fr release_group: STVFRV title: Annika Bengtzon episode_title: Le Testament De Nobel - video_codec: Xvid + video_codec: XviD year: 2012 ? Dead.Set.02.FRENCH.LD.DVDRip.XviD-EPZ.avi : episode: 2 - source: DVD + format: DVD language: fr - other: [Line Dubbed, Rip] + other: LD release_group: EPZ title: Dead Set - video_codec: Xvid + video_codec: XviD ? Phineas and Ferb S01E00 & S01E01 & S01E02 : episode: [0, 1, 2] @@ -1213,11 +1253,11 @@ ? Show.Name.S01E02.S01E03.HDTV.XViD.Etc-Group : episode: [2, 3] - source: HDTV + format: HDTV release_group: Etc-Group season: 1 title: Show Name - video_codec: Xvid + video_codec: XviD ? Show Name - S01E02 - S01E03 - S01E04 - Ep Name : episode: [2, 3, 4] @@ -1227,11 +1267,11 @@ ? Show.Name.1x02.1x03.HDTV.XViD.Etc-Group : episode: [2, 3] - source: HDTV + format: HDTV release_group: Etc-Group season: 1 title: Show Name - video_codec: Xvid + video_codec: XviD ? Show Name - 1x02 - 1x03 - 1x04 - Ep Name : episode: [2, 3, 4] @@ -1241,11 +1281,11 @@ ? Show.Name.S01E02.HDTV.XViD.Etc-Group : episode: 2 - source: HDTV + format: HDTV release_group: Etc-Group season: 1 title: Show Name - video_codec: Xvid + video_codec: XviD ? Show Name - S01E02 - My Ep Name : episode: 2 @@ -1261,11 +1301,11 @@ ? Show.Name.S01E02E03.HDTV.XViD.Etc-Group : episode: [2, 3] - source: HDTV + format: HDTV release_group: Etc-Group season: 1 title: Show Name - video_codec: Xvid + video_codec: XviD ? Show Name - S01E02-03 - My Ep Name : episode: [2, 3] @@ -1280,11 +1320,11 @@ ? Show_Name.1x02.HDTV_XViD_Etc-Group : episode: 2 - source: HDTV + format: HDTV release_group: Etc-Group season: 1 title: Show Name - video_codec: Xvid + video_codec: XviD ? Show Name - 1x02 - My Ep Name : episode: 2 @@ -1294,11 +1334,11 @@ ? Show_Name.1x02x03x04.HDTV_XViD_Etc-Group : episode: [2, 3, 4] - source: HDTV + format: HDTV release_group: Etc-Group season: 1 title: Show Name - video_codec: Xvid + video_codec: XviD ? Show Name - 1x02-03-04 - My Ep Name : episode: [2, 3, 4] @@ -1311,25 +1351,25 @@ : date: 2010-11-23 season: 1 episode: 0 - source: HDTV + format: HDTV release_group: Etc-Group title: Show Name episode_title: Event - video_codec: Xvid + video_codec: XviD ? Show.Name.101.Event.2010.11.23.HDTV.XViD.Etc-Group : date: 2010-11-23 season: 1 episode: 1 - source: HDTV + format: HDTV release_group: Etc-Group title: Show Name episode_title: Event - video_codec: Xvid + video_codec: XviD ? Show.Name.2010.11.23.HDTV.XViD.Etc-Group : date: 2010-11-23 - source: HDTV + format: HDTV release_group: Etc-Group title: Show Name @@ -1345,11 +1385,11 @@ episode_title: Ep Name ? Show.Name.S01.HDTV.XViD.Etc-Group -: source: HDTV +: format: HDTV release_group: Etc-Group season: 1 title: Show Name - video_codec: Xvid + video_codec: XviD ? Show.Name.E02-03 : episode: [2, 3] @@ -1368,8 +1408,8 @@ ? Show.Name.Part.3.HDTV.XViD.Etc-Group : part: 3 title: Show Name - source: HDTV - video_codec: Xvid + format: HDTV + video_codec: XviD release_group: Etc-Group type: movie # Fallback to movie type because we can't tell it's a series ... @@ -1391,11 +1431,11 @@ ? Show.Name.102.HDTV.XViD.Etc-Group : episode: 2 - source: HDTV + format: HDTV release_group: Etc-Group season: 1 title: Show Name - video_codec: Xvid + video_codec: XviD ? '[HorribleSubs] Maria the Virgin Witch - 01 [720p].mkv' : episode: 1 @@ -1404,26 +1444,29 @@ title: Maria the Virgin Witch ? '[ISLAND]One_Piece_679_[VOSTFR]_[V1]_[8bit]_[720p]_[EB7838FC].mp4' -: crc32: EB7838FC +: options: -E + crc32: EB7838FC episode: 679 release_group: ISLAND screen_size: 720p title: One Piece subtitle_language: fr - color_depth: 8-bit + video_profile: 8bit version: 1 ? '[ISLAND]One_Piece_679_[VOSTFR]_[8bit]_[720p]_[EB7838FC].mp4' -: crc32: EB7838FC +: options: -E + crc32: EB7838FC episode: 679 release_group: ISLAND screen_size: 720p title: One Piece subtitle_language: fr - color_depth: 8-bit + video_profile: 8bit ? '[Kaerizaki-Fansub]_One_Piece_679_[VOSTFR][HD_1280x720].mp4' -: episode: 679 +: options: -E + episode: 679 other: HD release_group: Kaerizaki-Fansub screen_size: 720p @@ -1431,15 +1474,19 @@ subtitle_language: fr ? '[Kaerizaki-Fansub]_One_Piece_679_[VOSTFR][FANSUB][HD_1280x720].mp4' -: episode: 679 - other: [Fan Subtitled, HD] +: options: -E + episode: 679 + other: + - Fansub + - HD release_group: Kaerizaki-Fansub screen_size: 720p title: One Piece subtitle_language: fr ? '[Kaerizaki-Fansub]_One_Piece_681_[VOSTFR][HD_1280x720]_V2.mp4' -: episode: 681 +: options: -E + episode: 681 other: HD release_group: Kaerizaki-Fansub screen_size: 720p @@ -1448,7 +1495,8 @@ version: 2 ? '[Kaerizaki-Fansub] High School DxD New 04 VOSTFR HD (1280x720) V2.mp4' -: episode: 4 +: options: -E + episode: 4 other: HD release_group: Kaerizaki-Fansub screen_size: 720p @@ -1457,7 +1505,8 @@ version: 2 ? '[Kaerizaki-Fansub] One Piece 603 VOSTFR PS VITA (960x544) V2.mp4' -: episode: 603 +: options: -E + episode: 603 release_group: Kaerizaki-Fansub other: PS Vita screen_size: 960x544 @@ -1491,12 +1540,13 @@ release_group: Stratos-Subs screen_size: 720p title: Infinite Stratos - video_codec: H.264 + video_codec: h264 # [ShinBunBu-Subs] Bleach - 02-03 (CX 1280x720 x264 AAC) ? '[SGKK] Bleach 312v1 [720p/MKV]' -: episode: 312 +: options: -E # guessit 1.x for episode only when version is guessed, but it's doesn't make it consistent. + episode: 312 release_group: SGKK screen_size: 720p title: Bleach @@ -1508,7 +1558,7 @@ release_group: Ayako screen_size: 720p title: Infinite Stratos - video_codec: H.264 + video_codec: h264 ? '[Ayako] Infinite Stratos - IS - 07v2 [H264][720p][44419534]' : crc32: '44419534' @@ -1516,7 +1566,7 @@ release_group: Ayako screen_size: 720p title: Infinite Stratos - video_codec: H.264 + video_codec: h264 version: 2 ? '[Ayako-Shikkaku] Oniichan no Koto Nanka Zenzen Suki Janain Dakara ne - 10 [LQ][h264][720p] [8853B21C]' @@ -1525,15 +1575,18 @@ release_group: Ayako-Shikkaku screen_size: 720p title: Oniichan no Koto Nanka Zenzen Suki Janain Dakara ne - video_codec: H.264 + video_codec: h264 +# TODO: Add support for absolute episodes ? Bleach - s16e03-04 - 313-314 -? Bleach.s16e03-04.313-314-GROUP +? Bleach.s16e03-04.313-314 +? Bleach.s16e03-04.313-314 +? Bleach - s16e03-04 - 313-314 +? Bleach.s16e03-04.313-314 ? Bleach s16e03e04 313-314 -: title: Bleach +: episode: [3, 4] season: 16 - episode: [3, 4] - absolute_episode: [313, 314] + title: Bleach ? Bleach - 313-314 : options: -E @@ -1546,7 +1599,7 @@ release_group: ShinBunBu-Subs screen_size: 720p title: Bleach - video_codec: H.264 + video_codec: h264 ? 003. Show Name - Ep Name.avi : episode: 3 @@ -1570,23 +1623,23 @@ ? Project.Runway.S14E00.and.S14E01.(Eng.Subs).SDTV.x264-[2Maverick].mp4 : episode: [0, 1] - source: TV + format: TV release_group: 2Maverick season: 14 title: Project Runway subtitle_language: en - video_codec: H.264 + video_codec: h264 ? '[Hatsuyuki-Kaitou]_Fairy_Tail_2_-_16-20_[720p][10bit].torrent' : episode: [16, 17, 18, 19, 20] release_group: Hatsuyuki-Kaitou screen_size: 720p title: Fairy Tail 2 - color_depth: 10-bit + video_profile: 10bit ? '[Hatsuyuki-Kaitou]_Fairy_Tail_2_-_16-20_(191-195)_[720p][10bit].torrent' -: episode: [16, 17, 18, 19, 20] - absolute_episode: [191, 192, 193, 194, 195] +: options: -E + episode: [16, 17, 18, 19, 20, 191, 192, 193, 194, 195] release_group: Hatsuyuki-Kaitou screen_size: 720p title: Fairy Tail 2 @@ -1600,15 +1653,15 @@ ? The.Good.Wife.S06E01.E10.720p.WEB-DL.DD5.1.H.264-CtrlHD/The.Good.Wife.S06E09.Trust.Issues.720p.WEB-DL.DD5.1.H.264-CtrlHD.mkv : audio_channels: '5.1' - audio_codec: Dolby Digital + audio_codec: AC3 episode: 9 - source: Web + format: WEB-DL release_group: CtrlHD screen_size: 720p season: 6 title: The Good Wife episode_title: Trust Issues - video_codec: H.264 + video_codec: h264 ? Fear the Walking Dead - 01x02 - So Close, Yet So Far.REPACK-KILLERS.French.C.updated.Addic7ed.com.mkv : episode: 2 @@ -1630,15 +1683,16 @@ ? /av/unsorted/The.Daily.Show.2015.07.22.Jake.Gyllenhaal.720p.HDTV.x264-BATV.mkv : date: 2015-07-22 - source: HDTV + format: HDTV release_group: BATV screen_size: 720p title: The Daily Show episode_title: Jake Gyllenhaal - video_codec: H.264 + video_codec: h264 ? "[7.1.7.8.5] Foo Bar - 11 (H.264) [5235532D].mkv" -: episode: 11 +: options: -E + episode: 11 ? my 720p show S01E02 : options: -T "my 720p show" @@ -1669,56 +1723,58 @@ screen_size: 720p season: 1 title: Foo's & Bars - video_codec: Xvid + video_codec: XviD year: 2009 ? Date.Series.10-11-2008.XViD : date: 2008-11-10 title: Date - video_codec: Xvid + video_codec: XviD ? Scrubs/SEASON-06/Scrubs.S06E09.My.Perspective.DVDRip.XviD-WAT/scrubs.s06e09.dvdrip.xvid-wat.avi : container: avi episode: 9 episode_title: My Perspective - source: DVD - other: Rip + format: DVD + mimetype: video/x-msvideo release_group: WAT season: 6 title: Scrubs - video_codec: Xvid + video_codec: XviD ? '[PuyaSubs!] Digimon Adventure tri - 01 [720p][F9967949].mkv' : container: mkv crc32: F9967949 episode: 1 + mimetype: video/x-matroska release_group: PuyaSubs! screen_size: 720p title: Digimon Adventure tri ? Sherlock.S01.720p.BluRay.x264-AVCHD -: source: Blu-ray +: format: BluRay screen_size: 720p season: 1 title: Sherlock - video_codec: H.264 + video_codec: h264 ? Running.Wild.With.Bear.Grylls.S02E07.Michael.B.Jordan.PROPER.HDTV.x264-W4F.avi : container: avi episode: 7 episode_title: Michael B Jordan - source: HDTV + format: HDTV + mimetype: video/x-msvideo other: Proper proper_count: 1 release_group: W4F season: 2 title: Running Wild With Bear Grylls - video_codec: H.264 + video_codec: h264 ? Homeland.S05E11.Our.Man.in.Damascus.German.Sub.720p.HDTV.x264.iNTERNAL-BaCKToRG : episode: 11 episode_title: Our Man in Damascus - source: HDTV + format: HDTV other: Internal release_group: BaCKToRG screen_size: 720p @@ -1726,14 +1782,14 @@ subtitle_language: de title: Homeland type: episode - video_codec: H.264 + video_codec: h264 ? Breaking.Bad.S01E01.2008.BluRay.VC1.1080P.5.1.WMV-NOVO : title: Breaking Bad season: 1 episode: 1 year: 2008 - source: Blu-ray + format: BluRay screen_size: 1080p audio_channels: '5.1' container: WMV @@ -1744,8 +1800,8 @@ : title: Cosmos A Space Time Odyssey season: 1 episode: 2 - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 other: Proper proper_count: 1 release_group: LOL @@ -1755,8 +1811,8 @@ : title: Fear The Walking Dead season: 2 episode: 1 - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 audio_codec: AAC container: mp4 release_group: k3n @@ -1768,8 +1824,8 @@ episode: 1 episode_details: Pilot episode_title: Pilot - source: DVD - video_codec: H.264 + format: DVD + video_codec: h264 other: [Screener, Preair] release_group: NoGRP type: episode @@ -1778,8 +1834,8 @@ : title: Once Upon a Time season: 5 episode: 19 - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 other: Proper proper_count: 1 release_group: LOL[ettv] @@ -1789,49 +1845,49 @@ : title: Show Name season: 1 episode: 3 - source: Web - video_codec: H.264 + format: WEB-DL + video_codec: h264 language: hu release_group: nIk type: episode ? Game.of.Thrones.S6.Ep5.X265.Dolby.2.0.KTM3.mp4 : audio_channels: '2.0' - audio_codec: Dolby Digital + audio_codec: AC3 container: mp4 episode: 5 release_group: KTM3 season: 6 title: Game of Thrones type: episode - video_codec: H.265 + video_codec: h265 ? Fargo.-.Season.1.-.720p.BluRay.-.x264.-.ShAaNiG -: source: Blu-ray +: format: BluRay release_group: ShAaNiG screen_size: 720p season: 1 title: Fargo type: episode - video_codec: H.264 + video_codec: h264 ? Show.Name.S02E02.Episode.Title.1080p.WEB-DL.x264.5.1Ch.-.Group : audio_channels: '5.1' episode: 2 episode_title: Episode Title - source: Web + format: WEB-DL release_group: Group screen_size: 1080p season: 2 title: Show Name type: episode - video_codec: H.264 + video_codec: h264 ? Breaking.Bad.S01E01.2008.BluRay.VC1.1080P.5.1.WMV-NOVO : audio_channels: '5.1' container: wmv episode: 1 - source: Blu-ray + format: BluRay release_group: NOVO screen_size: 1080p season: 1 @@ -1841,20 +1897,20 @@ ? Cosmos.A.Space.Time.Odyssey.S01E02.HDTV.x264.PROPER-LOL : episode: 2 - source: HDTV + format: HDTV other: Proper proper_count: 1 release_group: LOL season: 1 title: Cosmos A Space Time Odyssey type: episode - video_codec: H.264 + video_codec: h264 ? Elementary.S01E01.Pilot.DVDSCR.x264.PREAiR-NoGRP : episode: 1 episode_details: Pilot episode_title: Pilot - source: DVD + format: DVD other: - Screener - Preair @@ -1862,24 +1918,25 @@ season: 1 title: Elementary type: episode - video_codec: H.264 + video_codec: h264 ? Fear.The.Walking.Dead.S02E01.HDTV.x264.AAC.MP4-k3n.mp4 : audio_codec: AAC container: mp4 episode: 1 - source: HDTV + format: HDTV + mimetype: video/mp4 release_group: k3n season: 2 title: Fear The Walking Dead type: episode - video_codec: H.264 + video_codec: h264 ? Game.of.Thrones.S03.1080p.BluRay.DTS-HD.MA.5.1.AVC.REMUX-FraMeSToR : audio_channels: '5.1' - audio_codec: DTS-HD - audio_profile: Master Audio - source: Blu-ray + audio_codec: DTS + audio_profile: HDMA + format: BluRay other: Remux release_group: FraMeSToR screen_size: 1080p @@ -1889,16 +1946,16 @@ ? Show.Name.S01E02.HDTV.x264.NL-subs-ABC : episode: 2 - source: HDTV + format: HDTV release_group: ABC season: 1 subtitle_language: nl title: Show Name type: episode - video_codec: H.264 + video_codec: h264 ? Friends.S01-S10.COMPLETE.720p.BluRay.x264-PtM -: source: Blu-ray +: format: BluRay other: Complete release_group: PtM screen_size: 720p @@ -1915,44 +1972,44 @@ - 10 title: Friends type: episode - video_codec: H.264 + video_codec: h264 ? Duck.Dynasty.S02E07.Streik.German.DOKU.DL.WS.DVDRiP.x264-CDP : episode: 7 - episode_title: Streik German - source: DVD + episode_title: Streik German DOKU + format: DVD language: mul - other: [Documentary, Widescreen, Rip] + other: WideScreen release_group: CDP season: 2 title: Duck Dynasty type: episode - video_codec: H.264 + video_codec: h264 ? Family.Guy.S13E14.JOLO.German.AC3D.DL.720p.WebHD.x264-CDD -: audio_codec: Dolby Digital +: audio_codec: AC3 episode: 14 episode_title: JOLO German - source: Web + format: WEB-DL language: mul release_group: CDD screen_size: 720p season: 13 title: Family Guy type: episode - video_codec: H.264 + video_codec: h264 ? How.I.Met.Your.Mother.COMPLETE.SERIES.DVDRip.XviD-AR : options: -L en -C us - source: DVD - other: [Complete, Rip] + format: DVD + other: Complete release_group: AR title: How I Met Your Mother type: movie # Should be episode - video_codec: Xvid + video_codec: XviD ? Show Name The Complete Seasons 1 to 5 720p BluRay x265 HEVC-SUJAIDR[UTR] -: source: Blu-ray +: format: BluRay other: Complete release_group: SUJAIDR[UTR] screen_size: 720p @@ -1964,12 +2021,12 @@ - 5 title: Show Name type: episode - video_codec: H.265 + video_codec: h265 ? Fear.the.Walking.Dead.-.Season.2.epi.02.XviD.Eng.Ac3-5.1.sub.ita.eng.iCV-MIRCrew : options: -t episode audio_channels: '5.1' - audio_codec: Dolby Digital + audio_codec: AC3 episode: 2 episode_title: epi language: en @@ -1978,11 +2035,11 @@ subtitle_language: it title: Fear the Walking Dead type: episode - video_codec: Xvid + video_codec: XviD ? Game.Of.Thrones.S06E04.720p.PROPER.HDTV.x264-HDD : episode: 4 - source: HDTV + format: HDTV other: Proper proper_count: 1 release_group: HDD @@ -1990,54 +2047,53 @@ season: 6 title: Game Of Thrones type: episode - video_codec: H.264 + video_codec: h264 ? Marvels.Daredevil.S02E04.WEBRip.x264-NF69.mkv : container: mkv episode: 4 - source: Web - other: Rip + format: WEBRip release_group: NF69 season: 2 title: Marvels Daredevil type: episode - video_codec: H.264 + video_codec: h264 ? The.Walking.Dead.S06E01.FRENCH.1080p.WEB-DL.DD5.1.HEVC.x265-GOLF68 : audio_channels: '5.1' - audio_codec: Dolby Digital + audio_codec: AC3 episode: 1 - source: Web + format: WEB-DL language: fr release_group: GOLF68 screen_size: 1080p season: 6 title: The Walking Dead type: episode - video_codec: H.265 + video_codec: h265 ? American.Crime.S01E03.FASTSUB.VOSTFR.720p.HDTV.x264-F4ST : episode: 3 - source: HDTV - other: Fast Subtitled + format: HDTV + other: Fastsub release_group: F4ST screen_size: 720p season: 1 subtitle_language: fr title: American Crime type: episode - video_codec: H.264 + video_codec: h264 ? Gotham.S02E12.FASTSUB.VOSTFR.HDTV.X264-F4ST3R : episode: 12 - source: HDTV - other: Fast Subtitled + format: HDTV + other: Fastsub release_group: F4ST3R season: 2 subtitle_language: fr title: Gotham type: episode - video_codec: H.264 + video_codec: h264 # WEBRip + LD ? Australian.Story.2016.05.23.Into.The.Fog.of.War.Part.1.360p.LDTV.WEBRIP.[MPup] @@ -2046,8 +2102,8 @@ episode_title: Into The Fog of War part: 1 screen_size: 360p - other: [Low Definition, Rip] - source: Web + other: LD + format: WEBRip release_group: MPup type: episode @@ -2057,8 +2113,8 @@ season: 4 episode: 6 language: fr - source: Analog HDTV - video_codec: Xvid + format: AHDTV + video_codec: XviD type: episode # WEBDLRip @@ -2066,10 +2122,10 @@ : title: Show Name season: 6 episode: 14 - source: Web - other: Rip + format: WEBRip release_group: qqss44 container: avi + mimetype: video/x-msvideo type: episode # WEBCap @@ -2079,9 +2135,8 @@ episode: 6 episode_title: Steven Floats screen_size: 720p - source: Web - other: Rip - video_codec: H.264 + format: WEBRip + video_codec: h264 release_group: SRS type: episode @@ -2091,9 +2146,9 @@ season: 5 episode: 9 episode_title: Some Episode Title - other: Widescreen - source: Satellite - video_codec: H.264 + other: WideScreen + format: SATRip + video_codec: h264 release_group: NY2 type: episode @@ -2102,9 +2157,9 @@ : title: Squidbillies season: 4 episode: 5 - other: [Widescreen, Rip] - source: Satellite - video_codec: Xvid + other: WideScreen + format: SATRip + video_codec: XviD release_group: aAF type: episode @@ -2112,13 +2167,14 @@ ? /series/The.B*.B*.T*.S10E01.1080p.HDTV.X264-DIMENSION[rarbg]/The.B*.B*.T*.S10E01.1080p.HDTV.X264-DIMENSION.mkv : container: mkv episode: 1 - source: HDTV - release_group: DIMENSION + format: HDTV + mimetype: video/x-matroska + release_group: DIMENSION[rarbg] screen_size: 1080p season: 10 title: The B B T type: episode - video_codec: H.264 + video_codec: h264 ? '[Y-F] Very long Show Name Here - 03 Vostfr HD 8bits' : release_group: Y-F @@ -2126,7 +2182,7 @@ episode: 3 subtitle_language: fr other: HD - color_depth: 8-bit + video_profile: 8bit type: episode ? '[.www.site.com.].-.Snooze.and.Go.Sleep.S03E02.1080p.HEVC.x265-MeGusta' @@ -2136,17 +2192,17 @@ season: 3 title: Snooze and Go Sleep type: episode - video_codec: H.265 + video_codec: h265 website: www.site.com ? Show.Name.S01.720p.HDTV.DD5.1.x264-Group/show.name.0106.720p-group.mkv : title: Show Name season: 1 screen_size: 720p - source: HDTV - audio_codec: Dolby Digital + format: HDTV + audio_codec: AC3 audio_channels: '5.1' - video_codec: H.264 + video_codec: h264 release_group: Group episode: 6 container: mkv @@ -2155,8 +2211,8 @@ ? Coupling Season 1 - 4 Complete DVDRip/Coupling Season 4/Coupling - (4x03) - Bed Time.mkv : title: Coupling - other: [Complete, Rip] - source: DVD + other: Complete + format: DVD season: 4 episode: 3 episode_title: Bed Time @@ -2168,11 +2224,404 @@ : title: Vice News Tonight date: 2016-10-10 screen_size: 1080p - source: Web - other: Rip + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: Amazon +? Show.Name.S07E04.Service.1080p.AMZN.WEBRip.DD+5.1.x264 +: title: Show Name + season: 7 + episode: 4 + episode_title: Service + screen_size: 1080p + streaming_service: Amazon Prime + format: WEBRip + audio_codec: EAC3 + audio_channels: '5.1' + video_codec: h264 + type: episode + +# Streaming service: Comedy Central +? Show.Name.2016.09.28.Nice.Title.Extended.1080p.CC.WEBRip.AAC2.0.x264-monkee +: title: Show Name + date: 2016-09-28 + episode_title: Nice Title + edition: Extended + screen_size: 1080p + streaming_service: Comedy Central + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: The CW +? Show.Name.US.S12E20.Nice.Title.720p.CW.WEBRip.AAC2.0.x264-monkee +: title: Show Name + country: US + season: 12 + episode: 20 + episode_title: Nice Title + screen_size: 720p + streaming_service: The CW + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: AMBC +? Show.Name.2016.09.27.Nice.Title.720p.AMBC.WEBRip.AAC2.0.x264-monkee +: title: Show Name + date: 2016-09-27 + episode_title: Nice Title + screen_size: 720p + streaming_service: ABC + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: HIST +? Show.Name.720p.HIST.WEBRip.AAC2.0.H.264-monkee +: options: -t episode + title: Show Name + screen_size: 720p + streaming_service: History + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: PBS +? Show.Name.2015.Nice.Title.1080p.PBS.WEBRip.AAC2.0.H264-monkee +: options: -t episode + title: Show Name + year: 2015 + episode_title: Nice Title + screen_size: 1080p + streaming_service: PBS + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: SeeSo +? Show.Name.2016.Nice.Title.1080p.SESO.WEBRip.AAC2.0.x264-monkee +: options: -t episode + title: Show Name + year: 2016 + episode_title: Nice Title + screen_size: 1080p + streaming_service: SeeSo + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: Discovery +? Show.Name.S01E03.Nice.Title.720p.DISC.WEBRip.AAC2.0.x264-NTb +: title: Show Name + season: 1 + episode: 3 + episode_title: Nice Title + screen_size: 720p + streaming_service: Discovery + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: NTb + type: episode + +# Streaming service: BBC iPlayer +? Show.Name.2016.08.18.Nice.Title.720p.iP.WEBRip.AAC2.0.H.264-monkee +: title: Show Name + date: 2016-08-18 + episode_title: Nice Title + streaming_service: BBC iPlayer + screen_size: 720p + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: A&E +? Show.Name.S15E18.Nice.Title.720p.AE.WEBRip.AAC2.0.H.264-monkee +: title: Show Name + season: 15 + episode: 18 + episode_title: Nice Title + screen_size: 720p + streaming_service: A&E + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: Adult Swim +? Show.Name.S04E01.Nice.Title.1080p.AS.WEBRip.AAC2.0.H.264-monkee +: title: Show Name + season: 4 + episode: 1 + episode_title: Nice Title + screen_size: 1080p + streaming_service: Adult Swim + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: Netflix +? Show.Name.2013.S02E03.1080p.NF.WEBRip.DD5.1.x264-NTb.mkv +: title: Show Name + year: 2013 + season: 2 + episode: 3 + screen_size: 1080p + streaming_service: Netflix + format: WEBRip + audio_codec: AC3 + audio_channels: '5.1' + video_codec: h264 + release_group: NTb + container: mkv + mimetype: video/x-matroska + type: episode + +# Streaming service: CBS +? Show.Name.2016.05.10.Nice.Title.720p.CBS.WEBRip.AAC2.0.x264-monkee +: title: Show Name + date: 2016-05-10 + episode_title: Nice Title + screen_size: 720p + streaming_service: CBS + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: NBA TV +? NBA.2016.02.27.Team.A.vs.Team.B.720p.NBA.WEBRip.AAC2.0.H.264-monkee +: title: NBA + date: 2016-02-27 + episode_title: Team A vs Team B + screen_size: 720p + streaming_service: NBA TV + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: ePix +? Show.Name.S05E04.Nice.Title.Part4.720p.EPIX.WEBRip.AAC2.0.H.264-monkee +: title: Show Name + season: 5 + episode: 4 + episode_title: Nice Title + part: 4 + screen_size: 720p + streaming_service: ePix + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: NBC +? Show.Name.S41E03.Nice.Title.720p.NBC.WEBRip.AAC2.0.x264-monkee +: title: Show Name + season: 41 + episode: 3 + episode_title: Nice Title + screen_size: 720p + streaming_service: NBC + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: Syfy +? Show.Name.S01E02.Nice.Title.720p.SYFY.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: Syfy + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: group + type: episode + +# Streaming service: Spike TV +? Show.Name.S01E02.Nice.Title.720p.SPKE.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: Spike TV + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: group + type: episode + +# Streaming service: IFC +? Show.Name.S01E02.Nice.Title.720p.IFC.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: IFC + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: group + type: episode + +# Streaming service: NATG +? Show.Name.S01E02.Nice.Title.720p.NATG.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: National Geographic + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: group + type: episode + +# Streaming service: NFL +? Show.Name.S01E02.Nice.Title.720p.NFL.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: NFL + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: group + type: episode + +# Streaming service: UFC +? Show.Name.S01E02.Nice.Title.720p.UFC.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: UFC + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: group + type: episode + +# Streaming service: TV Land +? Show.Name.S01E02.Nice.Title.720p.TVL.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: TV Land + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: group + type: episode + +# Streaming service: Crunchy Roll +? Show.Name.S01.1080p.CR.WEBRip.AAC.2.0.x264-monkee +: title: Show Name + season: 1 + screen_size: 1080p + streaming_service: Crunchy Roll + format: WEBRip audio_codec: AAC audio_channels: '2.0' - video_codec: H.264 + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: Disney +? Show.Name.S01.1080p.DSNY.WEBRip.AAC.2.0.x264-monkee +: title: Show Name + season: 1 + screen_size: 1080p + streaming_service: Disney + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: Nickelodeon +? Show.Name.S01.1080p.NICK.WEBRip.AAC.2.0.x264-monkee +: title: Show Name + season: 1 + screen_size: 1080p + streaming_service: Nickelodeon + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: monkee + type: episode + +# Streaming service: TFou +? Show.Name.S01.1080p.TFOU.WEBRip.AAC.2.0.x264-monkee +: title: Show Name + season: 1 + screen_size: 1080p + streaming_service: TFou + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 release_group: monkee type: episode @@ -2192,8 +2641,8 @@ size: 177MB other: Proper proper_count: 1 - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 type: episode ? Show.Name.S03E15.480p.4.8GB.Proper.HDTV.x264 @@ -2204,8 +2653,8 @@ size: 4.8GB other: Proper proper_count: 1 - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 type: episode ? Show.Name.S03.1.1TB.Proper.HDTV.x264 @@ -2214,8 +2663,8 @@ size: 1.1TB other: Proper proper_count: 1 - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 type: episode ? Some.Show.S02E14.1080p.HDTV.X264-reenc.GROUP @@ -2226,9 +2675,9 @@ season: 2 episode: 14 screen_size: 1080p - source: HDTV - video_codec: H.264 - other: Reencoded + format: HDTV + video_codec: h264 + other: ReEncoded release_group: GROUP type: episode @@ -2238,13 +2687,12 @@ year: 2016 season: 1 episode: 1 - screen_size: 2160p + screen_size: 4K streaming_service: Amazon Prime - source: Web - other: Rip - audio_codec: Dolby Digital Plus + format: WEBRip + audio_codec: EAC3 audio_channels: '5.1' - video_codec: H.264 + video_codec: h264 release_group: Group type: episode @@ -2252,10 +2700,10 @@ : title: Show Name season: 2 episode: 19 - video_codec: H.264 + video_codec: h264 language: it audio_codec: AAC - source: Web + format: WEB-DL other: Mux release_group: UBi type: episode @@ -2265,11 +2713,11 @@ season: 1 episode: 10 screen_size: 1080p - video_codec: H.264 + video_codec: h264 language: [it, en] - source: Web + format: WEB-DL other: Mux - audio_codec: Dolby Digital + audio_codec: AC3 subtitle_language: [it, en] release_group: GiuseppeTnT Littlelinx type: episode @@ -2278,10 +2726,10 @@ : title: Show Name season: 4 episode: [7, 8] - video_codec: H.264 + video_codec: h264 language: it audio_codec: AAC - source: HDTV + format: HDTV other: Mux release_group: Group type: episode @@ -2292,9 +2740,9 @@ episode: 18 episode_title: Un Tuffo Nel Passato language: it - source: HDTV + format: HDTV other: Mux - video_codec: H.264 + video_codec: h264 release_group: Group type: episode @@ -2302,34 +2750,33 @@ : title: Show Name season: 3 screen_size: 1080p - source: Blu-ray + format: BluRay other: Mux - video_codec: H.264 - audio_codec: DTS-HD - audio_profile: Master Audio + video_codec: h264 + audio_codec: DTS + audio_profile: HDMA type: episode ? Show.Name.-.07.(2016).[RH].[English.Dubbed][WEBRip]..[HD.1080p] : options: -t episode episode: 7 - source: Web - other: Rip + format: WEBRip language: en - other: [HD, Rip] + other: HD screen_size: 1080p title: Show Name type: episode year: 2016 ? Show.Name.-.476-479.(2007).[HorribleSubs][WEBRip]..[HD.720p] -: options: -t episode +: options: -t episode -E episode: - 476 - 477 - 478 - 479 - source: Web - other: [Rip, HD] + format: WEBRip + other: HD release_group: HorribleSubs screen_size: 720p title: Show Name @@ -2341,19 +2788,128 @@ title: 11.22.63 season: 1 episode: 6 - source: HDTV + format: HDTV release_group: abc type: episode +# Streaming service: DIY Network +? Show.Name.S01.720p.DIY.WEBRip.AAC2.0.H.264-BTN +: title: Show Name + season: 1 + screen_size: 720p + streaming_service: DIY Network + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: BTN + type: episode + +# Streaming service: USA Network +? Show.Name.S01E02.Exfil.1080p.USAN.WEBRip.AAC2.0.x264-AJP69 +: title: Show Name + season: 1 + episode: 2 + screen_size: 1080p + streaming_service: USA Network + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: AJP69 + type: episode + +# Streaming service: TV3 Ireland +? Show.Name.S01E08.576p.TV3.WEBRip.AAC2.0.x264-HARiKEN +: title: Show Name + season: 1 + episode: 8 + screen_size: 576p + streaming_service: TV3 Ireland + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: HARiKEN + type: episode + +# Streaming service: TV4 Sweeden +? Show.Name.S05.720p.TV4.WEBRip.AAC2.0.H.264-BTW +: title: Show Name + season: 5 + screen_size: 720p + streaming_service: TV4 Sweeden + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: BTW + type: episode + +# Streaming service: TLC +? Show.Name.S02.720p.TLC.WEBRip.AAC2.0.x264-BTW +: title: Show Name + season: 2 + screen_size: 720p + streaming_service: TLC + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: BTW + type: episode + +# Streaming service: Investigation Discovery +? Show.Name.S01E01.720p.ID.WEBRip.AAC2.0.x264-BTW +: title: Show Name + season: 1 + episode: 1 + screen_size: 720p + streaming_service: Investigation Discovery + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: BTW + type: episode + +# Streaming service: RTÉ One +? Show.Name.S10E01.576p.RTE.WEBRip.AAC2.0.H.264-RTN +: title: Show Name + season: 10 + episode: 1 + screen_size: 576p + streaming_service: RTÉ One + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: RTN + type: episode + +# Streaming service: AMC +? Show.Name.S01E01.1080p.AMC.WEBRip.H.264.AAC2.0-CasStudio +: title: Show Name + season: 1 + episode: 1 + screen_size: 1080p + streaming_service: AMC + format: WEBRip + audio_codec: AAC + audio_channels: '2.0' + video_codec: h264 + release_group: CasStudio + type: episode + ? Proof.2015.S01E10.1080p.WEB-DL.DD5.1.H.264-KINGS.mkv : title: Proof season: 1 episode: 10 screen_size: 1080p - source: Web - audio_codec: Dolby Digital + format: WEB-DL + audio_codec: AC3 audio_channels: '5.1' - video_codec: H.264 + video_codec: h264 release_group: KINGS container: mkv type: episode @@ -2364,8 +2920,8 @@ season: 6 episode: 16 other: Hardcoded Subtitles - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 subtitle_language: sv type: episode @@ -2376,11 +2932,10 @@ episode: 8 screen_size: 1080p streaming_service: Netflix - source: Web - other: Rip - audio_codec: Dolby Digital + format: WEBRip + audio_codec: AC3 audio_channels: '5.1' - video_codec: H.264 + video_codec: h264 release_group: ViSUM container: mkv type: episode @@ -2398,10 +2953,10 @@ season: 2 episode: 5 screen_size: 1080p - source: Web - audio_codec: Dolby Digital + format: WEB-DL + audio_codec: AC3 audio_channels: '5.1' - video_codec: H.264 + video_codec: h264 release_group: HKD container: mkv type: episode @@ -2412,10 +2967,10 @@ episode: 14 episode_title: Brother Up screen_size: 1080p - source: Web + format: WEB-DL audio_codec: AAC audio_channels: '2.0' - video_codec: H.264 + video_codec: h264 release_group: TVSmash container: mkv type: episode @@ -2426,11 +2981,10 @@ episode: 2 episode_title: Tempus Fugit screen_size: 720p - source: Web - other: Rip + format: WEBRip audio_codec: AAC audio_channels: '2.0' - video_codec: H.264 + video_codec: h264 release_group: BTW container: mkv type: episode @@ -2441,10 +2995,10 @@ episode: 2 episode_title: The Brain In The Bot screen_size: 1080p - source: Web - audio_codec: Dolby Digital + format: WEB-DL + audio_codec: AC3 audio_channels: '5.1' - video_codec: H.264 + video_codec: h264 release_group: R2D2 container: mkv type: episode @@ -2455,10 +3009,10 @@ season: 1 episode: 7 screen_size: 1080p - source: Web - audio_codec: Dolby Digital + format: WEB-DL + audio_codec: AC3 audio_channels: '5.1' - video_codec: H.264 + video_codec: h264 subtitle_language: nl release_group: Q container: mkv @@ -2470,11 +3024,11 @@ episode: 1 episode_title: Love the Way You Lie screen_size: 1080p - source: Web + format: WEB-DL audio_codec: AAC audio_channels: '2.0' - video_codec: H.264 - release_group: NL + video_codec: h264 + language: nl container: mkv type: episode @@ -2483,8 +3037,8 @@ season: 2 episode: 12 screen_size: 1080p - source: Web - audio_codec: Dolby Digital + format: WEB-DL + audio_codec: AC3 audio_channels: '5.1' release_group: Het.Robot.Team.OYM type: episode @@ -2496,8 +3050,8 @@ season: 1 episode: 2 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 language: es release_group: NEWPCT type: episode @@ -2508,7 +3062,7 @@ : title: Show Name season: 4 episode: 8 - source: HDTV + format: HDTV language: ca type: episode @@ -2520,7 +3074,7 @@ # newpct ? Show.Name.-.Temporada1.[HDTV][Cap.105][Español.Castellano] : title: Show Name - source: HDTV + format: HDTV season: 1 episode: 5 language: ca @@ -2529,7 +3083,7 @@ # newpct ? Show.Name.-.Temporada1.[HDTV][Cap.105][Español] : title: Show Name - source: HDTV + format: HDTV season: 1 episode: 5 language: es @@ -2541,8 +3095,8 @@ season: 1 episode: [2, 3, 4] screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 language: es release_group: NEWPCT type: episode @@ -2553,8 +3107,8 @@ season: 15 episode: 3 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 language: es release_group: NEWPCT type: episode @@ -2565,8 +3119,8 @@ season: 15 episode: [3, 4, 5, 6] screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 language: es release_group: NEWPCT type: episode @@ -2577,8 +3131,8 @@ season: 1 episode: 2 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 language: es release_group: NEWPCT type: episode @@ -2589,8 +3143,8 @@ season: 1 episode: 2 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 language: es release_group: NEWPCT type: episode @@ -2601,11 +3155,11 @@ season: 1 episode: [12, 13, 14] screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 language: es release_group: NEWPCT - episode_details: Final + other: FINAL type: episode ? Mastercook Italia - Stagione 6 (2016) 720p ep13 spyro.mkv @@ -2635,22 +3189,23 @@ episode: 18 episode_title: Un Tuffo Nel Passato language: it - source: HDTV + format: HDTV other: Mux - video_codec: H.264 + video_codec: h264 release_group: NovaRip type: episode # Italian releases ? Show Name 3x18 Un Tuffo Nel Passato ITA HDTVMux x264 NovaRip -: title: Show Name +: options: --allowed-languages it + title: Show Name season: 3 episode: 18 episode_title: Un Tuffo Nel Passato language: it - source: HDTV + format: HDTV other: Mux - video_codec: H.264 + video_codec: h264 release_group: NovaRip type: episode @@ -2665,8 +3220,8 @@ episode: 9 subtitle_language: und screen_size: 1080p - source: Blu-ray - video_codec: H.264 + format: BluRay + video_codec: h264 release_group: RRH type: episode @@ -2678,8 +3233,7 @@ season: 6 episode: 5 screen_size: 1080p - source: Web - other: Rip + format: WEBRip subtitle_language: pt-BR type: episode @@ -2688,7 +3242,7 @@ season: 1 episode: 7 episode_title: Super, Title - source: Web + format: WEB-DL screen_size: 720p subtitle_language: pt-BR container: srt @@ -2703,8 +3257,7 @@ season: 6 episode: 5 screen_size: 1080p - source: Web - other: Rip + format: WEBRip subtitle_language: pt type: episode @@ -2714,8 +3267,8 @@ episode: 1 subtitle_language: spa screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: sPHD type: episode @@ -2724,8 +3277,8 @@ season: 1 episode: 1 subtitle_language: deu - source: HDTV - video_codec: Xvid + format: HDTV + video_codec: XviD release_group: ASAP type: episode @@ -2736,15 +3289,15 @@ episode_title: Aint Nothing Like the Real Thing subtitle_language: deu screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 type: episode ? Show.Name.S01.Season.Complet.WEBRiP.Ro.Subbed.TM : title: Show Name season: 1 - other: [Complete, Rip] - source: Web + other: Complete + format: WEBRip subtitle_language: ro type: episode @@ -2754,11 +3307,10 @@ season: 3 subtitle_language: en screen_size: 720p - source: Web - other: Rip - video_codec: H.264 + format: WEBRip + video_codec: h264 container: mkv - audio_codec: Dolby Digital + audio_codec: AC3 audio_channels: '5.1' release_group: Ehhhh type: episode @@ -2769,10 +3321,10 @@ season: 2 episode: 3 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: Belex - other: Dual Audio + other: DualAudio language: und type: episode @@ -2781,8 +3333,8 @@ season: 6 episode: 10 screen_size: 1080p - source: Web - other: Dual Audio + format: WEB-DL + other: DualAudio language: und release_group: RK type: episode @@ -2792,8 +3344,8 @@ season: 6 episode: 12 screen_size: 720p - source: Web - other: Dual Audio + format: WEB-DL + other: DualAudio language: und type: episode @@ -2803,8 +3355,8 @@ episode: 7 screen_size: 720p language: und - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: 0SEC-pia container: mkv type: episode @@ -2814,11 +3366,10 @@ season: 2 episode: 7 episode_title: Shiva - audio_codec: Dolby Digital + audio_codec: AC3 language: und - source: Web - other: Rip - video_codec: H.264 + format: WEBRip + video_codec: h264 type: episode # Legendas @@ -2826,22 +3377,23 @@ : title: Show Name season: 5 screen_size: 1080p - source: Blu-ray - video_codec: H.264 + format: BluRay + video_codec: h264 release_group: Belex - other: Dual Audio + other: DualAudio subtitle_language: und type: episode # Legendas ? Show.Name.S05.1080p.BluRay.x264-Belex.-.Dual.Audio.+.Legendas -: title: Show Name +: options: --allowed-languages und + title: Show Name season: 5 screen_size: 1080p - source: Blu-ray - video_codec: H.264 + format: BluRay + video_codec: h264 release_group: Belex - other: Dual Audio + other: DualAudio subtitle_language: und type: episode @@ -2849,10 +3401,12 @@ ? Show.Name.S01E03.HDTV.Subtitulado.Esp.SC ? Show.Name.S01E03.HDTV.Subtitulado.Espanol.SC ? Show.Name.S01E03.HDTV.Subtitulado.Español.SC -: title: Show Name +# SC is a release group, not a language. To be addressed in #296 +: options: --allowed-languages spa --allowed-countries ESP + title: Show Name season: 1 episode: 3 - source: HDTV + format: HDTV subtitle_language: es release_group: SC type: episode @@ -2864,7 +3418,7 @@ season: 2 episode: 8 screen_size: 720p - source: Web + format: WEB-DL subtitle_language: und type: episode @@ -2881,8 +3435,8 @@ season: 6 episode: 5 language: de - audio_codec: Dolby Digital - source: HDTV + audio_codec: AC3 + format: HDTV type: episode ? Show.Name.S01E01.Savage.Season.GERMAN.DUBBED.WS.HDTVRip.x264-TVP @@ -2891,9 +3445,9 @@ episode: 1 episode_title: Savage Season language: de - other: [Widescreen, Rip] - source: HDTV - video_codec: H.264 + other: WideScreen + format: HDTV + video_codec: h264 release_group: TVP type: episode @@ -2903,7 +3457,7 @@ episode: 3 language: en screen_size: 720p - source: Web + format: WEB-DL release_group: JRR type: episode @@ -2921,8 +3475,8 @@ : title: Show Name season: 5 episode: 5 - source: HDTV - video_codec: Xvid + format: HDTV + video_codec: XviD release_group: AFG subtitle_language: he type: episode @@ -2933,7 +3487,7 @@ episode: 31 episode_title: Episode 55 screen_size: 720p - source: HDTV + format: HDTV type: episode # Scenario: Removing invalid season and episode matches. Correct episode_title match @@ -2944,11 +3498,10 @@ episode_title: eps2 4 m4ster-s1ave aes screen_size: 1080p streaming_service: Amazon Prime - source: Web - other: Rip - audio_codec: Dolby Digital + format: WEBRip + audio_codec: AC3 audio_channels: '5.1' - video_codec: H.264 + video_codec: h264 release_group: GROUP type: episode @@ -2958,9 +3511,9 @@ episode: 5 episode_title: 3xpl0its screen_size: 720p - source: Web + format: WEB-DL subtitle_language: en - video_codec: H.264 + video_codec: h264 type: episode # Regression: S4L release group detected as season 4 @@ -2969,8 +3522,8 @@ : title: Show Name season: 1 episode: 6 - source: DVD - video_codec: H.264 + format: DVD + video_codec: h264 release_group: S4L type: episode @@ -2979,8 +3532,8 @@ : title: The Show Name date: 2016-05-18 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: GROUP.VTV type: episode @@ -2994,7 +3547,7 @@ : title: Show Name episode: 6 screen_size: 720p - color_depth: 10-bit + video_profile: 10bit crc32: 1F5578AC release_group: SuperGroup type: episode @@ -3004,7 +3557,7 @@ : title: Show Name episode: 6 screen_size: 1080p - color_depth: 10-bit + video_profile: 10bit crc32: 1F5578AC release_group: SuperGroup type: episode @@ -3015,45 +3568,34 @@ title: Dimension W episode: 5 screen_size: 720p - color_depth: 10-bit - other: Dual Audio - source: TV + video_profile: 10bit + other: DualAudio + format: TV language: und crc32: EDA6E7F1 type: episode -? "[Zero-Raws].Show.Name.493-498.&.500-507.(CX.1280x720.VFR.x264.AAC)" -: release_group: Zero-Raws - title: Show Name - episode: [493, 494, 495, 496, 497, 498, 500, 501, 502, 503, 504, 505, 506, 507] - screen_size: 720p - subtitle_language: fr - video_codec: H.264 - audio_codec: AAC - type: episode - # NetflixUHD ? Show.Name.S01E06.NetflixUHD : title: Show Name season: 1 episode: 6 streaming_service: Netflix - other: Ultra HD + other: UltraHD type: episode ? Show.Name.S04E13.FINAL.MULTI.DD51.2160p.NetflixUHDRip.x265-TVS : title: Show Name season: 4 episode: 13 - episode_details: Final + other: FINAL language: mul - audio_codec: Dolby Digital + audio_codec: AC3 audio_channels: '5.1' - screen_size: 2160p + screen_size: 4K streaming_service: Netflix - source: Ultra HDTV - other: Rip - video_codec: H.265 + format: UHDTV + video_codec: h265 release_group: TVS type: episode @@ -3064,7 +3606,7 @@ episode_title: Of Late I Think of Rosewood streaming_service: iTunes other: HD - video_codec: H.264 + video_codec: h264 type: episode ? Show.Name.S01.720p.iTunes.h264-Group @@ -3072,7 +3614,7 @@ season: 1 screen_size: 720p streaming_service: iTunes - video_codec: H.264 + video_codec: h264 release_group: Group type: episode @@ -3083,7 +3625,7 @@ episode_title: eps1 0 hellofriend other: HD streaming_service: iTunes - audio_codec: Dolby Digital + audio_codec: AC3 language: spa year: 2015 container: avi @@ -3093,11 +3635,10 @@ : release_group: Hanamaru&LoliHouse title: The Dragon Dentist episode: 1 - source: Web - other: Rip + format: WEBRip screen_size: 1080p - video_codec: H.265 - color_depth: 10-bit + video_codec: h265 + video_profile: 10bit audio_codec: AAC container: mkv type: episode @@ -3112,7 +3653,7 @@ : title: Vikings season: 4 screen_size: 1080p - source: Web + format: WEB-DL subtitle_language: nl type: episode @@ -3122,8 +3663,8 @@ episode: 1 episode_title: Spark of Rebellion edition: Alternative Cut - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: W4F container: mp4 type: episode @@ -3132,8 +3673,8 @@ : title: DCs Legends of Tomorrow season: 2 episode: 12 - source: HDTV - video_codec: Xvid + format: HDTV + video_codec: XviD release_group: FUM type: episode @@ -3149,8 +3690,8 @@ season: 1 other: Proper screen_size: 720p - source: Blu-ray - video_codec: H.264 + format: BluRay + video_codec: h264 release_group: SHORTBREHD proper_count: 1 type: episode @@ -3167,8 +3708,8 @@ season: 7 episode: 14 other: Internal - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: YesTV type: episode @@ -3177,7 +3718,7 @@ date: 2016-05-25 episode_title: James McAvoy other: Internal - video_codec: Xvid + video_codec: XviD release_group: AFG type: episode @@ -3187,8 +3728,8 @@ episode: 13 other: [Internal, Read NFO] screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: 2HD type: episode @@ -3198,8 +3739,8 @@ episode: 13 other: Read NFO screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: 2HD type: episode @@ -3209,8 +3750,8 @@ episode: 21 other: Proper screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: SVA type: episode @@ -3218,21 +3759,20 @@ : title: Rick and Morty season: 1 edition: Uncensored - other: Rip - source: Blu-ray + format: BluRay screen_size: 1080p - video_codec: H.265 + video_codec: h265 type: episode ? 12.Monkeys.S01E01.LiMiTED.FRENCH.1080p.WEB-DL.H264-AUTHORiTY : title: 12 Monkeys season: 1 episode: 1 - edition: Limited + edition: Limited Edition language: french screen_size: 1080p - source: Web - video_codec: H.264 + format: WEB-DL + video_codec: h264 release_group: AUTHORiTY type: episode @@ -3242,8 +3782,8 @@ season: 3 episode: 5 other: West Coast Feed - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: 2HD type: episode @@ -3253,8 +3793,8 @@ season: 2 episode: [7, 8] other: West Coast Feed - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: 2HD type: episode @@ -3264,8 +3804,8 @@ episode: [1, 2] other: East Coast Feed screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: KILLERS type: episode @@ -3275,8 +3815,8 @@ season: 2 episode: 7 other: East Coast Feed - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: 2HD type: episode @@ -3287,10 +3827,10 @@ episode: 7 other: East Coast Feed screen_size: 720p - source: Web - audio_codec: Dolby Digital + format: WEB-DL + audio_codec: AC3 audio_channels: '5.1' - video_codec: H.264 + video_codec: h264 release_group: NTb type: episode @@ -3299,8 +3839,8 @@ season: 2 episode: 4 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: 0SEC [GloDLS] container: mkv type: episode @@ -3311,8 +3851,8 @@ episode: 1 episode_title: Los Angeles screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: MiNDTHEGAP type: episode @@ -3326,11 +3866,10 @@ episode_title: and the winner is screen_size: 720p streaming_service: Amazon Prime - source: Web - other: Rip - audio_codec: Dolby Digital + format: WEBRip + audio_codec: AC3 audio_channels: '5.1' - video_codec: H.264 + video_codec: h264 release_group: casstudio container: mkv type: episode @@ -3339,12 +3878,14 @@ : title: Adventure Time season: 8 episode: 16 + season: 8 + episode: 16 episode_title: Elements Part 1 Skyhooks screen_size: 720p - source: Web + format: WEB-DL audio_codec: AAC audio_channels: '2.0' - video_codec: H.264 + video_codec: h264 release_group: RTN container: mkv type: episode @@ -3354,7 +3895,9 @@ season: 7 episode: 22 episode_title: 2000 Light Years from Home + other: Classic container: mkv + mimetype: video/x-matroska type: episode ? Show.Name.S02E01.Super.Title.720p.WEB-DL.DD5.1.H.264-ABC.nzb @@ -3363,17 +3906,18 @@ episode: 1 episode_title: Super Title screen_size: 720p - source: Web - audio_codec: Dolby Digital + format: WEB-DL + audio_codec: AC3 audio_channels: '5.1' - video_codec: H.264 + video_codec: h264 release_group: ABC container: nzb type: episode ? "[SGKK] Bleach 312v1 [720p/mkv]-Group.mkv" : title: Bleach - episode: 312 + season: 3 + episode: 12 version: 1 screen_size: 720p release_group: Group @@ -3385,10 +3929,9 @@ season: 2 episode: 8 screen_size: 720p - source: Web - other: Rip - video_codec: H.264 - audio_codec: Dolby Digital Plus + format: WEBRip + video_codec: h264 + audio_codec: EAC3 release_group: KiNGS container: mkv type: episode @@ -3407,1090 +3950,16 @@ year: 2014 season: 2 episode: 8 - source: HDTV + format: HDTV release_group: lol[ettv] container: mkv type: episode ? "[Despair-Paradise].Kono.Subarashii.Sekai.ni.Shukufuku.wo!.2.-..09.vostfr.FHD" -: release_group: Despair-Paradise +: options: -E -t episode + release_group: Despair-Paradise title: Kono Subarashii Sekai ni Shukufuku wo! 2 episode: 9 subtitle_language: fr - other: Full HD - type: episode - -? Whose Line is it anyway/Season 01/Whose.Line.is.it.Anyway.US.S13E01.720p.WEB.x264-TBS.mkv -: title: Whose Line is it Anyway - season: 13 - episode: 1 - country: US - screen_size: 720p - source: Web - video_codec: H.264 - release_group: TBS - container: mkv - type: episode - -? Planet.Earth.II.S01.2160p.UHD.BluRay.HDR.DTS-HD.MA5.1.x265-ULTRAHDCLUB -: title: Planet Earth II - season: 1 - screen_size: 2160p - source: Ultra HD Blu-ray - other: HDR10 - audio_codec: DTS-HD - audio_profile: Master Audio - audio_channels: '5.1' - video_codec: H.265 - release_group: ULTRAHDCLUB - type: episode - -? Reizen.Waes.S03.FLEMISH.1080p.HDTV.MP2.H.264-NOGRP/Reizen.Waes.S03E05.China.PART1.FLEMISH.1080p.HDTV.MP2.H.264-NOGRP.mkv -: title: Reizen Waes - season: 3 - episode: 5 - part: 1 - language: nl-BE - screen_size: 1080p - source: HDTV - video_codec: H.264 - release_group: NOGRP - container: mkv - type: episode - -? "/folder/Marvels.Agent.Carter.S02E05.The.Atomic.Job.1080p.WEB-DL.DD5.1.H264-Coo7[rartv]/Marvel's.Agent.Carter.S02E05.The.Atomic.Job.1080p.WEB-DL.DD5.1.H.264-Coo7.mkv" -: title: Marvel's Agent Carter - season: 2 - episode: 5 - episode_title: The Atomic Job - release_group: Coo7 - type: episode - -? My.Name.Is.Earl.S01-S04.DVDRip.XviD-AR -: title: My Name Is Earl - season: [1, 2, 3, 4] - source: DVD - other: Rip - video_codec: Xvid - release_group: AR - type: episode - -? American.Dad.S01E01.Pilot.DVDRip.x264-CS -: title: American Dad - season: 1 - episode: 1 - episode_details: Pilot - source: DVD - other: Rip - video_codec: H.264 - release_group: CS - type: episode - -? Black.Sails.S01E01.HDTV.XviD.HebSubs-DR -: title: Black Sails - season: 1 - episode: 1 - source: HDTV - video_codec: Xvid - subtitle_language: he - release_group: DR - type: episode - -? The.West.Wing.S04E06.Game.On.720p.WEB-DL.AAC2.0.H.264-MC -: title: The West Wing - season: 4 - episode: 6 - episode_title: Game On - screen_size: 720p - source: Web - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: MC - type: episode - -? 12.Monkeys.S02E05.1080p.WEB-DL.DD5.1.H.264-NA -: title: 12 Monkeys - season: 2 - episode: 5 - screen_size: 1080p - source: Web - audio_codec: Dolby Digital - audio_channels: '5.1' - video_codec: H.264 - release_group: NA - type: episode - -? Fear.the.Walking.Dead.S03E07.1080p.AMZN.WEBRip.DD5.1.x264-VLAD[rarbg]/Fear.the.Walking.Dead.S03E07.1080p.AMZN.WEB-DL.DD+5.1.H.264-VLAD.mkv -: title: Fear the Walking Dead - season: 3 - episode: 7 - screen_size: 1080p - source: Web - audio_codec: Dolby Digital Plus - audio_channels: '5.1' - video_codec: H.264 - release_group: VLAD - container: mkv - type: episode - -? American.Crime.S01E02.1080p.WEB-DL.DD5.1.H.264-NL -: title: American Crime - season: 1 - episode: 2 - screen_size: 1080p - source: Web - audio_codec: Dolby Digital - audio_channels: '5.1' - video_codec: H.264 - release_group: NL - type: episode - -? Better.Call.Saul.S02.720p.HDTV.x264-TL -: title: Better Call Saul - season: 2 - screen_size: 720p - source: HDTV - video_codec: H.264 - release_group: TL - type: episode - -? 60.Minutes.2008.12.14.HDTV.XviD-YT -: options: -T '60 Minutes' - title: 60 Minutes - date: 2008-12-14 - source: HDTV - video_codec: Xvid - release_group: YT - type: episode - -? Storm.Chasers.Season.1 -: title: Storm Chasers - season: 1 - type: episode - -? Faking.It.2014.S03E08.720p.HDTV.x264-AVS -: title: Faking It - year: 2014 - season: 3 - episode: 8 - screen_size: 720p - source: HDTV - video_codec: H.264 - release_group: AVS - type: episode - -? /series/Marvel's Agents of S.H.I.E.L.D/Season 4/Marvels.Agents.of.S.H.I.E.L.D.S04E01.The.Ghost.1080p.WEB-DL.DD5.1.H.264-AG.mkv -: title: Marvels Agents of S.H.I.E.L.D. - season: 4 - episode: 1 - episode_title: The Ghost - screen_size: 1080p - source: Web - audio_codec: Dolby Digital - audio_channels: '5.1' - video_codec: H.264 - release_group: AG - container: mkv - type: episode - -? "[FASubs & TTF] Inuyasha - 099 [DVD] [B15AA1AC].mkv" -: release_group: FASubs & TTF - title: Inuyasha - episode: 99 - source: DVD - crc32: B15AA1AC - container: mkv - type: episode - -? Show.Name.S01E03.PL.SUBBED.480p.WEBRiP.x264 -: title: Show Name - season: 1 - episode: 3 - subtitle_language: pl - screen_size: 480p - source: Web - other: Rip - video_codec: H.264 - type: episode - -? Show.Name.s10e15(233).480p.BDRip-AVC.Ukr.hurtom -: title: Show Name - season: 10 - episode: 15 - screen_size: 480p - source: Blu-ray - other: Rip - video_codec: H.264 - language: uk - release_group: hurtom - type: episode - -? Goof.Troop.1x24.Waste.Makes.Haste.720p.HDTV.x264.CZ-SDTV -: title: Goof Troop - season: 1 - episode: 24 - episode_title: Waste Makes Haste - screen_size: 720p - source: HDTV - video_codec: H.264 - language: cs - release_group: SDTV - type: episode - -? Marvels.Daredevil.S02E11.German.DL.DUBBED.2160p.WebUHD.x264-UHDTV -: title: Marvels Daredevil - season: 2 - episode: 11 - language: [de, mul] - screen_size: 2160p - source: Web - video_codec: H.264 - release_group: UHDTV - type: episode - -? BBC The Story of China 1 of 6 - Ancestors CC HDTV x264 AC3 2.0 720p mkv -: title: BBC The Story of China - episode: 1 - episode_count: 6 - episode_title: Ancestors - source: HDTV - video_codec: H.264 - audio_codec: Dolby Digital - audio_channels: '2.0' - screen_size: 720p - container: mkv - type: episode - -? Duck.Dynasty.S09E04.Drone.Survivor.720p.AE.WEBRip.AAC2.0.H264-BTW[rartv] -: title: Duck Dynasty - season: 9 - episode: 4 - episode_title: Drone Survivor - screen_size: 720p - streaming_service: A&E - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: BTW[rartv] - type: episode - -? Mr.Selfridge.S04E03.720p.WEB-DL.AAC2.0.H264-MS[rartv] -: title: Mr Selfridge - season: 4 - episode: 3 - screen_size: 720p - source: Web - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: MS[rartv] - type: episode - -? Second.Chance.S01E02.One.More.Notch.1080p.WEB-DL.DD5.1.H264-SC[rartv] -: title: Second Chance - season: 1 - episode: 2 - episode_title: One More Notch - screen_size: 1080p - source: Web - audio_codec: Dolby Digital - audio_channels: '5.1' - video_codec: H.264 - release_group: rartv - type: episode - -? Total.Divas.S05E01.720p.HDTV.AAC2.0.H.264-SC-SDH -: title: Total Divas - season: 5 - episode: 1 - screen_size: 720p - source: HDTV - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: SDH - type: episode - -? Marvel's Jessica Jones (2015) s01e09 - AKA Sin Bin.mkv -: title: Marvel's Jessica Jones - season: 1 - episode: 9 - episode_title: AKA Sin Bin - container: mkv - type: episode - -? Hotel.Hell.S01E01.720p.DD5.1.448kbps-ALANiS -: title: Hotel Hell - season: 1 - episode: 1 - screen_size: 720p - audio_codec: Dolby Digital - audio_channels: '5.1' - audio_bit_rate: 448Kbps - release_group: ALANiS - type: episode - -? Greys.Anatomy.S07D1.NTSC.DVDR-ToF -: title: Greys Anatomy - season: 7 - disc: 1 - other: NTSC - source: DVD - release_group: ToF - type: episode - -? Greys.Anatomy.S07D1.NTSC.DVDR-ToF -: title: Greys Anatomy - season: 7 - disc: 1 - other: NTSC - source: DVD - release_group: ToF - type: episode - -? Greys.Anatomy.S07D1-3&5.NTSC.DVDR-ToF -: title: Greys Anatomy - season: 7 - disc: [1, 2, 3, 5] - other: NTSC - source: DVD - release_group: ToF - type: episode - -? El.Principe.2014.S01D01.SPANiSH.COMPLETE.BLURAY-COJONUDO -: title: El Principe - year: 2014 - season: 1 - disc: 1 - language: spa - other: Complete - source: Blu-ray - release_group: COJONUDO - type: episode - -? The Simpsons - Season 2 Complete [DVDRIP VP7 KEGGERMAN -: title: The Simpsons - season: 2 - other: [Complete, Rip] - source: DVD - video_codec: VP7 - release_group: KEGGERMAN - type: episode - -? Barney & Friends_ Easy as ABC (Season 9_ Episode 15)_VP8_Vorbis_360p.webm -: title: Barney & Friends Easy as ABC - season: 9 - episode: 15 - video_codec: VP8 - audio_codec: Vorbis - screen_size: 360p - container: webm - type: episode - -? Victoria.S01.1080p.BluRay.HEVC.DTSMA.LPCM.PGS-OZM -: title: Victoria - season: 1 - screen_size: 1080p - source: Blu-ray - video_codec: H.265 - audio_codec: [DTS-HD, LPCM] - audio_profile: Master Audio - # Does it worth to add subtitle_format? Such rare case - # subtitle_format: PGS - # release_group: OZM - type: episode - -? The.Prisoners.S01E03.1080p.DM.AAC2.0.x264-BTN -: title: The Prisoners - season: 1 - episode: 3 - screen_size: 1080p - source: Digital Master - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: BTN - type: episode - -? Panorama.S2013E25.Broken.by.Battle.1080p.DM.AAC2.0.x264-BTN -: title: Panorama - season: 2013 - episode: 25 - episode_title: Broken by Battle - screen_size: 1080p - source: Digital Master - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: BTN - type: episode - -? Our.World.S2014E11.Chinas.Model.Army.720p.DM.AAC2.0.x264-BTN -: title: Our World - season: 2014 - episode: 11 - episode_title: Chinas Model Army - screen_size: 720p - source: Digital Master - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: BTN - type: episode - -? Storyville.S2016E08.My.Nazi.Legacy.1080p.DM.x264-BTN -: title: Storyville - season: 2016 - episode: 8 - episode_title: My Nazi Legacy - screen_size: 1080p - source: Digital Master - video_codec: H.264 - release_group: BTN - type: episode - -? Comedians.in.Cars.Getting.Coffee.S07E01.1080p.DM.FLAC2.0.x264-NTb -: title: Comedians in Cars Getting Coffee - season: 7 - episode: 1 - screen_size: 1080p - source: Digital Master - audio_codec: FLAC - audio_channels: '2.0' - video_codec: H.264 - release_group: NTb - type: episode - -? "[SomeGroup-Fansub]_Show_Name_727_[VOSTFR][HD_1280x720]" -: release_group: SomeGroup-Fansub - title: Show Name - episode: 727 - subtitle_language: fr - other: HD - screen_size: 720p - type: episode - -? "[GROUP]Show_Name_726_[VOSTFR]_[V1]_[8bit]_[720p]_[2F7B3FA2]" -: release_group: GROUP - title: Show Name - episode: 726 - subtitle_language: fr - version: 1 - color_depth: 8-bit - screen_size: 720p - crc32: 2F7B3FA2 - type: episode - -? Show Name 445 VOSTFR par Fansub-Resistance (1280*720) - version MQ -: title: Show Name - episode: 445 - subtitle_language: fr - screen_size: 720p - type: episode - -? Anime Show Episode 159 v2 [VOSTFR][720p][AAC].mp4 -: title: Anime Show - episode: 159 - version: 2 - subtitle_language: fr - screen_size: 720p - audio_codec: AAC - container: mp4 - type: episode - -? "[Group] Anime Super Episode 161 [VOSTFR][720p].mp4" -: release_group: Group - title: Anime Super - episode: 161 - subtitle_language: fr - screen_size: 720p - container: mp4 - type: episode - -? Anime Show Episode 59 v2 [VOSTFR][720p][AAC].mp4 -: title: Anime Show - episode: 59 - version: 2 - subtitle_language: fr - screen_size: 720p - audio_codec: AAC - container: mp4 - type: episode - -? Show.Name.-.476-479.(2007).[HorribleSubs][WEBRip]..[HD.720p] -: title: Show Name - episode: [476, 477, 478, 479] - year: 2007 - release_group: HorribleSubs - source: Web - other: [Rip, HD] - screen_size: 720p - type: episode - -? Show Name - 722 [HD_1280x720].mp4 -: title: Show Name - episode: 722 - other: HD - screen_size: 720p - container: mp4 - type: episode - -? Show!.Name.2.-.10.(2016).[HorribleSubs][WEBRip]..[HD.720p] -: title: Show! Name 2 - episode: 10 - year: 2016 - release_group: HorribleSubs - source: Web - other: [Rip, HD] - screen_size: 720p - type: episode - -? 'C:\folder\[GROUP]_An_Anime_Show_100_-_10_[1080p]_mkv' -: options: -T 'An Anime Show 100' - release_group: GROUP - title: An Anime Show 100 - episode: 10 - screen_size: 1080p - container: mkv - type: episode - -? "[Group].Show.Name!.Super!!.-.05.[720p][AAC].mp4" -: release_group: Group - title: Show Name! Super!! - episode: 5 - screen_size: 720p - audio_codec: AAC - container: mp4 - type: episode - -? "[GROUP].Mobile.Suit.Gundam.Unicorn.RE.0096.-.14.[720p].mkv" -: options: -T 'Mobile Suit Gundam Unicorn RE 0096' - release_group: GROUP - title: Mobile Suit Gundam Unicorn RE 0096 - episode: 14 - screen_size: 720p - container: mkv - type: episode - -? Show.Name.-.Other Name.-.02.(1280x720.HEVC.AAC) -: title: Show Name - alternative_title: Other Name - episode: 2 - screen_size: 720p - video_codec: H.265 - audio_codec: AAC - type: episode - -? "[GroupName].Show.Name.-.02.5.(Special).[BD.1080p]" -: release_group: GroupName - title: Show Name - episode: 2 - episode_details: Special - screen_size: 1080p - source: Blu-ray - type: episode - -? "[Group].Show.Name.2.The.Big.Show.-.11.[1080p]" -: title: Show Name 2 The Big Show - episode: 11 - screen_size: 1080p - type: episode - -? "[SuperGroup].Show.Name.-.Still.Name.-.11.[1080p]" -: release_group: SuperGroup - title: Show Name - alternative_title: Still Name - episode: 11 - screen_size: 1080p - type: episode - -? "[SuperGroup].Show.Name.-.462" -: release_group: SuperGroup - title: Show Name - episode: 462 - type: episode - -? Show.Name.10.720p -: title: Show Name - episode: 10 - screen_size: 720p - type: episode - -? "[Group].Show.Name.G2.-.19.[1080p]" -: release_group: Group - title: Show Name G2 - episode: 19 - screen_size: 1080p - type: episode - -? "[Group].Show.Name.S2.-.19.[1080p]" -? /Show.Name.S2/[Group].Show.Name.S2.-.19.[1080p] -? /Show Name S2/[Group].Show.Name.S2.-.19.[1080p] -: options: -T 'Show Name S2' - release_group: Group - title: Show Name S2 - episode: 19 - screen_size: 1080p - type: episode - -? "[ABC]_Show_Name_001.mkv" -: release_group: ABC - title: Show Name - episode: 1 - container: mkv - type: episode - -? 003-005. Show Name - Ep Name.mkv -: episode: [3, 4, 5] - title: Show Name - episode_title: Ep Name - container: mkv - type: episode - -? 003. Show Name - Ep Name.mkv -: episode: 3 - title: Show Name - episode_title: Ep Name - container: mkv - type: episode - -? 165.Show Name.s08e014 -: absolute_episode: 165 - title: Show Name - season: 8 - episode: 14 - type: episode - -? Show Name - 16x03-05 - 313-315 -? Show.Name.16x03-05.313-315-GROUP -? Show Name 16x03-05 313-315 -? Show Name - 313-315 - s16e03-05 -? Show.Name.313-315.s16e03-05 -? Show Name 313-315 s16e03-05 -: title: Show Name - absolute_episode: [313, 314, 315] - season: 16 - episode: [3, 4, 5] - type: episode - -? Show Name 13-16 -: title: Show Name - episode: [13, 14, 15, 16] - type: episode - -? Show Name 804 vostfr HD -: options: --episode-prefer-number - title: Show Name - episode: 804 - subtitle_language: fr - other: HD - type: episode - -? "[Doki] Re Zero kara Hajimeru Isekai Seikatsu - 01 1920x1080 Hi10P BD FLAC [7F64383D].mkv" -: release_group: Doki - title: Re Zero kara Hajimeru Isekai Seikatsu - episode: 1 - screen_size: 1080p - aspect_ratio: 1.778 - video_profile: High 10 - color_depth: 10-bit - source: Blu-ray - audio_codec: FLAC - crc32: 7F64383D - container: mkv - type: episode - -? Shark Tank (AU) - S02E01 - HDTV-720p.mkv -: title: Shark Tank - country: AU - season: 2 - episode: 1 - source: HDTV - screen_size: 720p - container: mkv - type: episode - -? "[HorribleSubs] Garo - Vanishing Line - 01 [1080p].mkv" -: release_group: HorribleSubs - title: Garo - alternative_title: Vanishing Line - episode: 1 - screen_size: 1080p - container: mkv - type: episode - -? "[HorribleSubs] Yowamushi Pedal - Glory Line - 01 [1080p].mkv" -: release_group: HorribleSubs - title: Yowamushi Pedal - alternative_title: Glory Line - episode: 1 - screen_size: 1080p - container: mkv - type: episode - -? c:\Temp\autosubliminal\completed\2 Broke Girls\Season 01\2 Broke Girls - S01E01 - HDTV-720p Proper - x264 AC3 - IMMERSE - [2011-09-19].mkv -: title: 2 Broke Girls - season: 1 - episode: 1 - source: HDTV - screen_size: 720p - other: Proper - video_codec: H.264 - audio_codec: Dolby Digital - release_group: IMMERSE - date: 2011-09-19 - container: mkv - type: episode - -? c:\Temp\postprocessing\Marvels.Agents.of.S.H.I.E.L.D.s01e02.0.8.4.720p.WEB.DL.mkv -: title: Marvels Agents of S.H.I.E.L.D. - season: 1 - episode: 2 - episode_title: 0.8.4. - screen_size: 720p - source: Web - container: mkv - type: episode - -? Mind.Field.S02E06.The.Power.of.Suggestion.1440p.H264.WEBDL.Subtitles -: title: Mind Field - season: 2 - episode: 6 - episode_title: The Power of Suggestion - screen_size: 1440p - video_codec: H.264 - source: Web - subtitle_language: und - type: episode - -? The Power of Suggestion - Mind Field S2 (Ep 6) (1440p_24fps_H264-384kbit_AAC 6Ch).mp4 -: title: The Power of Suggestion - alternative_title: Mind Field - season: 2 - episode: 6 - screen_size: 1440p - frame_rate: 24fps - video_codec: H.264 - audio_bit_rate: 384Kbps - audio_codec: AAC - audio_channels: '5.1' - container: mp4 - type: episode - -? Mind.Field.S02E06.The.Power.of.Suggestion.1440p.H264.WEBDL.Subtitles/The Power of Suggestion - Mind Field S2 (Ep 6) (1440p_24fps_H264-384kbit_AAC 6Ch).mp4 -: season: 2 - episode: 6 - title: The Power of Suggestion - alternative_title: Mind Field - screen_size: 1440p - frame_rate: 24fps - video_codec: H.264 - source: Web - subtitle_language: und - audio_bit_rate: 384Kbps - audio_codec: AAC - audio_channels: '5.1' - container: mp4 - type: episode - -? Mind.Field.S02E06.The.Power.of.Suggestion.1440p.H264.WEBDL.Subtitles/The Power of Suggestion - Mind Field S2 (Ep 6) (English).srt -: title: Mind Field - season: 2 - episode: 6 - episode_title: The Power of Suggestion - screen_size: 1440p - video_codec: H.264 - source: Web - subtitle_language: en - container: srt - type: episode - -? Mind.Field.S02E06.The.Power.of.Suggestion.1440p.H264.WEBDL.Subtitles/The Power of Suggestion - Mind Field S2 (Ep 6) (Korean).srt -: title: Mind Field - season: 2 - episode: 6 - episode_title: The Power of Suggestion - screen_size: 1440p - video_codec: H.264 - source: Web - subtitle_language: ko - container: srt - type: episode - -? '[HorribleSubs] Overlord II - 01 [1080p] 19.1mbits - 120fps.mkv' -: release_group: HorribleSubs - title: Overlord II - episode: 1 - screen_size: 1080p - video_bit_rate: 19.1Mbps - frame_rate: 120fps - container: mkv - type: episode - -? One Piece - 720 -: title: One Piece - season: 7 - episode: 20 - type: episode - -? foobar.213.avi -: options: -E - title: foobar - episode: 213 - container: avi - type: episode - -? FooBar - 360 368p-Grp -: options: -E - title: FooBar - episode: 360 - screen_size: 368p - release_group: Grp - type: episode - -? wwiis.most.daring.raids.s01e04.storming.mussolinis.island.1080p.web.h.264-edhd-sample.mkv -: title: wwiis most daring raids - season: 1 - episode: 4 - episode_title: storming mussolinis island - screen_size: 1080p - source: Web - video_codec: H.264 - release_group: edhd - other: Sample - container: mkv - type: episode - -? WWIIs.Most.Daring.Raids.S01E04.Storming.Mussolinis.Island.1080p.WEB.h264-EDHD/wwiis.most.daring.raids.s01e04.storming.mussolinis.island.1080p.web.h.264-edhd-sample.mkv -: title: wwiis most daring raids - season: 1 - episode: 4 - episode_title: Storming Mussolinis Island - screen_size: 1080p - source: Web - video_codec: H.264 - release_group: edhd - other: Sample - container: mkv - type: episode - -? dcs.legends.of.tomorrow.s02e01.1080p.bluray.x264-rovers.proof -: title: dcs legends of tomorrow - season: 2 - episode: 1 - screen_size: 1080p - source: Blu-ray - video_codec: H.264 - release_group: rovers - other: Proof - type: episode - -? dcs.legends.of.tomorrow.s02e01.720p.bluray.x264-demand.sample.mkv -: title: dcs legends of tomorrow - season: 2 - episode: 1 - screen_size: 720p - source: Blu-ray - video_codec: H.264 - release_group: demand - other: Sample - container: mkv - type: episode - -? Season 06/e01.1080p.bluray.x264-wavey-obfuscated.mkv -: season: 6 - episode: 1 - screen_size: 1080p - source: Blu-ray - video_codec: H.264 - title: wavey - other: Obfuscated - container: mkv - type: episode - -? Hells.Kitchen.US.S17E08.1080p.HEVC.x265-MeGusta-Obfuscated/c48db7d2aeb040e8a920a9fd6effcbf4.mkv -: title: Hells Kitchen - country: US - season: 17 - episode: 8 - screen_size: 1080p - video_codec: H.265 - release_group: MeGusta - other: Obfuscated - uuid: c48db7d2aeb040e8a920a9fd6effcbf4 - container: mkv - type: episode - -? Blue.Bloods.S08E09.1080p.HEVC.x265-MeGusta-Obfuscated/afaae96ae7a140e0981ced2a79221751.mkv -: title: Blue Bloods - season: 8 - episode: 9 - screen_size: 1080p - video_codec: H.265 - release_group: MeGusta - other: Obfuscated - container: mkv - type: episode - -? MacGyver.2016.S02E09.CD-ROM.and.Hoagie.Foil.1080p.AMZN.WEBRip.DDP5.1.x264-NTb-Scrambled/c329b27187d44a94b4a25b21502db552.mkv -: title: MacGyver - year: 2016 - season: 2 - episode: 9 - screen_size: 1080p - streaming_service: Amazon Prime - source: Web - other: [Rip, Obfuscated] - audio_codec: Dolby Digital Plus - audio_channels: '5.1' - video_codec: H.264 - release_group: NTb - uuid: c329b27187d44a94b4a25b21502db552 - container: mkv - type: episode - -? The.Late.Late.Show.with.James.Corden.2017.11.27.Armie.Hammer.Juno.Temple.Charlie.Puth.1080p.AMZN.WEB-DL.DDP2.0.H.264-monkee-Scrambled/42e7e8a48eb7454aaebebcf49705ce41.mkv -: title: The Late Late Show with James Corden - date: 2017-11-27 - episode_title: Armie Hammer Juno Temple Charlie Puth - screen_size: 1080p - streaming_service: Amazon Prime - source: Web - audio_codec: Dolby Digital Plus - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - other: Obfuscated - uuid: 42e7e8a48eb7454aaebebcf49705ce41 - container: mkv - type: episode - -? Educating Greater Manchester S01E07 720p HDTV x264-PLUTONiUM-AsRequested -: title: Educating Greater Manchester - season: 1 - episode: 7 - screen_size: 720p - source: HDTV - video_codec: H.264 - release_group: PLUTONiUM - other: Repost - type: episode - -? Im A Celebrity Get Me Out Of Here S17E14 HDTV x264-PLUTONiUM-xpost -: title: Im A Celebrity Get Me Out Of Here - season: 17 - episode: 14 - source: HDTV - video_codec: H.264 - release_group: PLUTONiUM - other: Repost - type: episode - -? Tales S01E08 All I Need Method Man Featuring Mary J Blige 720p BET WEBRip AAC2 0 x264-RTN-xpost -: title: Tales - season: 1 - episode: 8 - episode_title: All I Need Method Man Featuring Mary J Blige - screen_size: 720p - source: Web - other: [Rip, Repost] - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: RTN - type: episode - -? This is Us S01E11 Herzensangelegenheiten German DL WS DVDRip x264-CDP-xpost -: options: --exclude country - title: This is Us - season: 1 - episode: 11 - episode_title: Herzensangelegenheiten - language: - - de - - mul - other: - - Widescreen - - Rip - - Repost - source: DVD - video_codec: H.264 - release_group: CDP - type: episode - -? The Girlfriend Experience S02E10 1080p WEB H264-STRiFE-postbot -: title: The Girlfriend Experience - season: 2 - episode: 10 - screen_size: 1080p - source: Web - video_codec: H.264 - release_group: STRiFE - other: Repost - type: episode - -? The.Girlfriend.Experience.S02E10.1080p.WEB.H264-STRiFE-postbot/90550c1adaf44c47b60d24f59603bb98.mkv -: title: The Girlfriend Experience - season: 2 - episode: 10 - screen_size: 1080p - source: Web - video_codec: H.264 - release_group: STRiFE - other: Repost - uuid: 90550c1adaf44c47b60d24f59603bb98 - container: mkv - type: episode - -? 24.S01E02.1080p.BluRay.REMUX.AVC.DD.2.0-EPSiLON-xpost/eb518eaf33f641a1a8c6e0973a67aec2.mkv -: title: '24' - season: 1 - episode: 2 - screen_size: 1080p - source: Blu-ray - other: [Remux, Repost] - video_codec: H.264 - audio_codec: Dolby Digital - audio_channels: '2.0' - release_group: EPSiLON - uuid: eb518eaf33f641a1a8c6e0973a67aec2 - container: mkv - type: episode - -? Educating.Greater.Manchester.S01E02.720p.HDTV.x264-PLUTONiUM-AsRequested/47fbcb2393aa4b5cbbb340d3173ca1a9.mkv -: title: Educating Greater Manchester - season: 1 - episode: 2 - screen_size: 720p - source: HDTV - video_codec: H.264 - release_group: PLUTONiUM - other: Repost - uuid: 47fbcb2393aa4b5cbbb340d3173ca1a9 - container: mkv - type: episode - -? Stranger.Things.S02E05.Chapter.Five.Dig.Dug.720p.NF.WEBRip.DD5.1.x264-PSYPHER-AsRequested-Obfuscated -: title: Stranger Things - season: 2 - episode: 5 - episode_title: Chapter Five Dig Dug - screen_size: 720p - streaming_service: Netflix - source: Web - other: [Rip, Repost, Obfuscated] - audio_codec: Dolby Digital - audio_channels: '5.1' - video_codec: H.264 - release_group: PSYPHER - type: episode - -? Show.Name.-.Season.1.3.4-.Mp4.1080p -: title: Show Name - season: [1, 3, 4] - container: mp4 - screen_size: 1080p + other: FullHD type: episode diff --git a/libs/guessit/test/movies.yml b/libs/guessit/test/movies.yml index 33d5d189b..610c3836c 100644 --- a/libs/guessit/test/movies.yml +++ b/libs/guessit/test/movies.yml @@ -5,17 +5,16 @@ : title: Fear and Loathing in Las Vegas year: 1998 screen_size: 720p - source: HD-DVD + format: HD-DVD audio_codec: DTS - video_codec: H.264 + video_codec: h264 container: mkv release_group: ESiR ? Movies/El Dia de la Bestia (1995)/El.dia.de.la.bestia.DVDrip.Spanish.DivX.by.Artik[SEDG].avi : title: El Dia de la Bestia year: 1995 - source: DVD - other: Rip + format: DVD language: spanish video_codec: DivX release_group: Artik[SEDG] @@ -24,40 +23,37 @@ ? Movies/Dark City (1998)/Dark.City.(1998).DC.BDRip.720p.DTS.X264-CHD.mkv : title: Dark City year: 1998 - source: Blu-ray - other: Rip + format: BluRay screen_size: 720p audio_codec: DTS - video_codec: H.264 + video_codec: h264 release_group: CHD ? Movies/Sin City (BluRay) (2005)/Sin.City.2005.BDRip.720p.x264.AC3-SEPTiC.mkv : title: Sin City year: 2005 - source: Blu-ray - other: Rip + format: BluRay screen_size: 720p - video_codec: H.264 - audio_codec: Dolby Digital + video_codec: h264 + audio_codec: AC3 release_group: SEPTiC ? Movies/Borat (2006)/Borat.(2006).R5.PROPER.REPACK.DVDRip.XviD-PUKKA.avi : title: Borat year: 2006 proper_count: 2 - source: DVD - other: [ Region 5, Proper, Rip ] - video_codec: Xvid + format: DVD + other: [ R5, Proper ] + video_codec: XviD release_group: PUKKA ? "[XCT].Le.Prestige.(The.Prestige).DVDRip.[x264.HP.He-Aac.{Fr-Eng}.St{Fr-Eng}.Chaps].mkv" : title: Le Prestige - source: DVD - other: Rip - video_codec: H.264 - video_profile: High + format: DVD + video_codec: h264 + video_profile: HP audio_codec: AAC - audio_profile: High Efficiency + audio_profile: HE language: [ french, english ] subtitle_language: [ french, english ] release_group: Chaps @@ -65,24 +61,23 @@ ? Battle Royale (2000)/Battle.Royale.(Batoru.Rowaiaru).(2000).(Special.Edition).CD1of2.DVDRiP.XviD-[ZeaL].avi : title: Battle Royale year: 2000 - edition: Special + edition: Special Edition cd: 1 cd_count: 2 - source: DVD - other: Rip - video_codec: Xvid + format: DVD + video_codec: XviD release_group: ZeaL ? Movies/Brazil (1985)/Brazil_Criterion_Edition_(1985).CD2.avi : title: Brazil - edition: Criterion + edition: Criterion Edition year: 1985 cd: 2 ? Movies/Persepolis (2007)/[XCT] Persepolis [H264+Aac-128(Fr-Eng)+ST(Fr-Eng)+Ind].mkv : title: Persepolis year: 2007 - video_codec: H.264 + video_codec: h264 audio_codec: AAC language: [ French, English ] subtitle_language: [ French, English ] @@ -91,18 +86,17 @@ ? Movies/Toy Story (1995)/Toy Story [HDTV 720p English-Spanish].mkv : title: Toy Story year: 1995 - source: HDTV + format: HDTV screen_size: 720p language: [ english, spanish ] ? Movies/Office Space (1999)/Office.Space.[Dual-DVDRip].[Spanish-English].[XviD-AC3-AC3].[by.Oswald].avi : title: Office Space year: 1999 - other: [Dual Audio, Rip] - source: DVD + format: DVD language: [ english, spanish ] - video_codec: Xvid - audio_codec: Dolby Digital + video_codec: XviD + audio_codec: AC3 ? Movies/Wild Zero (2000)/Wild.Zero.DVDivX-EPiC.avi : title: Wild Zero @@ -112,33 +106,30 @@ ? movies/Baraka_Edition_Collector.avi : title: Baraka - edition: Collector + edition: Collector Edition ? Movies/Blade Runner (1982)/Blade.Runner.(1982).(Director's.Cut).CD1.DVDRip.XviD.AC3-WAF.avi : title: Blade Runner year: 1982 edition: Director's Cut cd: 1 - source: DVD - other: Rip - video_codec: Xvid - audio_codec: Dolby Digital + format: DVD + video_codec: XviD + audio_codec: AC3 release_group: WAF ? movies/American.The.Bill.Hicks.Story.2009.DVDRip.XviD-EPiSODE.[UsaBit.com]/UsaBit.com_esd-americanbh.avi : title: American The Bill Hicks Story year: 2009 - source: DVD - other: Rip - video_codec: Xvid + format: DVD + video_codec: XviD release_group: EPiSODE website: UsaBit.com ? movies/Charlie.And.Boots.DVDRip.XviD-TheWretched/wthd-cab.avi : title: Charlie And Boots - source: DVD - other: Rip - video_codec: Xvid + format: DVD + video_codec: XviD release_group: TheWretched ? movies/Steig Larsson Millenium Trilogy (2009) BRrip 720 AAC x264/(1)The Girl With The Dragon Tattoo (2009) BRrip 720 AAC x264.mkv @@ -146,19 +137,18 @@ #film_title: Steig Larsson Millenium Trilogy #film: 1 year: 2009 - source: Blu-ray - other: [Reencoded, Rip] + format: BluRay audio_codec: AAC - video_codec: H.264 + video_codec: h264 screen_size: 720p ? movies/Greenberg.REPACK.LiMiTED.DVDRip.XviD-ARROW/arw-repack-greenberg.dvdrip.xvid.avi : title: Greenberg - source: DVD - video_codec: Xvid + format: DVD + video_codec: XviD release_group: ARROW - other: [Proper, Rip] - edition: Limited + other: Proper + edition: Limited Edition proper_count: 1 ? Movies/Fr - Paris 2054, Renaissance (2005) - De Christian Volckman - (Film Divx Science Fiction Fantastique Thriller Policier N&B).avi @@ -171,16 +161,14 @@ : title: Avida year: 2006 language: french - source: DVD - other: Rip - video_codec: Xvid + format: DVD + video_codec: XviD release_group: PROD ? Movies/Alice in Wonderland DVDRip.XviD-DiAMOND/dmd-aw.avi : title: Alice in Wonderland - source: DVD - other: Rip - video_codec: Xvid + format: DVD + video_codec: XviD release_group: DiAMOND ? Movies/Ne.Le.Dis.A.Personne.Fr 2 cd/personnea_mp.avi @@ -192,54 +180,49 @@ : title: Bunker Palace Hôtel year: 1989 language: french - source: VHS - other: Rip + format: VHS ? Movies/21 (2008)/21.(2008).DVDRip.x264.AC3-FtS.[sharethefiles.com].mkv : title: "21" year: 2008 - source: DVD - other: Rip - video_codec: H.264 - audio_codec: Dolby Digital + format: DVD + video_codec: h264 + audio_codec: AC3 release_group: FtS website: sharethefiles.com ? Movies/9 (2009)/9.2009.Blu-ray.DTS.720p.x264.HDBRiSe.[sharethefiles.com].mkv : title: "9" year: 2009 - source: Blu-ray + format: BluRay audio_codec: DTS screen_size: 720p - video_codec: H.264 + video_codec: h264 release_group: HDBRiSe website: sharethefiles.com ? Movies/Mamma.Mia.2008.DVDRip.AC3.XviD-CrazyTeam/Mamma.Mia.2008.DVDRip.AC3.XviD-CrazyTeam.avi : title: Mamma Mia year: 2008 - source: DVD - other: Rip - audio_codec: Dolby Digital - video_codec: Xvid + format: DVD + audio_codec: AC3 + video_codec: XviD release_group: CrazyTeam ? Movies/M.A.S.H. (1970)/MASH.(1970).[Divx.5.02][Dual-Subtitulos][DVDRip].ogm : title: MASH year: 1970 video_codec: DivX - source: DVD - other: [Dual Audio, Rip] + format: DVD ? Movies/The Doors (1991)/09.03.08.The.Doors.(1991).BDRip.720p.AC3.X264-HiS@SiLUHD-English.[sharethefiles.com].mkv : title: The Doors year: 1991 date: 2008-03-09 - source: Blu-ray - other: Rip + format: BluRay screen_size: 720p - audio_codec: Dolby Digital - video_codec: H.264 + audio_codec: AC3 + video_codec: h264 release_group: HiS@SiLUHD language: english website: sharethefiles.com @@ -249,18 +232,17 @@ title: The Doors year: 1991 date: 2008-03-09 - source: Blu-ray - other: Rip + format: BluRay screen_size: 720p - audio_codec: Dolby Digital - video_codec: H.264 + audio_codec: AC3 + video_codec: h264 release_group: HiS@SiLUHD language: english website: sharethefiles.com ? Movies/Ratatouille/video_ts-ratatouille.srt : title: Ratatouille - source: DVD + format: DVD # Removing this one because 001 is guessed as an episode number. # ? Movies/001 __ A classer/Fantomas se déchaine - Louis de Funès.avi @@ -270,20 +252,18 @@ : title: Comme une Image year: 2004 language: french - source: DVD - other: Rip - video_codec: Xvid + format: DVD + video_codec: XviD release_group: NTK website: www.divx-overnet.com ? Movies/Fantastic Mr Fox/Fantastic.Mr.Fox.2009.DVDRip.{x264+LC-AAC.5.1}{Fr-Eng}{Sub.Fr-Eng}-™.[sharethefiles.com].mkv : title: Fantastic Mr Fox year: 2009 - source: DVD - other: Rip - video_codec: H.264 + format: DVD + video_codec: h264 audio_codec: AAC - audio_profile: Low Complexity + audio_profile: LC audio_channels: "5.1" language: [ french, english ] subtitle_language: [ french, english ] @@ -292,9 +272,8 @@ ? Movies/Somewhere.2010.DVDRip.XviD-iLG/i-smwhr.avi : title: Somewhere year: 2010 - source: DVD - other: Rip - video_codec: Xvid + format: DVD + video_codec: XviD release_group: iLG ? Movies/Moon_(2009).mkv @@ -360,21 +339,21 @@ ? /public/uTorrent/Downloads Finished/Movies/Indiana.Jones.and.the.Temple.of.Doom.1984.HDTV.720p.x264.AC3.5.1-REDµX/Indiana.Jones.and.the.Temple.of.Doom.1984.HDTV.720p.x264.AC3.5.1-REDµX.mkv : title: Indiana Jones and the Temple of Doom year: 1984 - source: HDTV + format: HDTV screen_size: 720p - video_codec: H.264 - audio_codec: Dolby Digital + video_codec: h264 + audio_codec: AC3 audio_channels: "5.1" release_group: REDµX ? The.Director’s.Notebook.2006.Blu-Ray.x264.DXVA.720p.AC3-de[42].mkv : title: The Director’s Notebook year: 2006 - source: Blu-ray - video_codec: H.264 + format: BluRay + video_codec: h264 video_api: DXVA screen_size: 720p - audio_codec: Dolby Digital + audio_codec: AC3 release_group: de[42] @@ -382,18 +361,17 @@ : title: Cosmopolis year: 2012 screen_size: 720p - video_codec: H.264 + video_codec: h264 release_group: AN0NYM0US[bb] - source: Blu-ray - edition: Limited + format: BluRay + edition: Limited Edition ? movies/La Science des Rêves (2006)/La.Science.Des.Reves.FRENCH.DVDRip.XviD-MP-AceBot.avi : title: La Science des Rêves year: 2006 - source: DVD - other: Rip - video_codec: Xvid - video_profile: Main + format: DVD + video_codec: XviD + video_profile: MP release_group: AceBot language: French @@ -404,8 +382,8 @@ : title: The Rum Diary year: 2011 screen_size: 1080p - source: Blu-ray - video_codec: H.264 + format: BluRay + video_codec: h264 audio_codec: DTS release_group: D-Z0N3 @@ -413,8 +391,8 @@ : title: Life Of Pi year: 2012 screen_size: 1080p - source: Blu-ray - video_codec: H.264 + format: BluRay + video_codec: h264 audio_codec: DTS release_group: D-Z0N3 @@ -422,28 +400,28 @@ : title: The Kings Speech year: 2010 screen_size: 1080p - source: Blu-ray + format: BluRay audio_codec: DTS - video_codec: H.264 + video_codec: h264 release_group: D Z0N3 ? Street.Kings.2008.BluRay.1080p.DTS.x264.dxva EuReKA.mkv : title: Street Kings year: 2008 - source: Blu-ray + format: BluRay screen_size: 1080p audio_codec: DTS - video_codec: H.264 + video_codec: h264 video_api: DXVA release_group: EuReKA ? 2001.A.Space.Odyssey.1968.HDDVD.1080p.DTS.x264.dxva EuReKA.mkv : title: 2001 A Space Odyssey year: 1968 - source: HD-DVD + format: HD-DVD screen_size: 1080p audio_codec: DTS - video_codec: H.264 + video_codec: h264 video_api: DXVA release_group: EuReKA @@ -451,25 +429,24 @@ : title: "2012" year: 2009 screen_size: 720p - source: Blu-ray - video_codec: H.264 + format: BluRay + video_codec: h264 audio_codec: DTS release_group: WiKi ? /share/Download/movie/Dead Man Down (2013) BRRiP XViD DD5_1 Custom NLSubs =-_lt Q_o_Q gt-=_/XD607ebb-BRc59935-5155473f-1c5f49/XD607ebb-BRc59935-5155473f-1c5f49.avi : title: Dead Man Down year: 2013 - source: Blu-ray - other: [Reencoded, Rip] - video_codec: Xvid + format: BluRay + video_codec: XviD audio_channels: "5.1" - audio_codec: Dolby Digital + audio_codec: AC3 uuid: XD607ebb-BRc59935-5155473f-1c5f49 ? Pacific.Rim.3D.2013.COMPLETE.BLURAY-PCH.avi : title: Pacific Rim year: 2013 - source: Blu-ray + format: BluRay other: - Complete - 3D @@ -481,33 +458,33 @@ language: - French - English - source: DVD + format: DVD other: [Straight to Video, Read NFO, NTSC] ? Immersion.French.2011.STV.READNFO.QC.FRENCH.NTSC.DVDR.nfo : title: Immersion French year: 2011 language: French - source: DVD + format: DVD other: [Straight to Video, Read NFO, NTSC] ? Immersion.French.2011.STV.READNFO.QC.NTSC.DVDR.nfo : title: Immersion language: French year: 2011 - source: DVD + format: DVD other: [Straight to Video, Read NFO, NTSC] ? French.Immersion.2011.STV.READNFO.QC.ENGLISH.NTSC.DVDR.nfo : title: French Immersion year: 2011 language: ENGLISH - source: DVD + format: DVD other: [Straight to Video, Read NFO, NTSC] ? Howl's_Moving_Castle_(2004)_[720p,HDTV,x264,DTS]-FlexGet.avi -: video_codec: H.264 - source: HDTV +: video_codec: h264 + format: HDTV title: Howl's Moving Castle screen_size: 720p year: 2004 @@ -518,42 +495,43 @@ : screen_size: 1080p year: 2008 language: French - video_codec: H.264 + video_codec: h264 title: Pirates de langkasuka release_group: AsiaRa ? Masala (2013) Telugu Movie HD DVDScr XviD - Exclusive.avi : year: 2013 - video_codec: Xvid + video_codec: XviD title: Masala - source: HD-DVD + format: HD-DVD other: Screener + language: Telugu release_group: Exclusive ? Django Unchained 2012 DVDSCR X264 AAC-P2P.nfo : year: 2012 other: Screener - video_codec: H.264 + video_codec: h264 title: Django Unchained audio_codec: AAC - source: DVD + format: DVD release_group: P2P ? Ejecutiva.En.Apuros(2009).BLURAY.SCR.Xvid.Spanish.LanzamientosD.nfo : year: 2009 other: Screener - source: Blu-ray - video_codec: Xvid + format: BluRay + video_codec: XviD language: Spanish title: Ejecutiva En Apuros ? Die.Schluempfe.2.German.DL.1080p.BluRay.x264-EXQUiSiTE.mkv : title: Die Schluempfe 2 - source: Blu-ray + format: BluRay language: - Multiple languages - German - video_codec: H.264 + video_codec: h264 release_group: EXQUiSiTE screen_size: 1080p @@ -561,99 +539,96 @@ : title: Rocky year: 1976 subtitle_language: French - source: Blu-ray - other: [Reencoded, Rip] - video_codec: H.264 - audio_codec: Dolby Digital + format: BluRay + video_codec: h264 + audio_codec: AC3 release_group: FUNKY ? REDLINE (BD 1080p H264 10bit FLAC) [3xR].mkv : title: REDLINE - source: Blu-ray - video_codec: H.264 - color_depth: 10-bit + format: BluRay + video_codec: h264 + video_profile: 10bit audio_codec: FLAC screen_size: 1080p ? The.Lizzie.McGuire.Movie.(2003).HR.DVDRiP.avi : title: The Lizzie McGuire Movie year: 2003 - source: DVD - other: [High Resolution, Rip] + format: DVD + other: HR ? Hua.Mulan.BRRIP.MP4.x264.720p-HR.avi : title: Hua Mulan - video_codec: H.264 - source: Blu-ray + video_codec: h264 + format: BluRay screen_size: 720p - other: [Reencoded, Rip] - release_group: HR + other: HR ? Dr.Seuss.The.Lorax.2012.DVDRip.LiNE.XviD.AC3.HQ.Hive-CM8.mp4 -: video_codec: Xvid +: video_codec: XviD title: Dr Seuss The Lorax - source: DVD - other: [Rip, Line Audio] + format: DVD + other: LiNE year: 2012 - audio_codec: Dolby Digital - audio_profile: High Quality + audio_codec: AC3 + audio_profile: HQ release_group: Hive-CM8 ? "Star Wars: Episode IV - A New Hope (2004) Special Edition.MKV" : title: "Star Wars: Episode IV" alternative_title: A New Hope year: 2004 - edition: Special + edition: Special Edition ? Dr.LiNE.The.Lorax.2012.DVDRip.LiNE.XviD.AC3.HQ.Hive-CM8.mp4 -: video_codec: Xvid +: video_codec: XviD title: Dr LiNE The Lorax - source: DVD - other: [Rip, Line Audio] + format: DVD + other: LiNE year: 2012 - audio_codec: Dolby Digital - audio_profile: High Quality + audio_codec: AC3 + audio_profile: HQ release_group: Hive-CM8 ? Dr.LiNE.The.Lorax.2012.DVDRip.XviD.AC3.HQ.Hive-CM8.mp4 -: video_codec: Xvid +: video_codec: XviD title: Dr LiNE The Lorax - source: DVD - other: Rip + format: DVD year: 2012 - audio_codec: Dolby Digital - audio_profile: High Quality + audio_codec: AC3 + audio_profile: HQ release_group: Hive-CM8 ? Perfect [email protected] : release_group: h@mster title: Perfect Child - video_codec: Xvid + video_codec: XviD language: French - source: TV - other: Rip + format: TV year: 2007 ? entre.ciel.et.terre.(1994).dvdrip.h264.aac-psypeon.avi : audio_codec: AAC - source: DVD - other: Rip + format: DVD release_group: psypeon title: entre ciel et terre - video_codec: H.264 + video_codec: h264 year: 1994 ? Yves.Saint.Laurent.2013.FRENCH.DVDSCR.MD.XviD-ViVARiUM.avi -: source: DVD +: format: DVD language: French - other: [Screener, Mic Dubbed] + other: + - MD + - Screener release_group: ViVARiUM title: Yves Saint Laurent - video_codec: Xvid + video_codec: XviD year: 2013 ? Echec et Mort - Hard to Kill - Steven Seagal Multi 1080p BluRay x264 CCATS.avi -: source: Blu-ray +: format: BluRay language: Multiple languages release_group: CCATS screen_size: 1080p @@ -661,7 +636,7 @@ alternative_title: - Hard to Kill - Steven Seagal - video_codec: H.264 + video_codec: h264 ? Paparazzi - Timsit/Lindon (MKV 1080p tvripHD) : options: -n @@ -671,36 +646,35 @@ - Lindon screen_size: 1080p container: mkv - source: HDTV - other: Rip + format: HDTV ? some.movie.720p.bluray.x264-mind : title: some movie screen_size: 720p - video_codec: H.264 + video_codec: h264 release_group: mind - source: Blu-ray + format: BluRay ? Dr LiNE The Lorax 720p h264 BluRay : title: Dr LiNE The Lorax screen_size: 720p - video_codec: H.264 - source: Blu-ray + video_codec: h264 + format: BluRay #TODO: Camelcase implementation #? BeatdownFrenchDVDRip.mkv #: options: -c # title: Beatdown # language: French -# source: DVD +# format: DVD #? YvesSaintLaurent2013FrenchDVDScrXvid.avi #: options: -c -# source: DVD +# format: DVD # language: French # other: Screener # title: Yves saint laurent -# video_codec: Xvid +# video_codec: XviD # year: 2013 @@ -709,7 +683,7 @@ title: Elle s en va ? FooBar.7.PDTV-FlexGet -: source: Digital TV +: format: DVB release_group: FlexGet title: FooBar 7 @@ -719,7 +693,7 @@ language: fr screen_size: 1080p title: Riddick - video_codec: H.265 + video_codec: h265 ? "[h265 - HEVC] Riddick Unrated Director Cut French [1080p DTS].mkv" : audio_codec: DTS @@ -727,36 +701,38 @@ language: fr screen_size: 1080p title: Riddick - video_codec: H.265 + video_codec: h265 ? Barbecue-2014-French-mHD-1080p : language: fr - other: Micro HD + other: mHD screen_size: 1080p title: Barbecue year: 2014 ? Underworld Quadrilogie VO+VFF+VFQ 1080p HDlight.x264~Tonyk~Monde Infernal : language: fr - other: [Original Video, Micro HD] + other: + - HDLight + - OV screen_size: 1080p title: Underworld Quadrilogie - video_codec: H.264 + video_codec: h264 ? A Bout Portant (The Killers).PAL.Multi.DVD-R-KZ -: source: DVD +: format: DVD language: mul release_group: KZ title: A Bout Portant ? "Mise à Sac (Alain Cavalier, 1967) [Vhs.Rip.Vff]" -: source: VHS +: format: VHS language: fr title: "Mise à Sac" year: 1967 ? A Bout Portant (The Killers).PAL.Multi.DVD-R-KZ -: source: DVD +: format: DVD other: PAL language: mul release_group: KZ @@ -771,8 +747,7 @@ year: 2009 ? La Defense Lincoln (The Lincoln Lawyer) 2011 [DVDRIP][Vostfr] -: source: DVD - other: Rip +: format: DVD subtitle_language: fr title: La Defense Lincoln year: 2011 @@ -782,7 +757,7 @@ language: fr screen_size: 1080p title: Fight Club - video_codec: H.265 + video_codec: h265 ? Love Gourou (Mike Myers) - FR : language: fr @@ -790,11 +765,11 @@ ? '[h265 - hevc] transformers 2 1080p french ac3 6ch.' : audio_channels: '5.1' - audio_codec: Dolby Digital + audio_codec: AC3 language: fr screen_size: 1080p title: transformers 2 - video_codec: H.265 + video_codec: h265 ? 1.Angry.Man.1957.mkv : title: 1 Angry Man @@ -813,29 +788,30 @@ title: Looney Tunes ? Das.Appartement.German.AC3D.DL.720p.BluRay.x264-TVP -: audio_codec: Dolby Digital - source: Blu-ray +: audio_codec: AC3 + format: BluRay language: mul release_group: TVP screen_size: 720p title: Das Appartement German type: movie - video_codec: H.264 + video_codec: h264 ? Das.Appartement.GERMAN.AC3D.DL.720p.BluRay.x264-TVP -: audio_codec: Dolby Digital - source: Blu-ray +: audio_codec: AC3 + format: BluRay language: - de - mul release_group: TVP screen_size: 720p title: Das Appartement - video_codec: H.264 + video_codec: h264 ? Hyena.Road.2015.German.1080p.DL.DTSHD.Bluray.x264-pmHD -: audio_codec: DTS-HD - source: Blu-ray +: audio_codec: DTS + audio_profile: HD + format: BluRay language: - de - mul @@ -843,12 +819,13 @@ screen_size: 1080p title: Hyena Road type: movie - video_codec: H.264 + video_codec: h264 year: 2015 ? Hyena.Road.2015.German.1080p.DL.DTSHD.Bluray.x264-pmHD -: audio_codec: DTS-HD - source: Blu-ray +: audio_codec: DTS + audio_profile: HD + format: BluRay language: - de - mul @@ -856,34 +833,16 @@ screen_size: 1080p title: Hyena Road type: movie - video_codec: H.264 + video_codec: h264 year: 2015 ? Name.BDMux.720p -: title: Name - source: Blu-ray - other: Mux - screen_size: 720p - type: movie - -? Name.BRMux.720p -: title: Name - source: Blu-ray - other: [Reencoded, Mux] - screen_size: 720p - type: movie - ? Name.BDRipMux.720p -: title: Name - source: Blu-ray - other: [Rip, Mux] - screen_size: 720p - type: movie - +? Name.BRMux.720p ? Name.BRRipMux.720p : title: Name - source: Blu-ray - other: [Reencoded, Rip, Mux] + format: BluRay + other: Mux screen_size: 720p type: movie @@ -901,11 +860,13 @@ : title: Hacksaw Ridge year: 2016 language: mul - screen_size: 2160p - source: Ultra HD Blu-ray - video_codec: H.265 - color_depth: 10-bit - audio_codec: [DTS-HD, Dolby Atmos] + screen_size: 4K + other: UltraHD + format: BluRay + video_codec: h265 + video_profile: 10bit + audio_codec: [DTS, DolbyAtmos] + audio_profile: HD audio_channels: '7.1' release_group: DDR container: mkv @@ -915,9 +876,9 @@ : title: Special Correspondents year: 2016 language: [it, en] - screen_size: 2160p + screen_size: 4K streaming_service: Netflix - other: Ultra HD + other: UltraHD release_group: TeamPremium container: mp4 type: movie @@ -931,12 +892,13 @@ ? Suicide Squad EXTENDED (2016) 2160p 4K UltraHD Blu-Ray x265 (HEVC 10bit BT709) Dolby Atmos 7.1 -DDR : title: Suicide Squad edition: Extended + other: UltraHD year: 2016 - screen_size: 2160p - source: Ultra HD Blu-ray - video_codec: H.265 - color_depth: 10-bit - audio_codec: Dolby Atmos + screen_size: 4K + format: BluRay + video_codec: h265 + video_profile: 10bit + audio_codec: DolbyAtmos audio_channels: '7.1' release_group: DDR type: movie @@ -954,25 +916,25 @@ year: 1949 edition: Alternative Cut screen_size: 1080p - source: Blu-ray - video_codec: H.264 + format: BluRay + video_codec: h264 release_group: SADPANDA[rarbg] ? The.Movie.CONVERT.720p.HDTV.x264-C4TV : title: The Movie other: Converted screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: C4TV type: movie ? Its.A.Wonderful.Life.1946.Colorized.720p.BRRip.999MB.MkvCage.com : title: Its A Wonderful Life year: 1946 - other: [Colorized, Reencoded, Rip] + other: Colorized screen_size: 720p - source: Blu-ray + format: BluRay size: 999MB website: MkvCage.com type: movie @@ -989,19 +951,19 @@ year: 2000 edition: Director's Cut screen_size: 1080p - source: Blu-ray - video_codec: H.264 + format: BluRay + video_codec: h264 release_group: anoXmous type: movie ? Before.the.Flood.2016.DOCU.1080p.WEBRip.x264.DD5.1-FGT : title: Before the Flood year: 2016 - other: [Documentary, Rip] + other: Documentary screen_size: 1080p - source: Web - video_codec: H.264 - audio_codec: Dolby Digital + format: WEBRip + video_codec: h264 + audio_codec: AC3 audio_channels: '5.1' release_group: FGT type: movie @@ -1009,7 +971,7 @@ ? Zootopia.2016.HDRip.1.46Gb.Dub.MegaPeer : title: Zootopia year: 2016 - other: [HD, Rip] + format: HDTV size: 1.46GB language: und release_group: MegaPeer @@ -1019,27 +981,26 @@ : title: Suntan year: 2016 edition: Festival - source: DVD - other: Rip - video_codec: H.264 + format: DVD + video_codec: h264 release_group: IcHoR type: movie ? Hardwired.STV.NFOFiX.FRENCH.DVDRiP.XviD-SURViVAL : title: Hardwired - other: [Straight to Video, Proper, Rip] + other: [Straight to Video, Proper] language: french - source: DVD - video_codec: Xvid + format: DVD + video_codec: XviD release_group: SURViVAL proper_count: 1 type: movie ? Maze.Runner.The.Scorch.Trials.OM.2015.WEB-DLRip.by.Seven : title: Maze Runner The Scorch Trials - other: [Open Matte, Rip] + other: Open Matte year: 2015 - source: Web + format: WEBRip release_group: Seven type: movie @@ -1047,13 +1008,13 @@ : title: Kampen Om Tungtvannet aka The Heavy Water War other: Complete screen_size: 720p - video_codec: H.265 + video_codec: h265 release_group: Lund type: movie ? All.Fall.Down.x264.PROOFFIX-OUTLAWS : title: All Fall Down - video_codec: H.264 + video_codec: h264 other: Proper release_group: OUTLAWS proper_count: 1 @@ -1062,26 +1023,25 @@ ? The.Last.Survivors.2014.PROOF.SAMPLE.FiX.BDRip.x264-TOPCAT : title: The Last Survivors year: 2014 - other: [Proper, Rip] - source: Blu-ray - video_codec: H.264 + other: Proper + format: BluRay + video_codec: h264 release_group: TOPCAT type: movie ? Bad Santa 2 2016 THEATRiCAL FRENCH BDRip XviD-EXTREME : title: Bad Santa 2 year: 2016 - edition: Theatrical + edition: Theatrical Edition language: french - source: Blu-ray - other: Rip - video_codec: Xvid + format: BluRay + video_codec: XviD release_group: EXTREME type: movie ? The Lord of the Rings The Fellowship of the Ring THEATRICAL EDITION (2001) [1080p] : title: The Lord of the Rings The Fellowship of the Ring - edition: Theatrical + edition: Theatrical Edition year: 2001 screen_size: 1080p type: movie @@ -1089,20 +1049,19 @@ ? World War Z (2013) Theatrical Cut 720p BluRay x264 : title: World War Z year: 2013 - edition: Theatrical + edition: Theatrical Edition screen_size: 720p - source: Blu-ray - video_codec: H.264 + format: BluRay + video_codec: h264 type: movie ? The Heartbreak Kid (1993) UNCUT 720p WEBRip x264 : title: The Heartbreak Kid year: 1993 edition: Uncut - other: Rip screen_size: 720p - source: Web - video_codec: H.264 + format: WEBRip + video_codec: h264 type: movie ? Mrs.Doubtfire.1993.720p.OAR.Bluray.DTS.x264-CtrlHD @@ -1110,25 +1069,24 @@ year: 1993 screen_size: 720p other: Original Aspect Ratio - source: Blu-ray + format: BluRay audio_codec: DTS - video_codec: H.264 + video_codec: h264 release_group: CtrlHD type: movie ? Aliens.SE.1986.BDRip.1080p : title: Aliens - edition: Special + edition: Special Edition year: 1986 - source: Blu-ray - other: Rip + format: BluRay screen_size: 1080p type: movie ? 10 Cloverfield Lane.[Blu-Ray 1080p].[MULTI] : options: --type movie title: 10 Cloverfield Lane - source: Blu-ray + format: BluRay screen_size: 1080p language: Multiple languages type: movie @@ -1136,586 +1094,15 @@ ? 007.Spectre.[HDTC.MD].[TRUEFRENCH] : options: --type movie title: 007 Spectre - source: HD Telecine + format: HDTC language: French type: movie ? We.Are.X.2016.LIMITED.BDRip.x264-BiPOLAR : title: We Are X year: 2016 - edition: Limited - source: Blu-ray - other: Rip - video_codec: H.264 + edition: Limited Edition + format: BluRay + video_codec: h264 release_group: BiPOLAR type: movie - -? The Rack (VHS) [1956] Paul Newman -: title: The Rack - source: VHS - year: 1956 - type: movie - -? Les.Magiciens.1976.VHSRip.XViD.MKO -: title: Les Magiciens - year: 1976 - source: VHS - other: Rip - video_codec: Xvid - release_group: MKO - type: movie - -? The Boss Baby 2017 720p CAM x264 AC3 TiTAN -: title: The Boss Baby - year: 2017 - screen_size: 720p - source: Camera - video_codec: H.264 - audio_codec: Dolby Digital - release_group: TiTAN - type: movie - -? The.Boss.Baby.2017.HDCAM.XviD-MrGrey -: title: The Boss Baby - year: 2017 - source: HD Camera - video_codec: Xvid - release_group: MrGrey - type: movie - -? The Martian 2015 Multi 2160p 4K UHD Bluray HEVC10 SDR DTSHD 7.1 -Zeus -: title: The Martian - year: 2015 - language: mul - screen_size: 2160p - source: Ultra HD Blu-ray - video_codec: H.265 - color_depth: 10-bit - other: Standard Dynamic Range - audio_codec: DTS-HD - audio_channels: '7.1' - release_group: Zeus - type: movie - -? Fantastic Beasts and Where to Find Them 2016 Multi 2160p UHD BluRay HEVC HDR Atmos7.1-DDR -: title: Fantastic Beasts and Where to Find Them - year: 2016 - language: mul - screen_size: 2160p - source: Ultra HD Blu-ray - video_codec: H.265 - other: HDR10 - audio_codec: Dolby Atmos - audio_channels: '7.1' - release_group: DDR - type: movie - -? Life of Pi 2012 2160p 4K BluRay HDR10 HEVC BT2020 DTSHD 7.1 subs -DDR -: title: Life of Pi - year: 2012 - screen_size: 2160p - source: Ultra HD Blu-ray - other: [HDR10, BT.2020] - subtitle_language: und - release_group: DDR - -? Captain.America.Civil.War.HDR.1080p.HEVC.10bit.BT.2020.DTS-HD.MA.7.1-VISIONPLUSHDR -: title: Captain America Civil War - other: [HDR10, BT.2020] - screen_size: 1080p - video_codec: H.265 - color_depth: 10-bit - audio_codec: DTS-HD - audio_profile: Master Audio - audio_channels: '7.1' - release_group: VISIONPLUSHDR - type: movie - -? Deadpool.2016.4K.2160p.UHD.HQ.8bit.BluRay.8CH.x265.HEVC-MZABI.mkv -: title: Deadpool - year: 2016 - screen_size: 2160p - source: Ultra HD Blu-ray - other: High Quality - color_depth: 8-bit - audio_channels: '7.1' - video_codec: H.265 - release_group: MZABI - type: movie - -? Fantastic.Beasts.and.Where.to.Find.Them.2016.2160p.4K.UHD.10bit.HDR.BluRay.7.1.x265.HEVC-MZABI.mkv -: title: Fantastic Beasts and Where to Find Them - year: 2016 - screen_size: 2160p - source: Ultra HD Blu-ray - color_depth: 10-bit - other: HDR10 - audio_channels: '7.1' - video_codec: H.265 - release_group: MZABI - container: mkv - type: movie - -? The.Arrival.4K.HDR.HEVC.10bit.BT2020.DTS.HD-MA-MadVR.HDR10.Dolby.Vision-VISIONPLUSHDR1000 -: title: The Arrival - screen_size: 2160p - other: [HDR10, BT.2020, Dolby Vision] - video_codec: H.265 - color_depth: 10-bit - audio_codec: DTS-HD - audio_profile: Master Audio - release_group: VISIONPLUSHDR1000 - type: movie - -? How To Steal A Dog.2014.BluRay.1080p.12bit.HEVC.OPUS 5.1-Hn1Dr2.mkv -: title: How To Steal A Dog - year: 2014 - source: Blu-ray - screen_size: 1080p - color_depth: 12-bit - video_codec: H.265 - audio_codec: Opus - audio_channels: '5.1' - release_group: Hn1Dr2 - container: mkv - type: movie - -? Interstelar.2014.IMAX.RUS.BDRip.x264.-HELLYWOOD.mkv -: title: Interstelar - year: 2014 - edition: IMAX - language: ru - source: Blu-ray - other: Rip - video_codec: H.264 - release_group: HELLYWOOD - container: mkv - type: movie - -? The.Dark.Knight.IMAX.EDITION.HQ.BluRay.1080p.x264.AC3.Hindi.Eng.ETRG -: title: The Dark Knight - edition: IMAX - other: High Quality - source: Blu-ray - screen_size: 1080p - video_codec: H.264 - audio_codec: Dolby Digital - language: [hindi, english] - release_group: ETRG - type: movie - -? The.Martian.2015.4K.UHD.UPSCALED-ETRG -: title: The Martian - year: 2015 - screen_size: 2160p - other: [Ultra HD, Upscaled] - release_group: ETRG - type: movie - -? Delibal 2015 720p Upscale DVDRip x264 DD5.1 AC3 -: title: Delibal - year: 2015 - screen_size: 720p - other: [Upscaled, Rip] - source: DVD - video_codec: H.264 - audio_codec: Dolby Digital - audio_channels: '5.1' - type: movie - -? Casablanca [Ultimate Collector's Edition].1942.BRRip.XviD-VLiS -: title: Casablanca - edition: [Ultimate, Collector] - year: 1942 - source: Blu-ray - other: [Reencoded, Rip] - video_codec: Xvid - release_group: VLiS - type: movie - -? Batman V Superman Dawn of Justice 2016 Extended Cut Ultimate Edition HDRip x264 AC3-DaDDy -: title: Batman V Superman Dawn of Justice - year: 2016 - edition: [Extended, Ultimate] - other: [HD, Rip] - video_codec: H.264 - audio_codec: Dolby Digital - release_group: DaDDy - type: movie - -? Stargate SG1 Ultimate Fan Collection -: title: Stargate SG1 - edition: [Ultimate, Fan] - -? The.Jungle.Book.2016.MULTi.1080p.BluRay.x264.DTS-HD.MA.7.1.DTS-HD.HRA.5.1-LeRalou -: title: The Jungle Book - year: 2016 - language: mul - screen_size: 1080p - source: Blu-ray - video_codec: H.264 - audio_codec: DTS-HD - audio_profile: [Master Audio, High Resolution Audio] - audio_channels: ['7.1', '5.1'] - release_group: LeRalou - type: movie - -? Terminus.2015.BluRay.1080p.x264.DTS-HD.HRA.5.1-LTT -: title: Terminus - year: 2015 - source: Blu-ray - screen_size: 1080p - video_codec: H.264 - audio_codec: DTS-HD - audio_profile: High Resolution Audio - audio_channels: '5.1' - release_group: LTT - type: movie - -? Ghost.in.the.Shell.1995.1080p.Bluray.DTSES.x264-SHiTSoNy -: title: Ghost in the Shell - year: 1995 - screen_size: 1080p - source: Blu-ray - audio_codec: DTS - audio_profile: Extended Surround - -? The.Boss.Baby.2017.BluRay.1080p.DTS-ES.x264-PRoDJi -: title: The Boss Baby - year: 2017 - source: Blu-ray - screen_size: 1080p - audio_codec: DTS - audio_profile: Extended Surround - video_codec: H.264 - release_group: PRoDJi - type: movie - -? Title.2000.720p.BluRay.DDEX.x264-HDClub.mkv -: title: Title - year: 2000 - screen_size: 720p - source: Blu-ray - audio_codec: Dolby Digital - audio_profile: EX - video_codec: H.264 - release_group: HDClub - container: mkv - type: movie - -? Jack Reacher Never Go Back 2016 720p Bluray DD-EX x264-BluPanther -: title: Jack Reacher Never Go Back - year: 2016 - screen_size: 720p - source: Blu-ray - audio_codec: Dolby Digital - audio_profile: EX - video_codec: H.264 - release_group: BluPanther - type: movie - -? How To Steal A Dog.2014.BluRay.1080p.12bit.HEVC.OPUS 5.1-Hn1Dr2.mkv -: title: How To Steal A Dog - year: 2014 - source: Blu-ray - screen_size: 1080p - color_depth: 12-bit - video_codec: H.265 - audio_codec: Opus - audio_channels: '5.1' - release_group: Hn1Dr2 - container: mkv - type: movie - -? How.To.Be.Single.2016.1080p.BluRay.x264-BLOW/blow-how.to.be.single.2016.1080p.bluray.x264.mkv -: title: How To Be Single - year: 2016 - screen_size: 1080p - source: Blu-ray - video_codec: H.264 - release_group: BLOW - container: mkv - type: movie - -? After.the.Storm.2016.720p.YIFY -: title: After the Storm - year: 2016 - screen_size: 720p - release_group: YIFY - type: movie - -? Battle Royale 2000 DC (1080p Bluray x265 HEVC 10bit AAC 7.1 Japanese Tigole) -: title: Battle Royale - year: 2000 - edition: Director's Cut - screen_size: 1080p - source: Blu-ray - video_codec: H.265 - color_depth: 10-bit - audio_codec: AAC - audio_channels: '7.1' - language: jp - release_group: Tigole - -? Congo.The.Grand.Inga.Project.2013.1080p.BluRay.x264-OBiTS -: title: Congo The Grand Inga Project - year: 2013 - screen_size: 1080p - source: Blu-ray - video_codec: H.264 - release_group: OBiTS - type: movie - -? Congo.The.Grand.Inga.Project.2013.BRRip.XviD.MP3-RARBG -: title: Congo The Grand Inga Project - year: 2013 - source: Blu-ray - other: [Reencoded, Rip] - video_codec: Xvid - audio_codec: MP3 - release_group: RARBG - type: movie - -? Congo.The.Grand.Inga.Project.2013.720p.BluRay.H264.AAC-RARBG -: title: Congo The Grand Inga Project - year: 2013 - screen_size: 720p - source: Blu-ray - video_codec: H.264 - audio_codec: AAC - release_group: RARBG - type: movie - -? Mit.dem.Bauch.durch.die.Wand.SWiSSGERMAN.DOKU.DVDRiP.x264-DEFLOW -: title: Mit dem Bauch durch die Wand - language: de-CH - other: [Documentary, Rip] - source: DVD - video_codec: H.264 - release_group: DEFLOW - type: movie - -? InDefinitely.Maybe.2008.1080p.EUR.BluRay.VC-1.DTS-HD.MA.5.1-FGT -: title: InDefinitely Maybe - year: 2008 - screen_size: 1080p - source: Blu-ray - video_codec: VC-1 - audio_codec: DTS-HD - audio_profile: Master Audio - audio_channels: '5.1' - release_group: FGT - type: movie - -? Bjyukujyo Kyoushi Kan XXX 720P WEBRIP MP4-GUSH -: title: Bjyukujyo Kyoushi Kan - other: [XXX, Rip] - screen_size: 720p - source: Web - container: mp4 - release_group: GUSH - type: movie - -? The.Man.With.The.Golden.Arm.1955.1080p.BluRay.x264.DTS-FGT -: title: The Man With The Golden Arm - year: 1955 - screen_size: 1080p - source: Blu-ray - video_codec: H.264 - audio_codec: DTS - release_group: FGT - type: movie - -? blow-how.to.be.single.2016.1080p.bluray.x264.mkv -: release_group: blow - title: how to be single - year: 2016 - screen_size: 1080p - source: Blu-ray - video_codec: H.264 - container: mkv - type: movie - -? ulshd-the.right.stuff.1983.multi.1080p.bluray.x264.mkv -: release_group: ulshd - title: the right stuff - year: 1983 - language: mul - screen_size: 1080p - source: Blu-ray - video_codec: H.264 - container: mkv - type: movie - -? FROZEN [2010] LiMiTED DVDRip H262 AAC[ ENG SUBS]-MANTESH -: title: FROZEN - year: 2010 - edition: Limited - source: DVD - other: Rip - video_codec: MPEG-2 - audio_codec: AAC - subtitle_language: english - release_group: MANTESH - type: movie - -? Family.Katta.2016.1080p.WEB-DL.H263.DD5.1.ESub-DDR -: title: Family Katta - year: 2016 - screen_size: 1080p - source: Web - video_codec: H.263 - audio_codec: Dolby Digital - audio_channels: '5.1' - subtitle_language: und - release_group: DDR - type: movie - -? Bad Boys 2 1080i.mpg2.rus.eng.ts -: title: Bad Boys 2 - screen_size: 1080i - video_codec: MPEG-2 - language: [russian, english] - container: ts - type: movie - -? Alien.Director.Cut.Ita.Eng.VP9.Opus.AlphaBot.webm -: title: Alien - edition: Director's Cut - language: [english, italian] - video_codec: VP9 - audio_codec: Opus - release_group: AlphaBot - container: webm - type: movie - -? The.Stranger.1946.US.(Kino.Classics).Bluray.1080p.LPCM.DD-2.0.x264-Grym@BTNET -: title: The Stranger - year: 1946 - country: US - source: Blu-ray - screen_size: 1080p - audio_codec: [LPCM, Dolby Digital] - audio_channels: '2.0' - video_codec: H.264 - release_group: Grym@BTNET - type: movie - -? X-Men.Apocalypse.2016.complete.hdts.pcm.TrueFrench-Scarface45.avi -: title: X-Men Apocalypse - year: 2016 - other: Complete - source: HD Telesync - audio_codec: PCM - language: french - release_group: Scarface45 - container: avi - type: movie - -? Tears.of.Steel.2012.2160p.DMRip.Eng.HDCLUB.mkv -: title: Tears of Steel - year: 2012 - screen_size: 2160p - source: Digital Master - other: Rip - language: english - release_group: HDCLUB - container: mkv - type: movie - -? "/Movies/Open Season 2 (2008)/Open Season 2 (2008) - Bluray-1080p.x264.DTS.mkv" -: options: --type movie - title: Open Season 2 - year: 2008 - source: Blu-ray - screen_size: 1080p - video_codec: H.264 - audio_codec: DTS - container: mkv - type: movie - -? Re-Animator.1985.INTEGRAL VERSION LIMITED EDITION.1080p.BluRay.REMUX.AVC.DTS-HD MA 5.1-LAZY -: title: Re-Animator - year: 1985 - edition: Limited - screen_size: 1080p - source: Blu-ray - other: Remux - video_codec: H.264 - audio_codec: DTS-HD - audio_profile: Master Audio - audio_channels: '5.1' - release_group: LAZY - type: movie - -? Test (2013) [WEBDL-1080p] [x264 AC3] [ENG+RU+PT] [NTb].mkv -: title: Test - year: 2013 - source: Web - screen_size: 1080p - video_codec: H.264 - audio_codec: Dolby Digital - language: [en, ru, pt] - release_group: NTb - container: mkv - type: movie - -? "[nextorrent.org] Bienvenue.Au.Gondwana.2016.FRENCH.DVDRiP.XViD-AViTECH.avi" -: website: nextorrent.org - title: Bienvenue Au Gondwana - year: 2016 - language: french - source: DVD - other: Rip - video_codec: Xvid - release_group: AViTECH - container: avi - type: movie - -? Star Trek First Contact (1996) Blu-Ray 1080p24 H.264 TrueHD 5.1 CtrlHD -: title: Star Trek First Contact - year: 1996 - source: Blu-ray - screen_size: 1080p - frame_rate: 24fps - video_codec: H.264 - audio_codec: Dolby TrueHD - audio_channels: '5.1' - release_group: CtrlHD - type: movie - -? The.Hobbit.The.Desolation.of.Smaug.Extended.HFR.48fps.ITA.ENG.AC3.BDRip.1080p.x264_ZMachine.mkv -: title: The Hobbit The Desolation of Smaug - edition: Extended - other: [High Frame Rate, Rip] - frame_rate: 48fps - language: [it, en] - audio_codec: Dolby Digital - source: Blu-ray - screen_size: 1080p - video_codec: H.264 - release_group: ZMachine - container: mkv - type: movie - -? Test (2013) [WEBDL-1080p] [x264 AC3] [ENG+PT+DE] [STANDARD] -: title: Test - year: 2013 - source: Web - screen_size: 1080p - video_codec: H.264 - audio_codec: Dolby Digital - language: [en, pt, de] - release_group: STANDARD - type: movie - -? Test (2013) [WEBDL-1080p] [x264 AC3] [ENG+DE+IT] [STANDARD] -: title: Test - year: 2013 - source: Web - screen_size: 1080p - video_codec: H.264 - audio_codec: Dolby Digital - language: [en, de, it] - release_group: STANDARD - type: movie diff --git a/libs/guessit/test/rules/audio_codec.yml b/libs/guessit/test/rules/audio_codec.yml index cbb6fc8bc..df5ac4dc9 100644 --- a/libs/guessit/test/rules/audio_codec.yml +++ b/libs/guessit/test/rules/audio_codec.yml @@ -12,18 +12,18 @@ ? +DD ? +Dolby Digital ? +AC3 -: audio_codec: Dolby Digital +: audio_codec: AC3 ? +DDP ? +DD+ ? +EAC3 -: audio_codec: Dolby Digital Plus +: audio_codec: EAC3 ? +DolbyAtmos ? +Dolby Atmos ? +Atmos ? -Atmosphere -: audio_codec: Dolby Atmos +: audio_codec: DolbyAtmos ? +AAC : audio_codec: AAC @@ -36,34 +36,33 @@ ? +True-HD ? +trueHD -: audio_codec: Dolby TrueHD +: audio_codec: TrueHD ? +True-HD51 ? +trueHD51 -: audio_codec: Dolby TrueHD +: audio_codec: TrueHD audio_channels: '5.1' -? +DTSHD -? +DTS HD + ? +DTS-HD -: audio_codec: DTS-HD +: audio_codec: DTS + audio_profile: HD ? +DTS-HDma -? +DTSMA -: audio_codec: DTS-HD - audio_profile: Master Audio +: audio_codec: DTS + audio_profile: HDMA ? +AC3-hq -: audio_codec: Dolby Digital - audio_profile: High Quality +: audio_codec: AC3 + audio_profile: HQ ? +AAC-HE : audio_codec: AAC - audio_profile: High Efficiency + audio_profile: HE ? +AAC-LC : audio_codec: AAC - audio_profile: Low Complexity + audio_profile: LC ? +AAC2.0 ? +AAC20 @@ -91,41 +90,8 @@ ? DD5.1 ? DD51 -: audio_codec: Dolby Digital +: audio_codec: AC3 audio_channels: '5.1' ? -51 : audio_channels: '5.1' - -? DTS-HD.HRA -? DTSHD.HRA -? DTS-HD.HR -? DTSHD.HR -? -HRA -? -HR -: audio_codec: DTS-HD - audio_profile: High Resolution Audio - -? DTSES -? DTS-ES -? -ES -: audio_codec: DTS - audio_profile: Extended Surround - -? DD-EX -? DDEX -? -EX -: audio_codec: Dolby Digital - audio_profile: EX - -? OPUS -: audio_codec: Opus - -? Vorbis -: audio_codec: Vorbis - -? PCM -: audio_codec: PCM - -? LPCM -: audio_codec: LPCM diff --git a/libs/guessit/test/rules/cds.yml b/libs/guessit/test/rules/cds.yml index d76186c6b..cc63765e5 100644 --- a/libs/guessit/test/rules/cds.yml +++ b/libs/guessit/test/rules/cds.yml @@ -7,4 +7,4 @@ ? Some.Title-DVDRIP-x264-CDP : cd: !!null release_group: CDP - video_codec: H.264 + video_codec: h264 diff --git a/libs/guessit/test/rules/country.yml b/libs/guessit/test/rules/country.yml index 7e9693980..f2da1b205 100644 --- a/libs/guessit/test/rules/country.yml +++ b/libs/guessit/test/rules/country.yml @@ -8,6 +8,3 @@ ? This.is.us.title : title: This is us title -? This.Is.Us -: options: --no-embedded-config - title: This Is Us diff --git a/libs/guessit/test/rules/edition.yml b/libs/guessit/test/rules/edition.yml index 4b7fd9866..4d96017b3 100644 --- a/libs/guessit/test/rules/edition.yml +++ b/libs/guessit/test/rules/edition.yml @@ -7,57 +7,25 @@ ? Collector ? Collector Edition ? Edition Collector -: edition: Collector +: edition: Collector Edition ? Special Edition ? Edition Special ? -Special -: edition: Special +: edition: Special Edition ? Criterion Edition ? Edition Criterion -? CC ? -Criterion -: edition: Criterion +: edition: Criterion Edition ? Deluxe ? Deluxe Edition ? Edition Deluxe -: edition: Deluxe +: edition: Deluxe Edition ? Super Movie Alternate XViD ? Super Movie Alternative XViD ? Super Movie Alternate Cut XViD ? Super Movie Alternative Cut XViD : edition: Alternative Cut - -? ddc -: edition: Director's Definitive Cut - -? IMAX -? IMAX Edition -: edition: IMAX - -? ultimate edition -? -ultimate -: edition: Ultimate - -? ultimate collector edition -? ultimate collector's edition -? ultimate collectors edition -? -collectors edition -? -ultimate edition -: edition: [Ultimate, Collector] - -? ultimate collectors edition dc -: edition: [Ultimate, Collector, Director's Cut] - -? fan edit -? fan edition -? fan collection -: edition: Fan - -? ultimate fan edit -? ultimate fan edition -? ultimate fan collection -: edition: [Ultimate, Fan] diff --git a/libs/guessit/test/rules/episodes.yml b/libs/guessit/test/rules/episodes.yml index 98325fa1d..9c67c294a 100644 --- a/libs/guessit/test/rules/episodes.yml +++ b/libs/guessit/test/rules/episodes.yml @@ -156,7 +156,7 @@ ? Show.Name.Season.1.3&5.HDTV.XviD-GoodGroup[SomeTrash] ? Show.Name.Season.1.3 and 5.HDTV.XviD-GoodGroup[SomeTrash] -: source: HDTV +: format: HDTV release_group: GoodGroup[SomeTrash] season: - 1 @@ -164,12 +164,12 @@ - 5 title: Show Name type: episode - video_codec: Xvid + video_codec: XviD ? Show.Name.Season.1.2.3-5.HDTV.XviD-GoodGroup[SomeTrash] ? Show.Name.Season.1.2.3~5.HDTV.XviD-GoodGroup[SomeTrash] ? Show.Name.Season.1.2.3 to 5.HDTV.XviD-GoodGroup[SomeTrash] -: source: HDTV +: format: HDTV release_group: GoodGroup[SomeTrash] season: - 1 @@ -179,19 +179,18 @@ - 5 title: Show Name type: episode - video_codec: Xvid + video_codec: XviD ? The.Get.Down.S01EP01.FRENCH.720p.WEBRIP.XVID-STR : episode: 1 - source: Web - other: Rip + format: WEBRip language: fr release_group: STR screen_size: 720p season: 1 title: The Get Down type: episode - video_codec: Xvid + video_codec: XviD ? My.Name.Is.Earl.S01E01-S01E21.SWE-SUB : episode: @@ -270,10 +269,4 @@ ? Episode71 ? Episode 71 -: episode: 71 - -? S01D02.3-5-GROUP -: disc: [2, 3, 4, 5] - -? S01D02&4-6&8 -: disc: [2, 4, 5, 6, 8] +: episode: 71
\ No newline at end of file diff --git a/libs/guessit/test/rules/format.yml b/libs/guessit/test/rules/format.yml new file mode 100644 index 000000000..e983cfb1b --- /dev/null +++ b/libs/guessit/test/rules/format.yml @@ -0,0 +1,138 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? +VHS +? +VHSRip +? +VHS-Rip +? +VhS_rip +? +VHS.RIP +? -VHSAnythingElse +? -SomeVHS stuff +? -VH +? -VHx +? -VHxRip +: format: VHS + +? +Cam +? +CamRip +? +CaM Rip +? +Cam_Rip +? +cam.rip +: format: Cam + +? +Telesync +? +TS +? +HD TS +? -Hd.Ts # ts file extension +? -HD.TS # ts file extension +? +Hd-Ts +: format: Telesync + +? +Workprint +? +workPrint +? +WorkPrint +? +WP +? -Work Print +: format: Workprint + +? +Telecine +? +teleCine +? +TC +? -Tele Cine +: format: Telecine + +? +PPV +? +ppv-rip +: format: PPV + +? -TV +? +SDTV +? +SDTVRIP +? +Rip sd tv +? +TvRip +? +Rip TV +: format: TV + +? +DVB +? +DVB-Rip +? +DvBRiP +? +pdTV +? +Pd Tv +: format: DVB + +? +DVD +? +DVD-RIP +? +video ts +? +DVDR +? +DVD 9 +? +dvd 5 +? -dvd ts +: format: DVD + -format: ts + +? +HDTV +? +tv rip hd +? +HDtv Rip +? +HdRip +: format: HDTV + +? +VOD +? +VodRip +? +vod rip +: format: VOD + +? +webrip +? +Web Rip +? +webdlrip +? +web dl rip +? +webcap +? +web cap +: format: WEBRip + +? +webdl +? +Web DL +? +webHD +? +WEB hd +? +web +: format: WEB-DL + +? +HDDVD +? +hd dvd +? +hdDvdRip +: format: HD-DVD + +? +BluRay +? +BluRay rip +? +BD +? +BR +? +BDRip +? +BR rip +? +BD5 +? +BD9 +? +BD25 +? +bd50 +: format: BluRay + +? XVID.NTSC.DVDR.nfo +: format: DVD + +? AHDTV +: format: AHDTV + +? dsr +? dsrip +? ds rip +? dsrrip +? dsr rip +? satrip +? sat rip +? dth +? dthrip +? dth rip +: format: SATRip + +? HDTC +: format: HDTC + +? UHDTV +? UHDRip +: format: UHDTV diff --git a/libs/guessit/test/rules/language.yml b/libs/guessit/test/rules/language.yml index 10e5b9c05..51bbd8da8 100644 --- a/libs/guessit/test/rules/language.yml +++ b/libs/guessit/test/rules/language.yml @@ -36,12 +36,4 @@ ? +ENG.-.SubSV ? +ENG.-.SVSUB : language: English - subtitle_language: Swedish - -? The English Patient (1996) -: title: The English Patient - -language: english - -? French.Kiss.1995.1080p -: title: French Kiss - -language: french + subtitle_language: Swedish
\ No newline at end of file diff --git a/libs/guessit/test/rules/other.yml b/libs/guessit/test/rules/other.yml index 113b6d813..3d3df706e 100644 --- a/libs/guessit/test/rules/other.yml +++ b/libs/guessit/test/rules/other.yml @@ -12,22 +12,22 @@ ? +AudioFixed ? +Audio Fix ? +Audio Fixed -: other: Audio Fixed +: other: AudioFix ? +SyncFix ? +SyncFixed ? +Sync Fix ? +Sync Fixed -: other: Sync Fixed +: other: SyncFix ? +DualAudio ? +Dual Audio -: other: Dual Audio +: other: DualAudio ? +ws ? +WideScreen ? +Wide Screen -: other: Widescreen +: other: WideScreen # Fix and Real must be surround by others properties to be matched. ? DVD.Real.XViD @@ -58,20 +58,18 @@ proper_count: 1 ? XViD.Fansub -: other: Fan Subtitled +: other: Fansub ? XViD.Fastsub -: other: Fast Subtitled +: other: Fastsub ? +Season Complete ? -Complete : other: Complete ? R5 -: other: Region 5 - ? RC -: other: Region C +: other: R5 ? PreAir ? Pre Air @@ -92,23 +90,28 @@ ? FHD ? FullHD ? Full HD -: other: Full HD +: other: FullHD ? UHD ? Ultra ? UltraHD ? Ultra HD -: other: Ultra HD +: other: UltraHD ? mHD # ?? +: other: mHD + ? HDLight -: other: Micro HD +: other: HDLight ? HQ -: other: High Quality +: other: HQ + +? ddc +: other: DDC ? hr -: other: High Resolution +: other: HR ? PAL : other: PAL @@ -119,14 +122,15 @@ ? NTSC : other: NTSC -? LDTV -: other: Low Definition +? CC +: other: CC ? LD -: other: Line Dubbed +? LDTV +: other: LD ? MD -: other: Mic Dubbed +: other: MD ? -The complete movie : other: Complete @@ -135,38 +139,16 @@ : title: The complete movie ? +AC3-HQ -: audio_profile: High Quality +: audio_profile: HQ ? Other-HQ -: other: High Quality +: other: HQ ? reenc ? re-enc ? re-encoded ? reencoded -: other: Reencoded +: other: ReEncoded ? CONVERT XViD -: other: Converted - -? +HDRIP # it's a Rip from non specified HD source -: other: [HD, Rip] - -? SDR -: other: Standard Dynamic Range - -? HDR -? HDR10 -? -HDR100 -: other: HDR10 - -? BT2020 -? BT.2020 -? -BT.20200 -? -BT.2021 -: other: BT.2020 - -? Upscaled -? Upscale -: other: Upscaled - +: other: Converted
\ No newline at end of file diff --git a/libs/guessit/test/rules/release_group.yml b/libs/guessit/test/rules/release_group.yml index c96383e94..f9d01e723 100644 --- a/libs/guessit/test/rules/release_group.yml +++ b/libs/guessit/test/rules/release_group.yml @@ -42,30 +42,30 @@ ? Show.Name.x264-byEMP : title: Show Name - video_codec: H.264 + video_codec: h264 release_group: byEMP ? Show.Name.x264-NovaRip : title: Show Name - video_codec: H.264 + video_codec: h264 release_group: NovaRip ? Show.Name.x264-PARTiCLE : title: Show Name - video_codec: H.264 + video_codec: h264 release_group: PARTiCLE ? Show.Name.x264-POURMOi : title: Show Name - video_codec: H.264 + video_codec: h264 release_group: POURMOi ? Show.Name.x264-RipPourBox : title: Show Name - video_codec: H.264 + video_codec: h264 release_group: RipPourBox ? Show.Name.x264-RiPRG : title: Show Name - video_codec: H.264 + video_codec: h264 release_group: RiPRG diff --git a/libs/guessit/test/rules/screen_size.yml b/libs/guessit/test/rules/screen_size.yml index 450d77e4e..1145dd7eb 100644 --- a/libs/guessit/test/rules/screen_size.yml +++ b/libs/guessit/test/rules/screen_size.yml @@ -2,258 +2,68 @@ # Use - marker to check inputs that should not match results. ? +360p ? +360px -? -360 +? +360i +? "+360" ? +500x360 -? -250x360 -: screen_size: 360p - -? +640x360 -? -640x360i -? -684x360i : screen_size: 360p - aspect_ratio: 1.778 - -? +360i -: screen_size: 360i - -? +480x360i -? -480x360p -? -450x360 -: screen_size: 360i - aspect_ratio: 1.333 ? +368p ? +368px -? -368i -? -368 +? +368i +? "+368" ? +500x368 : screen_size: 368p -? -490x368 -? -700x368 -: screen_size: 368p - -? +492x368p -: screen_size: - aspect_ratio: 1.337 - -? +654x368 -: screen_size: 368p - aspect_ratio: 1.777 - -? +698x368 -: screen_size: 368p - aspect_ratio: 1.897 - -? +368i -: -screen_size: 368i - ? +480p ? +480px -? -480i -? -480 -? -500x480 -? -638x480 -? -920x480 -: screen_size: 480p - -? +640x480 -: screen_size: 480p - aspect_ratio: 1.333 - -? +852x480 -: screen_size: 480p - aspect_ratio: 1.775 - -? +910x480 -: screen_size: 480p - aspect_ratio: 1.896 - -? +500x480 -? +500 x 480 -? +500 * 480 -? +500x480p -? +500X480i -: screen_size: 500x480 - aspect_ratio: 1.042 - ? +480i -? +852x480i -: screen_size: 480i +? "+480" +? +500x480 +: screen_size: 480p ? +576p ? +576px -? -576i -? -576 -? -500x576 -? -766x576 -? -1094x576 -: screen_size: 576p - -? +768x576 -: screen_size: 576p - aspect_ratio: 1.333 - -? +1024x576 -: screen_size: 576p - aspect_ratio: 1.778 - -? +1092x576 -: screen_size: 576p - aspect_ratio: 1.896 - -? +500x576 -: screen_size: 500x576 - aspect_ratio: 0.868 - ? +576i -: screen_size: 576i +? "+576" +? +500x576 +: screen_size: 576p ? +720p ? +720px -? -720i ? 720hd ? 720pHD -? -720 -? -500x720 -? -950x720 -? -1368x720 -: screen_size: 720p - -? +960x720 -: screen_size: 720p - aspect_ratio: 1.333 - -? +1280x720 -: screen_size: 720p - aspect_ratio: 1.778 - -? +1366x720 -: screen_size: 720p - aspect_ratio: 1.897 - +? +720i +? "+720" ? +500x720 -: screen_size: 500x720 - aspect_ratio: 0.694 +: screen_size: 720p ? +900p ? +900px -? -900i -? -900 -? -500x900 -? -1198x900 -? -1710x900 -: screen_size: 900p - -? +1200x900 -: screen_size: 900p - aspect_ratio: 1.333 - -? +1600x900 -: screen_size: 900p - aspect_ratio: 1.778 - -? +1708x900 -: screen_size: 900p - aspect_ratio: 1.898 - -? +500x900 -? +500x900p -? +500x900i -: screen_size: 500x900 - aspect_ratio: 0.556 - ? +900i -: screen_size: 900i +? "+900" +? +500x900 +: screen_size: 900p ? +1080p ? +1080px ? +1080hd ? +1080pHD ? -1080i -? -1080 -? -500x1080 -? -1438x1080 -? -2050x1080 -: screen_size: 1080p - -? +1440x1080 -: screen_size: 1080p - aspect_ratio: 1.333 - -? +1920x1080 -: screen_size: 1080p - aspect_ratio: 1.778 - -? +2048x1080 +? "+1080" +? +500x1080 : screen_size: 1080p - aspect_ratio: 1.896 ? +1080i ? -1080p : screen_size: 1080i -? 1440p -: screen_size: 1440p - -? +500x1080 -: screen_size: 500x1080 - aspect_ratio: 0.463 - ? +2160p ? +2160px -? -2160i -? -2160 +? +2160i +? "+2160" ? +4096x2160 -? +4k -? -2878x2160 -? -4100x2160 -: screen_size: 2160p - -? +2880x2160 -: screen_size: 2160p - aspect_ratio: 1.333 - -? +3840x2160 -: screen_size: 2160p - aspect_ratio: 1.778 - -? +4098x2160 -: screen_size: 2160p - aspect_ratio: 1.897 - -? +500x2160 -: screen_size: 500x2160 - aspect_ratio: 0.231 - -? +4320p -? +4320px -? -4320i -? -4320 -? -5758x2160 -? -8198x2160 -: screen_size: 4320p - -? +5760x4320 -: screen_size: 4320p - aspect_ratio: 1.333 - -? +7680x4320 -: screen_size: 4320p - aspect_ratio: 1.778 - -? +8196x4320 -: screen_size: 4320p - aspect_ratio: 1.897 - -? +500x4320 -: screen_size: 500x4320 - aspect_ratio: 0.116 +: screen_size: 4K ? Test.File.720hd.bluray -? Test.File.720p24 -? Test.File.720p30 ? Test.File.720p50 -? Test.File.720p60 -? Test.File.720p120 : screen_size: 720p diff --git a/libs/guessit/test/rules/source.yml b/libs/guessit/test/rules/source.yml deleted file mode 100644 index cda8f1ac4..000000000 --- a/libs/guessit/test/rules/source.yml +++ /dev/null @@ -1,323 +0,0 @@ -# Multiple input strings having same expected results can be chained. -# Use - marker to check inputs that should not match results. -? +VHS -? -VHSAnythingElse -? -SomeVHS stuff -? -VH -? -VHx -: source: VHS - -other: Rip - -? +VHSRip -? +VHS-Rip -? +VhS_rip -? +VHS.RIP -? -VHS -? -VHxRip -: source: VHS - other: Rip - -? +Cam -: source: Camera - -other: Rip - -? +CamRip -? +CaM Rip -? +Cam_Rip -? +cam.rip -? -Cam -: source: Camera - other: Rip - -? +HDCam -? +HD-Cam -: source: HD Camera - -other: Rip - -? +HDCamRip -? +HD-Cam.rip -? -HDCam -? -HD-Cam -: source: HD Camera - other: Rip - -? +Telesync -? +TS -: source: Telesync - -other: Rip - -? +TelesyncRip -? +TSRip -? -Telesync -? -TS -: source: Telesync - other: Rip - -? +HD TS -? -Hd.Ts # ts file extension -? -HD.TS # ts file extension -? +Hd-Ts -: source: HD Telesync - -other: Rip - -? +HD TS Rip -? +Hd-Ts-Rip -? -HD TS -? -Hd-Ts -: source: HD Telesync - other: Rip - -? +Workprint -? +workPrint -? +WorkPrint -? +WP -? -Work Print -: source: Workprint - -other: Rip - -? +Telecine -? +teleCine -? +TC -? -Tele Cine -: source: Telecine - -other: Rip - -? +Telecine Rip -? +teleCine-Rip -? +TC-Rip -? -Telecine -? -TC -: source: Telecine - other: Rip - -? +HD-TELECINE -? +HDTC -: source: HD Telecine - -other: Rip - -? +HD-TCRip -? +HD TELECINE RIP -? -HD-TELECINE -? -HDTC -: source: HD Telecine - other: Rip - -? +PPV -: source: Pay-per-view - -other: Rip - -? +ppv-rip -? -PPV -: source: Pay-per-view - other: Rip - -? -TV -? +SDTV -? +TV-Dub -: source: TV - -other: Rip - -? +SDTVRIP -? +Rip sd tv -? +TvRip -? +Rip TV -? -TV -? -SDTV -: source: TV - other: Rip - -? +DVB -? +pdTV -? +Pd Tv -: source: Digital TV - -other: Rip - -? +DVB-Rip -? +DvBRiP -? +pdtvRiP -? +pd tv RiP -? -DVB -? -pdTV -? -Pd Tv -: source: Digital TV - other: Rip - -? +DVD -? +video ts -? +DVDR -? +DVD 9 -? +dvd 5 -? -dvd ts -: source: DVD - -source: Telesync - -other: Rip - -? +DVD-RIP -? -video ts -? -DVD -? -DVDR -? -DVD 9 -? -dvd 5 -: source: DVD - other: Rip - -? +HDTV -: source: HDTV - -other: Rip - -? +tv rip hd -? +HDtv Rip -? -HdRip # it's a Rip from non specified HD source -? -HDTV -: source: HDTV - other: Rip - -? +VOD -: source: Video on Demand - -other: Rip - -? +VodRip -? +vod rip -? -VOD -: source: Video on Demand - other: Rip - -? +webrip -? +Web Rip -? +webdlrip -? +web dl rip -? +webcap -? +web cap -? +webcaprip -? +web cap rip -: source: Web - other: Rip - -? +webdl -? +Web DL -? +webHD -? +WEB hd -? +web -: source: Web - -other: Rip - -? +HDDVD -? +hd dvd -: source: HD-DVD - -other: Rip - -? +hdDvdRip -? -HDDVD -? -hd dvd -: source: HD-DVD - other: Rip - -? +BluRay -? +BD -? +BD5 -? +BD9 -? +BD25 -? +bd50 -: source: Blu-ray - -other: Rip - -? +BR-Scr -? +BR.Screener -: source: Blu-ray - other: [Reencoded, Screener] - -language: pt-BR - -? +BR-Rip -? +BRRip -: source: Blu-ray - other: [Reencoded, Rip] - -language: pt-BR - -? +BluRay rip -? +BDRip -? -BluRay -? -BD -? -BR -? -BR rip -? -BD5 -? -BD9 -? -BD25 -? -bd50 -: source: Blu-ray - other: Rip - -? XVID.NTSC.DVDR.nfo -: source: DVD - -other: Rip - -? +AHDTV -: source: Analog HDTV - -other: Rip - -? +dsr -? +dth -: source: Satellite - -other: Rip - -? +dsrip -? +ds rip -? +dsrrip -? +dsr rip -? +satrip -? +sat rip -? +dthrip -? +dth rip -? -dsr -? -dth -: source: Satellite - other: Rip - -? +UHDTV -: source: Ultra HDTV - -other: Rip - -? +UHDRip -? +UHDTV Rip -? -UHDTV -: source: Ultra HDTV - other: Rip - -? UHD Bluray -? UHD 2160p Bluray -? UHD 8bit Bluray -? UHD HQ 8bit Bluray -? Ultra Bluray -? Ultra HD Bluray -? Bluray ULTRA -? Bluray Ultra HD -? Bluray UHD -? 4K Bluray -? 2160p Bluray -? UHD 10bit HDR Bluray -? UHD HDR10 Bluray -? -HD Bluray -? -AMERICAN ULTRA (2015) 1080p Bluray -? -American.Ultra.2015.BRRip -? -BRRip XviD AC3-ULTRAS -? -UHD Proper Bluray -: source: Ultra HD Blu-ray - -? UHD.BRRip -? UHD.2160p.BRRip -? BRRip.2160p.UHD -? BRRip.[4K-2160p-UHD] -: source: Ultra HD Blu-ray - other: [Reencoded, Rip] - -? UHD.2160p.BDRip -? BDRip.[4K-2160p-UHD] -: source: Ultra HD Blu-ray - other: Rip - -? DM -: source: Digital Master - -? DMRIP -? DM-RIP -: source: Digital Master - other: Rip diff --git a/libs/guessit/test/rules/video_codec.yml b/libs/guessit/test/rules/video_codec.yml index c37c1a603..a11991ecc 100644 --- a/libs/guessit/test/rules/video_codec.yml +++ b/libs/guessit/test/rules/video_codec.yml @@ -6,19 +6,15 @@ ? Rv30 ? rv40 ? -xrv40 -: video_codec: RealVideo +: video_codec: Real ? mpeg2 ? MPEG2 -? MPEG-2 -? mpg2 -? H262 -? H.262 -? x262 ? -mpeg +? -mpeg 2 # Not sure if we should ignore this one ... ? -xmpeg2 ? -mpeg2x -: video_codec: MPEG-2 +: video_codec: Mpeg2 ? DivX ? -div X @@ -30,29 +26,19 @@ ? XviD ? xvid ? -x vid -: video_codec: Xvid - -? h263 -? x263 -? h.263 -: video_codec: H.263 +: video_codec: XviD ? h264 ? x264 ? h.264 ? x.264 ? mpeg4-AVC -? AVC -? AVCHD -? AVCHD-SC -? H.264-SC -? H.264-AVCHD-SC ? -MPEG-4 ? -mpeg4 ? -mpeg ? -h 265 ? -x265 -: video_codec: H.264 +: video_codec: h264 ? h265 ? x265 @@ -61,27 +47,13 @@ ? hevc ? -h 264 ? -x264 -: video_codec: H.265 +: video_codec: h265 ? hevc10 ? HEVC-YUV420P10 -: video_codec: H.265 - color_depth: 10-bit +: video_codec: h265 + video_profile: 10bit ? h265-HP -: video_codec: H.265 - video_profile: High - -? VC1 -? VC-1 -: video_codec: VC-1 - -? VP7 -: video_codec: VP7 - -? VP8 -? VP80 -: video_codec: VP8 - -? VP9 -: video_codec: VP9 +: video_codec: h265 + video_profile: HP
\ No newline at end of file diff --git a/libs/guessit/test/streaming_services.yaml b/libs/guessit/test/streaming_services.yaml deleted file mode 100644 index adf52e715..000000000 --- a/libs/guessit/test/streaming_services.yaml +++ /dev/null @@ -1,1934 +0,0 @@ -? House.of.Cards.2013.S02E03.1080p.NF.WEBRip.DD5.1.x264-NTb.mkv -? House.of.Cards.2013.S02E03.1080p.Netflix.WEBRip.DD5.1.x264-NTb.mkv -: title: House of Cards - year: 2013 - season: 2 - episode: 3 - screen_size: 1080p - streaming_service: Netflix - source: Web - other: Rip - audio_channels: "5.1" - audio_codec: Dolby Digital - video_codec: H.264 - release_group: NTb - -? The.Daily.Show.2015.07.01.Kirsten.Gillibrand.Extended.720p.CC.WEBRip.AAC2.0.x264-BTW.mkv -? The.Daily.Show.2015.07.01.Kirsten.Gillibrand.Extended.720p.ComedyCentral.WEBRip.AAC2.0.x264-BTW.mkv -? The.Daily.Show.2015.07.01.Kirsten.Gillibrand.Extended.720p.Comedy.Central.WEBRip.AAC2.0.x264-BTW.mkv -: audio_channels: '2.0' - audio_codec: AAC - date: 2015-07-01 - edition: Extended - source: Web - other: Rip - release_group: BTW - screen_size: 720p - streaming_service: Comedy Central - title: The Daily Show - episode_title: Kirsten Gillibrand - video_codec: H.264 - -? The.Daily.Show.2015.07.01.Kirsten.Gillibrand.Extended.Interview.720p.CC.WEBRip.AAC2.0.x264-BTW.mkv -: audio_channels: '2.0' - audio_codec: AAC - date: 2015-07-01 - source: Web - release_group: BTW - screen_size: 720p - streaming_service: Comedy Central - title: The Daily Show - episode_title: Kirsten Gillibrand Extended Interview - video_codec: H.264 - -? The.Daily.Show.2015.07.02.Sarah.Vowell.CC.WEBRip.AAC2.0.x264-BTW.mkv -: audio_channels: '2.0' - audio_codec: AAC - date: 2015-07-02 - source: Web - release_group: BTW - streaming_service: Comedy Central - title: The Daily Show - episode_title: Sarah Vowell - video_codec: H.264 - -# Streaming service: Amazon -? Show.Name.S07E04.Service.1080p.AMZN.WEBRip.DD+5.1.x264 -? Show.Name.S07E04.Service.1080p.AmazonPrime.WEBRip.DD+5.1.x264 -: title: Show Name - season: 7 - episode: 4 - episode_title: Service - screen_size: 1080p - streaming_service: Amazon Prime - source: Web - other: Rip - audio_codec: Dolby Digital Plus - audio_channels: '5.1' - video_codec: H.264 - type: episode - -# Streaming service: Comedy Central -? Show.Name.2016.09.28.Nice.Title.Extended.1080p.CC.WEBRip.AAC2.0.x264-monkee -: title: Show Name - date: 2016-09-28 - episode_title: Nice Title - edition: Extended - other: Rip - screen_size: 1080p - streaming_service: Comedy Central - source: Web - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: The CW -? Show.Name.US.S12E20.Nice.Title.720p.CW.WEBRip.AAC2.0.x264-monkee -? Show.Name.US.S12E20.Nice.Title.720p.TheCW.WEBRip.AAC2.0.x264-monkee -: title: Show Name - country: US - season: 12 - episode: 20 - episode_title: Nice Title - screen_size: 720p - streaming_service: The CW - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: AMBC -? Show.Name.2016.09.27.Nice.Title.720p.AMBC.WEBRip.AAC2.0.x264-monkee -: title: Show Name - date: 2016-09-27 - episode_title: Nice Title - screen_size: 720p - streaming_service: ABC - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: HIST -? Show.Name.720p.HIST.WEBRip.AAC2.0.H.264-monkee -? Show.Name.720p.History.WEBRip.AAC2.0.H.264-monkee -: options: -t episode - title: Show Name - screen_size: 720p - streaming_service: History - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: PBS -? Show.Name.2015.Nice.Title.1080p.PBS.WEBRip.AAC2.0.H264-monkee -: options: -t episode - title: Show Name - year: 2015 - episode_title: Nice Title - screen_size: 1080p - streaming_service: PBS - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: SeeSo -? Show.Name.2016.Nice.Title.1080p.SESO.WEBRip.AAC2.0.x264-monkee -: options: -t episode - title: Show Name - year: 2016 - episode_title: Nice Title - screen_size: 1080p - streaming_service: SeeSo - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: Discovery -? Show.Name.S01E03.Nice.Title.720p.DISC.WEBRip.AAC2.0.x264-NTb -? Show.Name.S01E03.Nice.Title.720p.Discovery.WEBRip.AAC2.0.x264-NTb -: title: Show Name - season: 1 - episode: 3 - episode_title: Nice Title - screen_size: 720p - streaming_service: Discovery - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: NTb - type: episode - -# Streaming service: BBC iPlayer -? Show.Name.2016.08.18.Nice.Title.720p.iP.WEBRip.AAC2.0.H.264-monkee -? Show.Name.2016.08.18.Nice.Title.720p.BBCiPlayer.WEBRip.AAC2.0.H.264-monkee -: title: Show Name - date: 2016-08-18 - episode_title: Nice Title - streaming_service: BBC iPlayer - screen_size: 720p - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: A&E -? Show.Name.S15E18.Nice.Title.720p.AE.WEBRip.AAC2.0.H.264-monkee -? Show.Name.S15E18.Nice.Title.720p.A&E.WEBRip.AAC2.0.H.264-monkee -: title: Show Name - season: 15 - episode: 18 - episode_title: Nice Title - screen_size: 720p - streaming_service: A&E - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: Adult Swim -? Show.Name.S04E01.Nice.Title.1080p.AS.WEBRip.AAC2.0.H.264-monkee -? Show.Name.S04E01.Nice.Title.1080p.AdultSwim.WEBRip.AAC2.0.H.264-monkee -: title: Show Name - season: 4 - episode: 1 - episode_title: Nice Title - screen_size: 1080p - streaming_service: Adult Swim - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: Netflix -? Show.Name.2013.S02E03.1080p.NF.WEBRip.DD5.1.x264-NTb.mkv -: title: Show Name - year: 2013 - season: 2 - episode: 3 - screen_size: 1080p - streaming_service: Netflix - source: Web - other: Rip - audio_codec: Dolby Digital - audio_channels: '5.1' - video_codec: H.264 - release_group: NTb - container: mkv - type: episode - -# Streaming service: CBS -? Show.Name.2016.05.10.Nice.Title.720p.CBS.WEBRip.AAC2.0.x264-monkee -: title: Show Name - date: 2016-05-10 - episode_title: Nice Title - screen_size: 720p - streaming_service: CBS - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: NBA TV -? NBA.2016.02.27.Team.A.vs.Team.B.720p.NBA.WEBRip.AAC2.0.H.264-monkee -? NBA.2016.02.27.Team.A.vs.Team.B.720p.NBATV.WEBRip.AAC2.0.H.264-monkee -: title: NBA - date: 2016-02-27 - episode_title: Team A vs Team B - screen_size: 720p - streaming_service: NBA TV - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: ePix -? Show.Name.S05E04.Nice.Title.Part4.720p.EPIX.WEBRip.AAC2.0.H.264-monkee -? Show.Name.S05E04.Nice.Title.Part4.720p.ePix.WEBRip.AAC2.0.H.264-monkee -: title: Show Name - season: 5 - episode: 4 - episode_title: Nice Title - part: 4 - screen_size: 720p - streaming_service: ePix - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: NBC -? Show.Name.S41E03.Nice.Title.720p.NBC.WEBRip.AAC2.0.x264-monkee -: title: Show Name - season: 41 - episode: 3 - episode_title: Nice Title - screen_size: 720p - streaming_service: NBC - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: Syfy -? Show.Name.S01E02.Nice.Title.720p.SYFY.WEBRip.AAC2.0.x264-group -? Show.Name.S01E02.Nice.Title.720p.Syfy.WEBRip.AAC2.0.x264-group -: title: Show Name - season: 1 - episode: 2 - episode_title: Nice Title - screen_size: 720p - streaming_service: Syfy - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: group - type: episode - -# Streaming service: Spike TV -? Show.Name.S01E02.Nice.Title.720p.SPKE.WEBRip.AAC2.0.x264-group -? Show.Name.S01E02.Nice.Title.720p.Spike TV.WEBRip.AAC2.0.x264-group -? Show.Name.S01E02.Nice.Title.720p.SpikeTV.WEBRip.AAC2.0.x264-group -: title: Show Name - season: 1 - episode: 2 - episode_title: Nice Title - screen_size: 720p - streaming_service: Spike TV - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: group - type: episode - -# Streaming service: IFC -? Show.Name.S01E02.Nice.Title.720p.IFC.WEBRip.AAC2.0.x264-group -: title: Show Name - season: 1 - episode: 2 - episode_title: Nice Title - screen_size: 720p - streaming_service: IFC - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: group - type: episode - -# Streaming service: NATG -? Show.Name.S01E02.Nice.Title.720p.NATG.WEBRip.AAC2.0.x264-group -? Show.Name.S01E02.Nice.Title.720p.NationalGeographic.WEBRip.AAC2.0.x264-group -: title: Show Name - season: 1 - episode: 2 - episode_title: Nice Title - screen_size: 720p - streaming_service: National Geographic - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: group - type: episode - -# Streaming service: NFL -? Show.Name.S01E02.Nice.Title.720p.NFL.WEBRip.AAC2.0.x264-group -: title: Show Name - season: 1 - episode: 2 - episode_title: Nice Title - screen_size: 720p - streaming_service: NFL - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: group - type: episode - -# Streaming service: UFC -? Show.Name.S01E02.Nice.Title.720p.UFC.WEBRip.AAC2.0.x264-group -: title: Show Name - season: 1 - episode: 2 - episode_title: Nice Title - screen_size: 720p - streaming_service: UFC - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: group - type: episode - -# Streaming service: TV Land -? Show.Name.S01E02.Nice.Title.720p.TVL.WEBRip.AAC2.0.x264-group -? Show.Name.S01E02.Nice.Title.720p.TVLand.WEBRip.AAC2.0.x264-group -? Show.Name.S01E02.Nice.Title.720p.TV Land.WEBRip.AAC2.0.x264-group -: title: Show Name - season: 1 - episode: 2 - episode_title: Nice Title - screen_size: 720p - streaming_service: TV Land - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: group - type: episode - -# Streaming service: Crunchy Roll -? Show.Name.S01.1080p.CR.WEBRip.AAC.2.0.x264-monkee -: title: Show Name - season: 1 - screen_size: 1080p - streaming_service: Crunchy Roll - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: Disney -? Show.Name.S01.1080p.DSNY.WEBRip.AAC.2.0.x264-monkee -? Show.Name.S01.1080p.Disney.WEBRip.AAC.2.0.x264-monkee -: title: Show Name - season: 1 - screen_size: 1080p - streaming_service: Disney - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: Nickelodeon -? Show.Name.S01.1080p.NICK.WEBRip.AAC.2.0.x264-monkee -? Show.Name.S01.1080p.Nickelodeon.WEBRip.AAC.2.0.x264-monkee -: title: Show Name - season: 1 - screen_size: 1080p - streaming_service: Nickelodeon - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: TFou -? Show.Name.S01.1080p.TFOU.WEBRip.AAC.2.0.x264-monkee -? Show.Name.S01.1080p.TFou.WEBRip.AAC.2.0.x264-monkee -: title: Show Name - season: 1 - screen_size: 1080p - streaming_service: TFou - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: monkee - type: episode - -# Streaming service: DIY Network -? Show.Name.S01.720p.DIY.WEBRip.AAC2.0.H.264-BTN -: title: Show Name - season: 1 - screen_size: 720p - streaming_service: DIY Network - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: BTN - type: episode - -# Streaming service: USA Network -? Show.Name.S01E02.Exfil.1080p.USAN.WEBRip.AAC2.0.x264-AJP69 -: title: Show Name - season: 1 - episode: 2 - screen_size: 1080p - streaming_service: USA Network - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: AJP69 - type: episode - -# Streaming service: TV3 Ireland -? Show.Name.S01E08.576p.TV3.WEBRip.AAC2.0.x264-HARiKEN -: title: Show Name - season: 1 - episode: 8 - screen_size: 576p - streaming_service: TV3 Ireland - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: HARiKEN - type: episode - -# Streaming service: TV4 Sweeden -? Show.Name.S05.720p.TV4.WEBRip.AAC2.0.H.264-BTW -: title: Show Name - season: 5 - screen_size: 720p - streaming_service: TV4 Sweeden - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: BTW - type: episode - -# Streaming service: TLC -? Show.Name.S02.720p.TLC.WEBRip.AAC2.0.x264-BTW -: title: Show Name - season: 2 - screen_size: 720p - streaming_service: TLC - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: BTW - type: episode - -# Streaming service: Investigation Discovery -? Show.Name.S01E01.720p.ID.WEBRip.AAC2.0.x264-BTW -: title: Show Name - season: 1 - episode: 1 - screen_size: 720p - streaming_service: Investigation Discovery - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: BTW - type: episode - -# Streaming service: RTÉ One -? Show.Name.S10E01.576p.RTE.WEBRip.AAC2.0.H.264-RTN -: title: Show Name - season: 10 - episode: 1 - screen_size: 576p - streaming_service: RTÉ One - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: RTN - type: episode - -# Streaming service: AMC -? Show.Name.S01E01.1080p.AMC.WEBRip.H.264.AAC2.0-CasStudio -: title: Show Name - season: 1 - episode: 1 - screen_size: 1080p - streaming_service: AMC - source: Web - other: Rip - audio_codec: AAC - audio_channels: '2.0' - video_codec: H.264 - release_group: CasStudio - type: episode - -? Suits.S07E01.1080p.iT.WEB-DL.DD5.1.H.264-VLAD.mkv -? Suits.S07E01.1080p.iTunes.WEB-DL.DD5.1.H.264-VLAD.mkv -: title: Suits - season: 7 - episode: 1 - screen_size: 1080p - source: Web - streaming_service: iTunes - audio_codec: Dolby Digital - audio_channels: '5.1' - video_codec: H.264 - release_group: VLAD - container: mkv - type: episode - -? UpFront.S01.720p.AJAZ.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTW - screen_size: 720p - season: 1 - source: Web - streaming_service: Al Jazeera English - title: UpFront - type: episode - video_codec: H.264 - -? Smack.The.Pony.S01.4OD.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTW - season: 1 - source: Web - streaming_service: Channel 4 - title: Smack The Pony - type: episode - video_codec: H.264 - -? The.Toy.Box.S01E01.720p.AMBC.WEBRip.AAC2.0.x264-BTN -: audio_channels: '2.0' - audio_codec: AAC - episode: 1 - other: Rip - release_group: BTN - screen_size: 720p - season: 1 - source: Web - streaming_service: ABC - title: The Toy Box - type: episode - video_codec: H.264 - -? Gundam.Reconguista.in.G.S01.720p.ANLB.WEBRip.AAC2.0.x264-HorribleSubs -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: HorribleSubs - screen_size: 720p - season: 1 - source: Web - streaming_service: AnimeLab - title: Gundam Reconguista in G - type: episode - video_codec: H.264 - -? Animal.Nation.with.Anthony.Anderson.S01E01.1080p.ANPL.WEBRip.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - episode: 1 - other: Rip - release_group: RTN - screen_size: 1080p - season: 1 - source: Web - streaming_service: Animal Planet - title: Animal Nation with Anthony Anderson - type: episode - video_codec: H.264 - -? Park.Bench.S01.1080p.AOL.WEBRip.AAC2.0.H.264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTW - screen_size: 1080p - season: 1 - source: Web - streaming_service: AOL - title: Park Bench - type: episode - video_codec: H.264 - -? Crime.Scene.Cleaner.S05.720p.ARD.WEBRip.AAC2.0.H.264-BTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTN - screen_size: 720p - season: 5 - source: Web - streaming_service: ARD - title: Crime Scene Cleaner - type: episode - video_codec: H.264 - -? Decker.S03.720p.AS.WEB-DL.AAC2.0.H.264-RTN -: audio_channels: '2.0' - audio_codec: AAC - release_group: RTN - screen_size: 720p - season: 3 - source: Web - streaming_service: Adult Swim - title: Decker - type: episode - video_codec: H.264 - -? Southern.Charm.Savannah.S01E04.Hurricane.On.The.Horizon.1080p.BRAV.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - episode: 4 - episode_title: Hurricane On The Horizon - other: Rip - release_group: BTW - screen_size: 1080p - season: 1 - source: Web - streaming_service: BravoTV - title: Southern Charm Savannah - type: episode - video_codec: H.264 - -? Four.in.the.Morning.S01E01.Pig.RERip.720p.CBC.WEBRip.AAC2.0.H.264-RTN -: audio_channels: '2.0' - audio_codec: AAC - episode: 1 - episode_title: Pig - other: - - Proper - - Rip - proper_count: 1 - release_group: RTN - screen_size: 720p - season: 1 - source: Web - streaming_service: CBC - title: Four in the Morning - type: episode - video_codec: H.264 - -? Rio.Olympics.2016.08.07.Mens.Football.Group.C.Germany.vs.South.Korea.720p.CBC.WEBRip.AAC2.0.H.264-BTW -: audio_channels: '2.0' - audio_codec: AAC - date: 2016-08-07 - episode_title: Mens Football Group C Germany vs South Korea - other: Rip - release_group: BTW - screen_size: 720p - source: Web - streaming_service: CBC - title: Rio Olympics - type: episode - video_codec: H.264 - -? Comedians.In.Cars.Getting.Coffee.S01.720p.CCGC.WEBRip.AAC2.0.x264-monkee -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: monkee - screen_size: 720p - season: 1 - source: Web - streaming_service: Comedians in Cars Getting Coffee - title: Comedians In Cars Getting Coffee - type: episode - video_codec: H.264 - -? Life.on.Top.S02.720p.CMAX.WEBRip.AAC2.0.x264-CMAX -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: CMAX - screen_size: 720p - season: 2 - source: Web - streaming_service: Cinemax - title: Life on Top - type: episode - video_codec: H.264 - -? Sun.Records.S01.720p.CMT.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTW - screen_size: 720p - season: 1 - source: Web - streaming_service: Country Music Television - title: Sun Records - type: episode - video_codec: H.264 - -? Infinity.Train.S01E00.Pilot.REPACK.720p.CN.WEBRip.AAC2.0.H.264-monkee -: audio_channels: '2.0' - audio_codec: AAC - episode: 0 - episode_details: Pilot - episode_title: Pilot - language: zh - other: - - Proper - - Rip - proper_count: 1 - release_group: monkee - screen_size: 720p - season: 1 - source: Web - streaming_service: Cartoon Network - title: Infinity Train - type: episode - video_codec: H.264 - -? Jay.Lenos.Garage.2015.S03E02.1080p.CNBC.WEB-DL.x264-TOPKEK -: episode: 2 - release_group: TOPKEK - screen_size: 1080p - season: 3 - source: Web - streaming_service: CNBC - title: Jay Lenos Garage - type: episode - video_codec: H.264 - year: 2015 - -? US.Presidential.Debates.2015.10.28.Third.Republican.Debate.720p.CNBC.WEBRip.AAC2.0.H.264-monkee -: audio_channels: '2.0' - audio_codec: AAC - country: US - date: 2015-10-28 - episode_title: Third Republican Debate - other: Rip - release_group: monkee - screen_size: 720p - source: Web - streaming_service: CNBC - title: Presidential Debates - type: episode - video_codec: H.264 - -? What.The.Fuck.France.S01E01.Le.doublage.CNLP.WEBRip.AAC2.0.x264-TURTLE -: audio_channels: '2.0' - audio_codec: AAC - country: FR - episode: 1 - episode_title: Le doublage - other: Rip - release_group: TURTLE - season: 1 - source: Web - streaming_service: Canal+ - title: What The Fuck - type: episode - video_codec: H.264 - -? SuperMansion.S02.720p.CRKL.WEBRip.AAC2.0.x264-VLAD -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: VLAD - screen_size: 720p - season: 2 - source: Web - streaming_service: Crackle - title: SuperMansion - type: episode - video_codec: H.264 - -? Chosen.S02.1080p.CRKL.WEBRip.AAC2.0.x264-AJP69 -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: AJP69 - screen_size: 1080p - season: 2 - source: Web - streaming_service: Crackle - title: Chosen - type: episode - video_codec: H.264 - -? Chosen.S03.1080p.CRKL.WEBRip.AAC2.0.x264-AJP69 -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: AJP69 - screen_size: 1080p - season: 3 - source: Web - streaming_service: Crackle - title: Chosen - type: episode - video_codec: H.264 - -? Snatch.S01.1080p.CRKL.WEBRip.AAC2.0.x264-DEFLATE -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: DEFLATE - screen_size: 1080p - season: 1 - source: Web - streaming_service: Crackle - title: Snatch - type: episode - video_codec: H.264 - -? White.House.Correspondents.Dinner.2015.Complete.CSPN.WEBRip.AAC2.0.H.264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: - - Complete - - Rip - release_group: BTW - source: Web - streaming_service: CSpan - title: White House Correspondents Dinner - type: movie - video_codec: H.264 - year: 2015 - -? The.Amazing.Race.Canada.S03.720p.CTV.WEBRip.AAC2.0.H.264-BTW -: audio_channels: '2.0' - audio_codec: AAC - country: CA - other: Rip - release_group: BTW - screen_size: 720p - season: 3 - source: Web - streaming_service: CTV - title: The Amazing Race - type: episode - video_codec: H.264 - -? Miniverse.S01E01.Explore.the.Solar.System.2160p.CUR.WEB-DL.DDP2.0.x264-monkee -: audio_channels: '2.0' - audio_codec: Dolby Digital Plus - episode: 1 - episode_title: Explore the Solar System - release_group: monkee - screen_size: 2160p - season: 1 - source: Web - streaming_service: CuriosityStream - title: Miniverse - type: episode - video_codec: H.264 - -? Vixen.S02.720p.CWS.WEBRip.AAC2.0.x264-BMF -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BMF - screen_size: 720p - season: 2 - source: Web - streaming_service: CWSeed - title: Vixen - type: episode - video_codec: H.264 - -? Abidin.Dino.DDY.WEBRip.AAC2.0.H.264-BTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTN - source: Web - streaming_service: Digiturk Diledigin Yerde - title: Abidin Dino - type: movie - video_codec: H.264 - -? Fast.N.Loud.S08.1080p.DISC.WEBRip.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: RTN - screen_size: 1080p - season: 8 - source: Web - streaming_service: Discovery - title: Fast N Loud - type: episode - video_codec: H.264 - -? Bake.Off.Italia.S04.1080p.DPLY.WEBRip.AAC2.0.x264-Threshold -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: Threshold - screen_size: 1080p - season: 4 - source: Web - streaming_service: DPlay - title: Bake Off Italia - type: episode - video_codec: H.264 - -? Long.Riders.S01.DSKI.WEBRip.AAC2.0.x264-HorribleSubs -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: HorribleSubs - season: 1 - source: Web - streaming_service: Daisuki - title: Long Riders - type: episode - video_codec: H.264 - -? Milo.Murphys.Law.S01.720p.DSNY.WEB-DL.AAC2.0.x264-TVSmash -: audio_channels: '2.0' - audio_codec: AAC - release_group: TVSmash - screen_size: 720p - season: 1 - source: Web - streaming_service: Disney - title: Milo Murphys Law - type: episode - video_codec: H.264 - -? 30.for.30.S03E15.Doc.and.Darryl.720p.ESPN.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - episode: 15 - episode_title: Doc and Darryl - other: Rip - release_group: BTW - screen_size: 720p - season: 3 - source: Web - streaming_service: ESPN - title: 30 for 30 - type: episode - video_codec: H.264 - -? Boundless.S03.720p.ESQ.WEBRip.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: RTN - screen_size: 720p - season: 3 - source: Web - streaming_service: Esquire - title: Boundless - type: episode - video_codec: H.264 - -? Periodismo.Para.Todos.S2016E01.720p.ETTV.WEBRip.AAC2.0.H.264-braggart74 -: audio_channels: '2.0' - audio_codec: AAC - episode: 1 - other: Rip - release_group: braggart74 - screen_size: 720p - season: 2016 - source: Web - streaming_service: El Trece - title: Periodismo Para Todos - type: episode - video_codec: H.264 - year: 2016 - -? Just.Jillian.S01E01.1080p.ETV.WEBRip.AAC2.0.x264-GoApe -: audio_channels: '2.0' - audio_codec: AAC - episode: 1 - other: Rip - release_group: GoApe - screen_size: 1080p - season: 1 - source: Web - streaming_service: E! - title: Just Jillian - type: episode - video_codec: H.264 - -? New.Money.S01.1080p.ETV.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTW - screen_size: 1080p - season: 1 - source: Web - streaming_service: E! - title: New Money - type: episode - video_codec: H.264 - -? Gaming.Show.In.My.Parents.Garage.S02E01.The.Power.Up1000.FAM.WEBRip.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - episode: 1 - episode_title: The Power Up1000 - other: Rip - release_group: RTN - season: 2 - source: Web - streaming_service: Family - title: Gaming Show In My Parents Garage - type: episode - video_codec: H.264 - -? Little.People.2016.S01E03.Proud.to.Be.You.and.Me.720p.FJR.WEBRip.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - episode: 3 - episode_title: Proud to Be You and Me - other: Rip - release_group: RTN - screen_size: 720p - season: 1 - source: Web - streaming_service: Family Jr - title: Little People - type: episode - video_codec: H.264 - year: 2016 - -? The.Pioneer.Woman.S00E08.Summer.Summer.Summer.720p.FOOD.WEB-DL.AAC2.0.x264-AJP69 -: audio_channels: '2.0' - audio_codec: AAC - episode: 8 - episode_title: Summer Summer Summer - release_group: AJP69 - screen_size: 720p - season: 0 - source: Web - streaming_service: Food Network - title: The Pioneer Woman - type: episode - video_codec: H.264 - -? Prata.da.Casa.S01E01.720p.FOX.WEBRip.AAC2.0.H.264-BARRY -: audio_channels: '2.0' - audio_codec: AAC - episode: 1 - other: Rip - release_group: BARRY - screen_size: 720p - season: 1 - source: Web - streaming_service: Fox - title: Prata da Casa - type: episode - video_codec: H.264 - -? Grandfathered.S01.720p.FOX.WEBRip.AAC2.0.H.264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTW - screen_size: 720p - season: 1 - source: Web - streaming_service: Fox - title: Grandfathered - type: episode - video_codec: H.264 - -? Truth.and.Iliza.S01E01.FREE.WEBRip.AAC2.0.x264-BTN -: audio_channels: '2.0' - audio_codec: AAC - episode: 1 - other: Rip - release_group: BTN - season: 1 - source: Web - streaming_service: Freeform - title: Truth and Iliza - type: episode - video_codec: H.264 - -? Seven.Year.Switch.S01.720p.FYI.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTW - screen_size: 720p - season: 1 - source: Web - streaming_service: FYI Network - title: Seven Year Switch - type: episode - video_codec: H.264 - -? NHL.2015.10.09.Leafs.vs.Red.Wings.Condensed.Game.720p.Away.Feed.GC.WEBRip.AAC2.0.H.264-BTW -: audio_channels: '2.0' - audio_codec: AAC - date: 2015-10-09 - episode_title: Leafs vs Red Wings Condensed Game - other: Rip - release_group: BTW - screen_size: 720p - source: Web - streaming_service: NHL GameCenter - title: NHL - type: episode - video_codec: H.264 - -? NHL.2016.01.26.Maple.Leafs.vs.Panthers.720p.Home.Feed.GC.WEBRip.AAC2.0.H.264-BTW -: audio_channels: '2.0' - audio_codec: AAC - date: 2016-01-26 - episode_title: Maple Leafs vs Panthers - other: Rip - release_group: BTW - screen_size: 720p - source: Web - streaming_service: NHL GameCenter - title: NHL - type: episode - video_codec: H.264 - -? Big.Brother.Canada.S05.GLBL.WEBRip.AAC2.0.H.264-RTN -: audio_channels: '2.0' - audio_codec: AAC - country: CA - other: Rip - release_group: RTN - season: 5 - source: Web - streaming_service: Global - title: Big Brother - type: episode - video_codec: H.264 - -? Pornolandia.S01.720p.GLOB.WEBRip.AAC2.0.x264-GeneX -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: GeneX - screen_size: 720p - season: 1 - source: Web - streaming_service: GloboSat Play - title: Pornolandia - type: episode - video_codec: H.264 - -? Transando.com.Laerte.S01.720p.GLOB.WEBRip.AAC2.0.x264-GeneX -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: GeneX - screen_size: 720p - season: 1 - source: Web - streaming_service: GloboSat Play - title: Transando com Laerte - type: episode - video_codec: H.264 - -? Flip.or.Flop.S01.720p.HGTV.WEBRip.AAC2.0.H.264-AJP69 -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: AJP69 - screen_size: 720p - season: 1 - source: Web - streaming_service: HGTV - title: Flip or Flop - type: episode - video_codec: H.264 - -? Kitten.Bowl.2014.720p.HLMK.WEBRip.AAC2.0.x264-monkee -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: monkee - screen_size: 720p - source: Web - streaming_service: Hallmark - title: Kitten Bowl - type: movie - video_codec: H.264 - year: 2014 - -? Still.Star-Crossed.S01E05.720p.HULU.WEB-DL.AAC2.0.H.264-VLAD -: audio_channels: '2.0' - audio_codec: AAC - episode: 5 - release_group: VLAD - screen_size: 720p - season: 1 - source: Web - streaming_service: Hulu - title: Still Star-Crossed - type: episode - video_codec: H.264 - -? EastEnders.2017.07.17.720p.iP.WEB-DL.AAC2.0.H.264-BTN -: audio_channels: '2.0' - audio_codec: AAC - date: 2017-07-17 - release_group: BTN - screen_size: 720p - source: Web - streaming_service: BBC iPlayer - title: EastEnders - type: episode - video_codec: H.264 - -? Handmade.in.Japan.S01E01.720p.iP.WEBRip.AAC2.0.H.264-SUP -: audio_channels: '2.0' - audio_codec: AAC - country: JP - episode: 1 - other: Rip - release_group: SUP - screen_size: 720p - season: 1 - source: Web - streaming_service: BBC iPlayer - title: Handmade in - type: episode - video_codec: H.264 - -? The.Chillenden.Murders.S01.720p.iP.WEBRip.AAC2.0.H.264-HAX -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: HAX - screen_size: 720p - season: 1 - source: Web - streaming_service: BBC iPlayer - title: The Chillenden Murders - type: episode - video_codec: H.264 - -? The.Street.S01.ITV.WEB-DL.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - release_group: RTN - season: 1 - source: Web - streaming_service: ITV - title: The Street - type: episode - video_codec: H.264 - -? Hope.for.Wildlife.S04.1080p.KNOW.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTW - screen_size: 1080p - season: 4 - source: Web - streaming_service: Knowledge Network - title: Hope for Wildlife - type: episode - video_codec: H.264 - -? Kim.of.Queens.S02.720p.LIFE.WEBRip.AAC2.0.H.264-RTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: RTN - screen_size: 720p - season: 2 - source: Web - streaming_service: Lifetime - title: Kim of Queens - type: episode - video_codec: H.264 - -? The.Rachel.Maddow.Show.2017.02.22.720p.MNBC.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - date: 2017-02-22 - other: Rip - release_group: BTW - screen_size: 720p - source: Web - streaming_service: MSNBC - title: The Rachel Maddow Show - type: episode - video_codec: H.264 - -? Ignition.S06E12.720p.MTOD.WEB-DL.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - episode: 12 - release_group: RTN - screen_size: 720p - season: 6 - source: Web - streaming_service: Motor Trend OnDemand - title: Ignition - type: episode - video_codec: H.264 - -? Teen.Mom.UK.S01E01.Life.as.a.Teen.Mum.1080p.MTV.WEB-DL.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - country: GB - episode: 1 - episode_title: Life as a Teen Mum - release_group: BTW - screen_size: 1080p - season: 1 - source: Web - streaming_service: MTV - title: Teen Mom - type: episode - video_codec: H.264 - -? Undrafted.S01.720p.NFLN.WEBRip.AAC2.0.H.264-TTYL -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: TTYL - screen_size: 720p - season: 1 - source: Web - streaming_service: NFL Now - title: Undrafted - type: episode - video_codec: H.264 - -? NFL.2016.08.25.PreSeason.Cowboys.vs.Seahawks.720p.NFL.WEBRip.AAC2.0.H.264-BTW -: audio_channels: '2.0' - audio_codec: AAC - date: 2016-08-25 - episode_title: PreSeason Cowboys vs Seahawks - other: Rip - release_group: BTW - screen_size: 720p - source: Web - streaming_service: NFL - title: NFL - type: episode - video_codec: H.264 - -? Bunsen.is.a.Beast.S01E23.Guinea.Some.Lovin.1080p.NICK.WEBRip.AAC2.0.x264-TVSmash -: audio_channels: '2.0' - audio_codec: AAC - country: GN - episode: 23 - episode_title: Some Lovin - other: Rip - release_group: TVSmash - screen_size: 1080p - season: 1 - source: Web - streaming_service: Nickelodeon - title: Bunsen is a Beast - type: episode - video_codec: H.264 - -? Valkyrie.S01.720p.NRK.WEBRip.AAC2.0.x264-BTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTN - screen_size: 720p - season: 1 - source: Web - streaming_service: Norsk Rikskringkasting - title: Valkyrie - type: episode - video_codec: H.264 - -? Food.Forward.S01.720p.PBS.WEBRip.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: RTN - screen_size: 720p - season: 1 - source: Web - streaming_service: PBS - title: Food Forward - type: episode - video_codec: H.264 - -? SciGirls.S01E01.Turtle.Mania.720p.PBSK.WEBRip.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - episode: 1 - episode_title: Turtle Mania - other: Rip - release_group: RTN - screen_size: 720p - season: 1 - source: Web - streaming_service: PBS Kids - title: SciGirls - type: episode - video_codec: H.264 - -? Powers.2015.S01.1080p.PSN.WEBRip.DD5.1.x264-NTb -: audio_channels: '5.1' - audio_codec: Dolby Digital - other: Rip - release_group: NTb - screen_size: 1080p - season: 1 - source: Web - streaming_service: Playstation Network - title: Powers - type: episode - video_codec: H.264 - year: 2015 - -? Escape.The.Night.S02E02.The.Masquerade.Part.II.1080p.RED.WEBRip.AAC5.1.VP9-BTW -: audio_channels: '5.1' - audio_codec: AAC - episode: 2 - episode_title: The Masquerade - other: Rip - part: 2 - release_group: VP9-BTW - screen_size: 1080p - season: 2 - source: Web - streaming_service: YouTube Red - title: Escape The Night - type: episode - -? Escape.The.Night.S02E02.The.Masquerade.Part.II.2160p.RED.WEBRip.AAC5.1.VP9-BTW -: audio_channels: '5.1' - audio_codec: AAC - episode: 2 - episode_title: The Masquerade - other: Rip - part: 2 - release_group: VP9-BTW - screen_size: 2160p - season: 2 - source: Web - streaming_service: YouTube Red - title: Escape The Night - type: episode - -? Escape.The.Night.S02E02.The.Masquerade.Part.II.720p.RED.WEBRip.AAC5.1.VP9-BTW -: audio_channels: '5.1' - audio_codec: AAC - episode: 2 - episode_title: The Masquerade - other: Rip - part: 2 - release_group: VP9-BTW - screen_size: 720p - season: 2 - source: Web - streaming_service: YouTube Red - title: Escape The Night - type: episode - -? The.Family.Law.S02E01.720p.SBS.WEB-DL.AAC2.0.H.264-BTN -: audio_channels: '2.0' - audio_codec: AAC - episode: 1 - release_group: BTN - screen_size: 720p - season: 2 - source: Web - streaming_service: SBS (AU) - title: The Family Law - type: episode - video_codec: H.264 - -? Theres.No.Joy.In.Beachville.The.True.Story.of.Baseballs.Origin.720p.SNET.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTW - screen_size: 720p - source: Web - streaming_service: Sportsnet - title: Theres No Joy In Beachville The True Story of Baseballs Origin - type: movie - video_codec: H.264 - -? One.Night.Only.Alec.Baldwin.720p.SPIK.WEB-DL.AAC2.0.x264-NOGRP -: audio_channels: '2.0' - audio_codec: AAC - release_group: NOGRP - screen_size: 720p - source: Web - streaming_service: Spike - title: One Night Only Alec Baldwin - type: movie - video_codec: H.264 - -? Ink.Master.S08.720p.SPIK.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTW - screen_size: 720p - season: 8 - source: Web - streaming_service: Spike - title: Ink Master - type: episode - video_codec: H.264 - -? Jungle.Bunch.S01E01.Deep.Chasm.1080p.SPRT.WEBRip.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - episode: 1 - episode_title: Deep Chasm - other: Rip - release_group: RTN - screen_size: 1080p - season: 1 - source: Web - streaming_service: Sprout - title: Jungle Bunch - type: episode - video_codec: H.264 - -? Ash.vs.Evil.Dead.S01.720p.STZ.WEBRip.AAC2.0.x264-NTb -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: NTb - screen_size: 720p - season: 1 - source: Web - streaming_service: Starz - title: Ash vs Evil Dead - type: episode - video_codec: H.264 - -? WWE.Swerved.S01.720p.WWEN.WEBRip.AAC2.0.H.264-PPKORE -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: PPKORE - screen_size: 720p - season: 1 - source: Web - streaming_service: WWE Network - title: WWE Swerved - type: episode - video_codec: H.264 - -? Face.Off.S11.1080p.SYFY.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTW - screen_size: 1080p - season: 11 - source: Web - streaming_service: Syfy - title: Face Off - type: episode - video_codec: H.264 - -? Conan.2016.09.22.Jeff.Garlin.720p.TBS.WEBRip.AAC2.0.H.264-NOGRP -: audio_channels: '2.0' - audio_codec: AAC - date: 2016-09-22 - episode_title: Jeff Garlin - other: Rip - release_group: NOGRP - screen_size: 720p - source: Web - streaming_service: TBS - title: Conan - type: episode - video_codec: H.264 - -? Swans.Crossing.S01.TUBI.WEBRip.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: RTN - season: 1 - source: Web - streaming_service: TubiTV - title: Swans Crossing - type: episode - video_codec: H.264 - -? The.Joy.of.Techs.S01.UKTV.WEB-DL.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - release_group: RTN - season: 1 - source: Web - streaming_service: UKTV - title: The Joy of Techs - type: episode - video_codec: H.264 - -? Rock.Icons.S01.720p.VH1.WEB-DL.AAC2.0.H.264-RTN -: audio_channels: '2.0' - audio_codec: AAC - release_group: RTN - screen_size: 720p - season: 1 - source: Web - streaming_service: VH1 - title: Rock Icons - type: episode - video_codec: H.264 - -? Desus.and.Mero.S01E130.2017.07.18.1080p.VICE.WEB-DL.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - date: 2017-07-18 - episode: 130 - release_group: RTN - screen_size: 1080p - season: 1 - source: Web - streaming_service: Viceland - title: Desus and Mero - type: episode - video_codec: H.264 - -? Graveyard.Carz.S07.1080p.VLCT.WEBRip.AAC2.0.x264-RTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: RTN - screen_size: 1080p - season: 7 - source: Web - streaming_service: Velocity - title: Graveyard Carz - type: episode - video_codec: H.264 - -? Other.Space.S01E01.1080p.YHOO.WEBRip.AAC2.0.x264-BTW -: audio_channels: '2.0' - audio_codec: AAC - episode: 1 - other: Rip - release_group: BTW - screen_size: 1080p - season: 1 - source: Web - streaming_service: Yahoo - title: Other Space - type: episode - video_codec: H.264 - -? Americas.Test.Kitchen.S17.720p.ATK.WEB-DL.AAC2.0.x264-BTN -: audio_channels: '2.0' - audio_codec: AAC - release_group: BTN - screen_size: 720p - season: 17 - source: Web - streaming_service: America's Test Kitchen - title: Americas Test Kitchen - type: episode - video_codec: H.264 - -? Bushwhacked.Bugs.S01.AUBC.WEBRip.AAC2.0.H.264-DAWN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: DAWN - season: 1 - source: Web - streaming_service: ABC Australia - title: Bushwhacked Bugs - type: episode - video_codec: H.264 - -? VICE.S05E12.1080p.HBO.WEB-DL.AAC2.0.H.264-monkee -? VICE.S05E12.1080p.HBO-Go.WEB-DL.AAC2.0.H.264-monkee -? VICE.S05E12.1080p.HBOGo.WEB-DL.AAC2.0.H.264-monkee -: audio_channels: '2.0' - audio_codec: AAC - episode: 12 - release_group: monkee - screen_size: 1080p - season: 5 - source: Web - streaming_service: HBO Go - title: VICE - type: episode - video_codec: H.264 - -? Dix.Pour.Cent.S02.PLUZ.WEBRip.AAC2.0.H.264-TURTLE -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: TURTLE - season: 2 - source: Web - streaming_service: Pluzz - title: Dix Pour Cent - type: episode - video_codec: H.264 - -? Ulveson.och.Herngren.S01.720p.SVT.WEBRip.AAC2.0.H.264-BTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTN - screen_size: 720p - season: 1 - source: Web - streaming_service: Sveriges Television - title: Ulveson och Herngren - type: episode - video_codec: H.264 - -? Bravest.Warriors.S03.1080p.VRV.WEBRip.AAC2.0.x264-BTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTN - screen_size: 1080p - season: 3 - source: Web - streaming_service: VRV - title: Bravest Warriors - type: episode - video_codec: H.264 - -? The.Late.Night.Big.Breakfast.S02.WME.WEBRip.AAC2.0.x264-BTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTN - season: 2 - source: Web - streaming_service: WatchMe - title: The Late Night Big Breakfast - type: episode - video_codec: H.264 - -? Hockey.Wives.S02.WNET.WEBRip.AAC2.0.H.264-BTW -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTW - season: 2 - source: Web - streaming_service: W Network - title: Hockey Wives - type: episode - video_codec: H.264 - -? Sin.City.Saints.S01.1080p.YHOO.WEBRip.AAC2.0.x264-NTb -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: NTb - screen_size: 1080p - season: 1 - source: Web - streaming_service: Yahoo - title: Sin City Saints - type: episode - video_codec: H.264 - -? 555.S01.1080p.VMEO.WEBRip.AAC2.0.x264-BTN -: audio_channels: '2.0' - audio_codec: AAC - other: Rip - release_group: BTN - screen_size: 1080p - season: 1 - source: Web - streaming_service: Vimeo - title: '555' - type: episode - video_codec: H.264 - -# All this below shouldn't match any streaming services -? London.2012.Olympics.CTV.Preview.Show.HDTV.x264-2HD -: alternative_title: Olympics CTV Preview Show - release_group: 2HD - source: HDTV - title: London - type: movie - video_codec: H.264 - year: 2012 - -? UFC.on.FOX.24.1080p.HDTV.x264-VERUM -: episode: 24 - release_group: VERUM - screen_size: 1080p - source: HDTV - title: UFC on FOX - type: episode - video_codec: H.264 - -? ESPN.E.60.2016.10.04.HDTV.x264-LoTV -: date: 2016-10-04 - episode: 60 - release_group: LoTV - source: HDTV - title: ESPN E - type: episode - video_codec: H.264 - -? GTTV.E3.All.Access.Live.Day.1.Xbox.Showcase.Preshow.HDTV.x264-SYS -: episode: 3 - episode_title: All Access Live Day 1 Xbox Showcase Preshow - release_group: SYS - source: HDTV - title: GTTV - type: episode - video_codec: H.264 diff --git a/libs/guessit/test/test_api.py b/libs/guessit/test/test_api.py index 9abb84d9f..ca33df044 100644 --- a/libs/guessit/test/test_api.py +++ b/libs/guessit/test/test_api.py @@ -27,14 +27,6 @@ def test_forced_binary(): assert ret and 'title' in ret and isinstance(ret['title'], six.binary_type) [email protected]('sys.version_info < (3, 4)', reason="Path is not available") -def test_pathlike_object(): - from pathlib import Path - path = Path('Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv') - ret = guessit(path) - assert ret and 'title' in ret - - def test_unicode_japanese(): ret = guessit('[阿维达].Avida.2006.FRENCH.DVDRiP.XViD-PROD.avi') assert ret and 'title' in ret diff --git a/libs/guessit/test/test_api_unicode_literals.py b/libs/guessit/test/test_api_unicode_literals.py index 826f7cd16..3347a7d89 100644 --- a/libs/guessit/test/test_api_unicode_literals.py +++ b/libs/guessit/test/test_api_unicode_literals.py @@ -53,14 +53,6 @@ if six.PY2: """ -def test_ensure_standard_string_class(): - class CustomStr(str): - pass - - ret = guessit(CustomStr('1080p'), options={'advanced': True}) - assert ret and 'screen_size' in ret and not isinstance(ret['screen_size'].input_string, CustomStr) - - def test_properties(): props = properties() assert 'video_codec' in props.keys() diff --git a/libs/guessit/test/test_yml.py b/libs/guessit/test/test_yml.py index c86609392..31aed6736 100644 --- a/libs/guessit/test/test_yml.py +++ b/libs/guessit/test/test_yml.py @@ -136,7 +136,7 @@ class TestYml(object): Use $ marker to check inputs that should not match results. """ - options_re = re.compile(r'^([ +-]+)(.*)') + options_re = re.compile(r'^([ \+-]+)(.*)') files, ids = files_and_ids(filename_predicate) @@ -149,7 +149,7 @@ class TestYml(object): @pytest.mark.parametrize('filename', files, ids=ids) def test(self, filename, caplog): - caplog.set_level(logging.INFO) + caplog.setLevel(logging.INFO) with open(os.path.join(__location__, filename), 'r', encoding='utf-8') as infile: data = yaml.load(infile, OrderedDictYAMLLoader) entries = Results() @@ -274,10 +274,10 @@ class TestYml(object): if negates_key: entry.valid.append((expected_key, expected_value)) else: - entry.different.append((expected_key, expected_value, result[result_key])) + entry.different.append((expected_key, expected_value, result[expected_key])) else: if negates_key: - entry.different.append((expected_key, expected_value, result[result_key])) + entry.different.append((expected_key, expected_value, result[expected_key])) else: entry.valid.append((expected_key, expected_value)) elif not negates_key: diff --git a/libs/guessit/test/various.yml b/libs/guessit/test/various.yml index c95b8e6b3..15964457e 100644 --- a/libs/guessit/test/various.yml +++ b/libs/guessit/test/various.yml @@ -3,9 +3,9 @@ title: Fear and Loathing in Las Vegas year: 1998 screen_size: 720p - source: HD-DVD + format: HD-DVD audio_codec: DTS - video_codec: H.264 + video_codec: h264 release_group: ESiR ? Series/Duckman/Duckman - 101 (01) - 20021107 - I, Duckman.avi @@ -36,9 +36,8 @@ episode_format: Minisode episode: 1 episode_title: Good Cop Bad Cop - source: Web - other: Rip - video_codec: Xvid + format: WEBRip + video_codec: XviD ? Series/Kaamelott/Kaamelott - Livre V - Ep 23 - Le Forfait.avi : type: episode @@ -51,10 +50,10 @@ title: The Doors year: 1991 date: 2008-03-09 - source: Blu-ray + format: BluRay screen_size: 720p - audio_codec: Dolby Digital - video_codec: H.264 + audio_codec: AC3 + video_codec: h264 release_group: HiS@SiLUHD language: english website: sharethefiles.com @@ -64,15 +63,14 @@ title: MASH year: 1970 video_codec: DivX - source: DVD - other: [Dual Audio, Rip] + format: DVD ? the.mentalist.501.hdtv-lol.mp4 : type: episode title: the mentalist season: 5 episode: 1 - source: HDTV + format: HDTV release_group: lol ? the.simpsons.2401.hdtv-lol.mp4 @@ -80,7 +78,7 @@ title: the simpsons season: 24 episode: 1 - source: HDTV + format: HDTV release_group: lol ? Homeland.S02E01.HDTV.x264-EVOLVE.mp4 @@ -88,8 +86,8 @@ title: Homeland season: 2 episode: 1 - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: EVOLVE ? /media/Band_of_Brothers-e01-Currahee.mkv @@ -117,7 +115,7 @@ title: new girl season: 1 episode: 17 - source: HDTV + format: HDTV release_group: lol ? The.Office.(US).1x03.Health.Care.HDTV.XviD-LOL.avi @@ -127,8 +125,8 @@ season: 1 episode: 3 episode_title: Health Care - source: HDTV - video_codec: Xvid + format: HDTV + video_codec: XviD release_group: LOL ? The_Insider-(1999)-x02-60_Minutes_Interview-1996.mp4 @@ -156,18 +154,18 @@ season: 56 episode: 6 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 ? White.House.Down.2013.1080p.BluRay.DTS-HD.MA.5.1.x264-PublicHD.mkv : type: movie title: White House Down year: 2013 screen_size: 1080p - source: Blu-ray - audio_codec: DTS-HD - audio_profile: Master Audio - video_codec: H.264 + format: BluRay + audio_codec: DTS + audio_profile: HDMA + video_codec: h264 release_group: PublicHD audio_channels: "5.1" @@ -176,10 +174,10 @@ title: White House Down year: 2013 screen_size: 1080p - source: Blu-ray - audio_codec: DTS-HD - audio_profile: Master Audio - video_codec: H.264 + format: BluRay + audio_codec: DTS + audio_profile: HDMA + video_codec: h264 release_group: PublicHD audio_channels: "5.1" @@ -190,10 +188,10 @@ season: 1 episode: 1 screen_size: 720p - source: Web + format: WEB-DL audio_channels: "5.1" - video_codec: H.264 - audio_codec: Dolby Digital + video_codec: h264 + audio_codec: AC3 release_group: NTb ? Despicable.Me.2.2013.1080p.BluRay.x264-VeDeTT.nfo @@ -201,39 +199,37 @@ title: Despicable Me 2 year: 2013 screen_size: 1080p - source: Blu-ray - video_codec: H.264 + format: BluRay + video_codec: h264 release_group: VeDeTT ? Le Cinquieme Commando 1971 SUBFORCED FRENCH DVDRiP XViD AC3 Bandix.mkv : type: movie - audio_codec: Dolby Digital - source: DVD - other: Rip + audio_codec: AC3 + format: DVD release_group: Bandix subtitle_language: French title: Le Cinquieme Commando - video_codec: Xvid + video_codec: XviD year: 1971 ? Le Seigneur des Anneaux - La Communauté de l'Anneau - Version Longue - BDRip.mkv : type: movie + format: BluRay title: Le Seigneur des Anneaux - source: Blu-ray - other: Rip ? La petite bande (Michel Deville - 1983) VF PAL MP4 x264 AAC.mkv : type: movie audio_codec: AAC language: French title: La petite bande - video_codec: H.264 + video_codec: h264 year: 1983 other: PAL ? Retour de Flammes (Gregor Schnitzler 2003) FULL DVD.iso : type: movie - source: DVD + format: DVD title: Retour de Flammes type: movie year: 2003 @@ -254,16 +250,16 @@ : type: movie year: 2014 title: A Common Title - edition: Special + edition: Special Edition ? Downton.Abbey.2013.Christmas.Special.HDTV.x264-FoV.mp4 : type: episode year: 2013 title: Downton Abbey episode_title: Christmas Special - video_codec: H.264 + video_codec: h264 release_group: FoV - source: HDTV + format: HDTV episode_details: Special ? Doctor_Who_2013_Christmas_Special.The_Time_of_The_Doctor.HD @@ -284,10 +280,10 @@ ? Robot Chicken S06-Born Again Virgin Christmas Special HDTV x264.avi : type: episode title: Robot Chicken - source: HDTV + format: HDTV season: 6 episode_title: Born Again Virgin Christmas Special - video_codec: H.264 + video_codec: h264 episode_details: Special ? Wicked.Tuna.S03E00.Head.To.Tail.Special.HDTV.x264-YesTV @@ -297,14 +293,14 @@ release_group: YesTV season: 3 episode: 0 - video_codec: H.264 - source: HDTV + video_codec: h264 + format: HDTV episode_details: Special ? The.Voice.UK.S03E12.HDTV.x264-C4TV : episode: 12 - video_codec: H.264 - source: HDTV + video_codec: h264 + format: HDTV title: The Voice release_group: C4TV season: 3 @@ -321,21 +317,21 @@ ? FlexGet.S01E02.TheName.HDTV.xvid : episode: 2 - source: HDTV + format: HDTV season: 1 title: FlexGet episode_title: TheName type: episode - video_codec: Xvid + video_codec: XviD ? FlexGet.S01E02.TheName.HDTV.xvid : episode: 2 - source: HDTV + format: HDTV season: 1 title: FlexGet episode_title: TheName type: episode - video_codec: Xvid + video_codec: XviD ? some.series.S03E14.Title.Here.720p : episode: 14 @@ -366,7 +362,7 @@ ? Something.Season.2.1of4.Ep.Title.HDTV.torrent : episode_count: 4 episode: 1 - source: HDTV + format: HDTV season: 2 title: Something episode_title: Title @@ -376,7 +372,7 @@ ? Show-A (US) - Episode Title S02E09 hdtv : country: US episode: 9 - source: HDTV + format: HDTV season: 2 title: Show-A type: episode @@ -406,25 +402,23 @@ type: movie ? Movies/El Bosque Animado (1987)/El.Bosque.Animado.[Jose.Luis.Cuerda.1987].[Xvid-Dvdrip-720 * 432].avi -: source: DVD - other: Rip +: format: DVD screen_size: 720x432 title: El Bosque Animado - video_codec: Xvid + video_codec: XviD year: 1987 type: movie ? Movies/El Bosque Animado (1987)/El.Bosque.Animado.[Jose.Luis.Cuerda.1987].[Xvid-Dvdrip-720x432].avi -: source: DVD - other: Rip +: format: DVD screen_size: 720x432 title: El Bosque Animado - video_codec: Xvid + video_codec: XviD year: 1987 type: movie ? 2009.shoot.fruit.chan.multi.dvd9.pal -: source: DVD +: format: DVD language: mul other: PAL title: shoot fruit chan @@ -432,7 +426,7 @@ year: 2009 ? 2009.shoot.fruit.chan.multi.dvd5.pal -: source: DVD +: format: DVD language: mul other: PAL title: shoot fruit chan @@ -441,25 +435,25 @@ ? The.Flash.2014.S01E01.PREAIR.WEBRip.XviD-EVO.avi : episode: 1 - source: Web - other: [Preair, Rip] + format: WEBRip + other: Preair release_group: EVO season: 1 title: The Flash type: episode - video_codec: Xvid + video_codec: XviD year: 2014 ? Ice.Lake.Rebels.S01E06.Ice.Lake.Games.720p.HDTV.x264-DHD : episode: 6 - source: HDTV + format: HDTV release_group: DHD screen_size: 720p season: 1 title: Ice Lake Rebels episode_title: Ice Lake Games type: episode - video_codec: H.264 + video_codec: h264 ? The League - S06E10 - Epi Sexy.mkv : episode: 10 @@ -469,23 +463,23 @@ type: episode ? Stay (2005) [1080p]/Stay.2005.1080p.BluRay.x264.YIFY.mp4 -: source: Blu-ray +: format: BluRay release_group: YIFY screen_size: 1080p title: Stay type: movie - video_codec: H.264 + video_codec: h264 year: 2005 ? /media/live/A/Anger.Management.S02E82.720p.HDTV.X264-DIMENSION.mkv -: source: HDTV +: format: HDTV release_group: DIMENSION screen_size: 720p title: Anger Management type: episode season: 2 episode: 82 - video_codec: H.264 + video_codec: h264 ? "[Figmentos] Monster 34 - At the End of Darkness [781219F1].mkv" : type: episode @@ -498,7 +492,7 @@ ? Game.of.Thrones.S05E07.720p.HDTV-KILLERS.mkv : type: episode episode: 7 - source: HDTV + format: HDTV release_group: KILLERS screen_size: 720p season: 5 @@ -507,7 +501,7 @@ ? Game.of.Thrones.S05E07.HDTV.720p-KILLERS.mkv : type: episode episode: 7 - source: HDTV + format: HDTV release_group: KILLERS screen_size: 720p season: 5 @@ -525,8 +519,8 @@ title: Star Trek Into Darkness year: 2013 screen_size: 720p - source: Web - video_codec: H.264 + format: WEB-DL + video_codec: h264 release_group: publichd ? /var/medias/series/The Originals/Season 02/The.Originals.S02E15.720p.HDTV.X264-DIMENSION.mkv @@ -535,8 +529,8 @@ season: 2 episode: 15 screen_size: 720p - source: HDTV - video_codec: H.264 + format: HDTV + video_codec: h264 release_group: DIMENSION ? Test.S01E01E07-FooBar-Group.avi @@ -545,211 +539,202 @@ - 1 - 7 episode_title: FooBar-Group # Make sure it doesn't conflict with uuid + mimetype: video/x-msvideo season: 1 title: Test type: episode ? TEST.S01E02.2160p.NF.WEBRip.x264.DD5.1-ABC : audio_channels: '5.1' - audio_codec: Dolby Digital + audio_codec: AC3 episode: 2 - source: Web - other: Rip + format: WEBRip release_group: ABC - screen_size: 2160p + screen_size: 4K season: 1 streaming_service: Netflix title: TEST type: episode - video_codec: H.264 + video_codec: h264 ? TEST.2015.12.30.720p.WEBRip.h264-ABC : date: 2015-12-30 - source: Web - other: Rip + format: WEBRip release_group: ABC screen_size: 720p title: TEST type: episode - video_codec: H.264 + video_codec: h264 ? TEST.S01E10.24.1080p.NF.WEBRip.AAC2.0.x264-ABC : audio_channels: '2.0' audio_codec: AAC episode: 10 episode_title: '24' - source: Web - other: Rip + format: WEBRip release_group: ABC screen_size: 1080p season: 1 streaming_service: Netflix title: TEST type: episode - video_codec: H.264 + video_codec: h264 ? TEST.S01E10.24.1080p.NF.WEBRip.AAC2.0.x264-ABC : audio_channels: '2.0' audio_codec: AAC episode: 10 episode_title: '24' - source: Web - other: Rip + format: WEBRip release_group: ABC screen_size: 1080p season: 1 streaming_service: Netflix title: TEST type: episode - video_codec: H.264 + video_codec: h264 ? TEST.S01E10.24.1080p.NF.WEBRip.AAC.2.0.x264-ABC : audio_channels: '2.0' audio_codec: AAC episode: 10 episode_title: '24' - source: Web - other: Rip + format: WEBRip release_group: ABC screen_size: 1080p season: 1 streaming_service: Netflix title: TEST type: episode - video_codec: H.264 + video_codec: h264 ? TEST.S05E02.720p.iP.WEBRip.AAC2.0.H264-ABC : audio_channels: '2.0' audio_codec: AAC episode: 2 - source: Web - other: Rip + format: WEBRip release_group: ABC screen_size: 720p season: 5 title: TEST type: episode - video_codec: H.264 + video_codec: h264 ? TEST.S03E07.720p.WEBRip.AAC2.0.x264-ABC : audio_channels: '2.0' audio_codec: AAC episode: 7 - source: Web - other: Rip + format: WEBRip release_group: ABC screen_size: 720p season: 3 title: TEST type: episode - video_codec: H.264 + video_codec: h264 ? TEST.S15E15.24.1080p.FREE.WEBRip.AAC2.0.x264-ABC : audio_channels: '2.0' audio_codec: AAC episode: 15 episode_title: '24' - source: Web - other: Rip + format: WEBRip release_group: ABC screen_size: 1080p season: 15 title: TEST type: episode - video_codec: H.264 + video_codec: h264 ? TEST.S11E11.24.720p.ETV.WEBRip.AAC2.0.x264-ABC : audio_channels: '2.0' audio_codec: AAC episode: 11 episode_title: '24' - source: Web - other: Rip + format: WEBRip release_group: ABC screen_size: 720p season: 11 title: TEST type: episode - video_codec: H.264 + video_codec: h264 ? TEST.2015.1080p.HC.WEBRip.x264.AAC2.0-ABC : audio_channels: '2.0' audio_codec: AAC - source: Web - other: Rip + format: WEBRip release_group: ABC screen_size: 1080p title: TEST type: movie - video_codec: H.264 + video_codec: h264 year: 2015 ? TEST.2015.1080p.3D.BluRay.Half-SBS.x264.DTS-HD.MA.7.1-ABC : audio_channels: '7.1' - audio_codec: DTS-HD - audio_profile: Master Audio - source: Blu-ray + audio_codec: DTS + audio_profile: HDMA + format: BluRay other: 3D release_group: ABC screen_size: 1080p title: TEST type: movie - video_codec: H.264 + video_codec: h264 year: 2015 ? TEST.2015.1080p.3D.BluRay.Half-OU.x264.DTS-HD.MA.7.1-ABC : audio_channels: '7.1' - audio_codec: DTS-HD - audio_profile: Master Audio - source: Blu-ray + audio_codec: DTS + audio_profile: HDMA + format: BluRay other: 3D release_group: ABC screen_size: 1080p title: TEST type: movie - video_codec: H.264 + video_codec: h264 year: 2015 ? TEST.2015.1080p.3D.BluRay.Half-OU.x264.DTS-HD.MA.TrueHD.7.1.Atmos-ABC : audio_channels: '7.1' audio_codec: - - DTS-HD - - Dolby TrueHD - - Dolby Atmos - audio_profile: Master Audio - source: Blu-ray + - DTS + - TrueHD + - DolbyAtmos + audio_profile: HDMA + format: BluRay other: 3D release_group: ABC screen_size: 1080p title: TEST type: movie - video_codec: H.264 + video_codec: h264 year: 2015 ? TEST.2015.1080p.3D.BluRay.Half-SBS.x264.DTS-HD.MA.TrueHD.7.1.Atmos-ABC : audio_channels: '7.1' audio_codec: - - DTS-HD - - Dolby TrueHD - - Dolby Atmos - audio_profile: Master Audio - source: Blu-ray + - DTS + - TrueHD + - DolbyAtmos + audio_profile: HDMA + format: BluRay other: 3D release_group: ABC screen_size: 1080p title: TEST type: movie - video_codec: H.264 + video_codec: h264 year: 2015 ? TEST.2015.1080p.BluRay.REMUX.AVC.DTS-HD.MA.TrueHD.7.1.Atmos-ABC : audio_channels: '7.1' audio_codec: - - DTS-HD - - Dolby TrueHD - - Dolby Atmos - audio_profile: Master Audio - source: Blu-ray + - DTS + - TrueHD + - DolbyAtmos + audio_profile: HDMA + format: BluRay other: Remux release_group: ABC screen_size: 1080p @@ -758,24 +743,23 @@ year: 2015 ? Gangs of New York 2002 REMASTERED 1080p BluRay x264-AVCHD -: source: Blu-ray +: format: BluRay edition: Remastered screen_size: 1080p title: Gangs of New York type: movie - video_codec: H.264 + video_codec: h264 year: 2002 ? Peep.Show.S06E02.DVDrip.x264-faks86.mkv : container: mkv episode: 2 - source: DVD - other: Rip + format: DVD release_group: faks86 season: 6 title: Peep Show type: episode - video_codec: H.264 + video_codec: h264 # Episode title is indeed 'October 8, 2014' # https://thetvdb.com/?tab=episode&seriesid=82483&seasonid=569935&id=4997362&lid=7 @@ -790,155 +774,28 @@ ? Red.Rock.S02E59.WEB-DLx264-JIVE : episode: 59 season: 2 - source: Web + format: WEB-DL release_group: JIVE title: Red Rock type: episode - video_codec: H.264 + video_codec: h264 ? Pawn.Stars.S12E31.Deals.On.Wheels.PDTVx264-JIVE : episode: 31 episode_title: Deals On Wheels season: 12 - source: Digital TV + format: DVB release_group: JIVE title: Pawn Stars type: episode - video_codec: H.264 + video_codec: h264 ? Duck.Dynasty.S09E09.Van.He-llsing.HDTVx264-JIVE : episode: 9 episode_title: Van He-llsing season: 9 - source: HDTV + format: HDTV release_group: JIVE title: Duck Dynasty type: episode - video_codec: H.264 - -? ATKExotics.16.01.24.Ava.Alba.Watersports.XXX.1080p.MP4-KTR -: title: ATKExotics - episode_title: Ava Alba Watersports - other: XXX - screen_size: 1080p - container: mp4 - release_group: KTR - type: episode - -? PutaLocura.15.12.22.Spanish.Luzzy.XXX.720p.MP4-oRo -: title: PutaLocura - episode_title: Spanish Luzzy - other: XXX - screen_size: 720p - container: mp4 - release_group: oRo - type: episode - -? French Maid Services - Lola At Your Service WEB-DL SPLIT SCENES MP4-RARBG -: title: French Maid Services - alternative_title: Lola At Your Service - source: Web - container: mp4 - release_group: RARBG - type: movie - -? French Maid Services - Lola At Your Service - Marc Dorcel WEB-DL SPLIT SCENES MP4-RARBG -: title: French Maid Services - alternative_title: [Lola At Your Service, Marc Dorcel] - source: Web - container: mp4 - release_group: RARBG - type: movie - -? PlayboyPlus.com_16.01.23.Eleni.Corfiate.Playboy.Romania.XXX.iMAGESET-OHRLY -: episode_title: Eleni Corfiate Playboy Romania - other: XXX - type: episode - -? TeenPornoPass - Anna - Beautiful Ass Deep Penetrated 720p mp4 -: title: TeenPornoPass - alternative_title: - - Anna - - Beautiful Ass Deep Penetrated - screen_size: 720p - container: mp4 - type: movie - -? SexInJeans.Gina.Gerson.Super.Nasty.Asshole.Pounding.With.Gina.In.Jeans.A.Devil.In.Denim.The.Finest.Ass.Fuck.Frolicking.mp4 -: title: SexInJeans Gina Gerson Super Nasty Asshole Pounding With Gina In Jeans A Devil In Denim The Finest Ass Fuck Frolicking - container: mp4 - type: movie - -? TNA Impact Wrestling HDTV 2017-06-22 720p H264 AVCHD-SC-SDH -: title: TNA Impact Wrestling - source: HDTV - date: 2017-06-22 - screen_size: 720p - video_codec: H.264 - release_group: SDH - type: episode - -? Katy Perry - Pepsi & Billboard Summer Beats Concert Series 2012 1080i HDTV 20 Mbps DD2.0 MPEG2-TrollHD.ts -: title: Katy Perry - alternative_title: Pepsi & Billboard Summer Beats Concert - year: 2012 - screen_size: 1080i - source: HDTV - video_bit_rate: 20Mbps - audio_codec: Dolby Digital - audio_channels: '2.0' - video_codec: MPEG-2 - release_group: TrollHD - container: ts - -? Justin Timberlake - MTV Video Music Awards 2013 1080i 32 Mbps DTS-HD 5.1.ts -: title: Justin Timberlake - alternative_title: MTV Video Music Awards - year: 2013 - screen_size: 1080i - video_bit_rate: 32Mbps - audio_codec: DTS-HD - audio_channels: '5.1' - container: ts - type: movie - -? Chuck Berry The Very Best Of Chuck Berry(2010)[320 Kbps] -: title: Chuck Berry The Very Best Of Chuck Berry - year: 2010 - audio_bit_rate: 320Kbps - type: movie - -? Title Name [480p][1.5Mbps][.mp4] -: title: Title Name - screen_size: 480p - video_bit_rate: 1.5Mbps - container: mp4 - type: movie - -? This.is.Us -: options: --no-embedded-config - title: This is Us - type: movie - -? This.is.Us -: options: --excludes country - title: This is Us - type: movie - -? MotoGP.2016x03.USA.Race.BTSportHD.1080p25 -: title: MotoGP - season: 2016 - year: 2016 - episode: 3 - screen_size: 1080p - frame_rate: 25fps - type: episode - -? BBC.Earth.South.Pacific.2010.D2.1080p.24p.BD25.DTS-HD -: title: BBC Earth South Pacific - year: 2010 - screen_size: 1080p - frame_rate: 24fps - source: Blu-ray - audio_codec: DTS-HD - type: movie + video_codec: h264
\ No newline at end of file diff --git a/libs/guessit/yamlutils.py b/libs/guessit/yamlutils.py index 01ac77781..2824575da 100644 --- a/libs/guessit/yamlutils.py +++ b/libs/guessit/yamlutils.py @@ -3,7 +3,6 @@ """ Options """ - try: from collections import OrderedDict except ImportError: # pragma: no-cover @@ -12,8 +11,6 @@ import babelfish import yaml -from .rules.common.quantity import BitRate, FrameRate, Size - class OrderedDictYAMLLoader(yaml.Loader): """ @@ -64,18 +61,11 @@ class CustomDumper(yaml.SafeDumper): def default_representer(dumper, data): """Default representer""" return dumper.represent_str(str(data)) - - CustomDumper.add_representer(babelfish.Language, default_representer) CustomDumper.add_representer(babelfish.Country, default_representer) -CustomDumper.add_representer(BitRate, default_representer) -CustomDumper.add_representer(FrameRate, default_representer) -CustomDumper.add_representer(Size, default_representer) def ordered_dict_representer(dumper, data): """OrderedDict representer""" - return dumper.represent_mapping('tag:yaml.org,2002:map', data.items()) - - + return dumper.represent_dict(data) CustomDumper.add_representer(OrderedDict, ordered_dict_representer) |