summaryrefslogtreecommitdiffhomepage
path: root/libs/guessit
diff options
context:
space:
mode:
authormorpheus65535 <[email protected]>2018-10-06 13:18:55 -0400
committermorpheus65535 <[email protected]>2018-10-06 13:18:55 -0400
commitc7866b3f114d6000caac6b118b337e0d8a9491fd (patch)
tree731780370ee824448c79ed261b4f4d02da877ea6 /libs/guessit
parent50b8a50a06fa27ee3d272f4d7b7ae3d4450a60a4 (diff)
downloadbazarr-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')
-rw-r--r--libs/guessit/__init__.py1
-rw-r--r--libs/guessit/__main__.py8
-rw-r--r--libs/guessit/__version__.py2
-rw-r--r--libs/guessit/api.py117
-rw-r--r--libs/guessit/config/options.json360
-rw-r--r--libs/guessit/jsonutils.py7
-rw-r--r--libs/guessit/options.py12
-rw-r--r--libs/guessit/rules/__init__.py71
-rw-r--r--libs/guessit/rules/common/comparators.py14
-rw-r--r--libs/guessit/rules/common/date.py4
-rw-r--r--libs/guessit/rules/common/pattern.py27
-rw-r--r--libs/guessit/rules/common/quantity.py106
-rw-r--r--libs/guessit/rules/common/words.py45
-rw-r--r--libs/guessit/rules/markers/groups.py9
-rw-r--r--libs/guessit/rules/markers/path.py6
-rw-r--r--libs/guessit/rules/processors.py8
-rw-r--r--libs/guessit/rules/properties/audio_codec.py85
-rw-r--r--libs/guessit/rules/properties/bit_rate.py72
-rw-r--r--libs/guessit/rules/properties/bonus.py13
-rw-r--r--libs/guessit/rules/properties/cds.py10
-rw-r--r--libs/guessit/rules/properties/container.py30
-rw-r--r--libs/guessit/rules/properties/country.py89
-rw-r--r--libs/guessit/rules/properties/crc.py9
-rw-r--r--libs/guessit/rules/properties/date.py15
-rw-r--r--libs/guessit/rules/properties/edition.py29
-rw-r--r--libs/guessit/rules/properties/episode_title.py46
-rw-r--r--libs/guessit/rules/properties/episodes.py365
-rw-r--r--libs/guessit/rules/properties/film.py11
-rw-r--r--libs/guessit/rules/properties/format.py72
-rw-r--r--libs/guessit/rules/properties/language.py249
-rw-r--r--libs/guessit/rules/properties/mimetype.py11
-rw-r--r--libs/guessit/rules/properties/other.py131
-rw-r--r--libs/guessit/rules/properties/part.py11
-rw-r--r--libs/guessit/rules/properties/release_group.py201
-rw-r--r--libs/guessit/rules/properties/screen_size.py151
-rw-r--r--libs/guessit/rules/properties/size.py19
-rw-r--r--libs/guessit/rules/properties/source.py201
-rw-r--r--libs/guessit/rules/properties/streaming_service.py174
-rw-r--r--libs/guessit/rules/properties/title.py41
-rw-r--r--libs/guessit/rules/properties/type.py14
-rw-r--r--libs/guessit/rules/properties/video_codec.py76
-rw-r--r--libs/guessit/rules/properties/website.py18
-rw-r--r--libs/guessit/test/enable_disable_properties.yml335
-rw-r--r--libs/guessit/test/episodes.yml2729
-rw-r--r--libs/guessit/test/movies.yml1103
-rw-r--r--libs/guessit/test/rules/audio_codec.yml64
-rw-r--r--libs/guessit/test/rules/cds.yml2
-rw-r--r--libs/guessit/test/rules/country.yml3
-rw-r--r--libs/guessit/test/rules/edition.yml40
-rw-r--r--libs/guessit/test/rules/episodes.yml21
-rw-r--r--libs/guessit/test/rules/format.yml138
-rw-r--r--libs/guessit/test/rules/language.yml10
-rw-r--r--libs/guessit/test/rules/other.yml70
-rw-r--r--libs/guessit/test/rules/release_group.yml12
-rw-r--r--libs/guessit/test/rules/screen_size.yml232
-rw-r--r--libs/guessit/test/rules/source.yml323
-rw-r--r--libs/guessit/test/rules/video_codec.yml48
-rw-r--r--libs/guessit/test/streaming_services.yaml1934
-rw-r--r--libs/guessit/test/test_api.py8
-rw-r--r--libs/guessit/test/test_api_unicode_literals.py8
-rw-r--r--libs/guessit/test/test_yml.py8
-rw-r--r--libs/guessit/test/various.yml403
-rw-r--r--libs/guessit/yamlutils.py12
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 &amp; 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
: 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)