From eb290fcb79b5d0df3eb0f7734c4970bf9c1bc25b Mon Sep 17 00:00:00 2001 From: plotski Date: Mon, 1 Jun 2020 14:59:28 +0200 Subject: [PATCH 01/10] Better scene detection --- pythonbits/bb.py | 73 +- pythonbits/scene.py | 432 ++++++++++-- setup.py | 1 + ...oaded.2013.1080p.bluray.x264-rovers.pickle | Bin 0 -> 3335 bytes ...oaded.2013.1080p.BluRay.x264-ROVERS.pickle | Bin 0 -> 11119 bytes ...h.S01.EXTRAS.720p.BluRay.x264-iNGOT.pickle | Bin 0 -> 7498 bytes ...ess.Brooklyn.720p.BluRay.x264-iNGOT.pickle | Bin 0 -> 3395 bytes ...01.Making.of.720p.BluRay.x264-iNGOT.pickle | Bin 0 -> 3339 bytes ...eleted.Scene.720p.BluRay.x264-iNGOT.pickle | Bin 0 -> 3367 bytes ...eleted.Scene.720p.BluRay.x264-iNGOT.pickle | Bin 0 -> 3367 bytes ...eted.Scene.1.720p.BluRay.x264-iNGOT.pickle | Bin 0 -> 3375 bytes ...eted.Scene.2.720p.BluRay.x264-iNGOT.pickle | Bin 0 -> 3375 bytes ...720p.AMZN.WEB-DL.DDP5.1.H.264-AJP69.pickle | Bin 0 -> 3331 bytes ...720p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.pickle | Bin 0 -> 3383 bytes ...rs.S01.1080p.BluRay.x264-SHORTBREHD.pickle | Bin 0 -> 3319 bytes ...S01E01.1080p.BluRay.x264-SHORTBREHD.pickle | Bin 0 -> 8779 bytes ...S01E02.1080p.BluRay.x264-SHORTBREHD.pickle | Bin 0 -> 8780 bytes ...S01E03.1080p.BluRay.x264-SHORTBREHD.pickle | Bin 0 -> 9760 bytes ...S01E04.1080p.BluRay.x264-SHORTBREHD.pickle | Bin 0 -> 8779 bytes ...S01E05.1080p.BluRay.x264-SHORTBREHD.pickle | Bin 0 -> 8779 bytes ...S01E06.1080p.BluRay.x264-SHORTBREHD.pickle | Bin 0 -> 8779 bytes ...87.LE.Bluray.1080p.DTS-HD.x264-Grym.pickle | Bin 0 -> 3319 bytes ...rt.2011.1080p.Bluray.DD5.1.x264-DON.pickle | Bin 0 -> 3295 bytes ...ffects.2013.720p.BluRay.x264-SPARKS.pickle | Bin 0 -> 9989 bytes ...d.Cut.2005.1080p.BluRay.x264-HD1080.pickle | Bin 0 -> 8531 bytes ...h.s01.extras.720p.bluray.x264-ingot.pickle | Bin 0 -> 3335 bytes ...eleted.scene.720p.bluray.x264-ingot.pickle | Bin 0 -> 3375 bytes ...rs.s01.1080p.bluray.x264-shortbrehd.pickle | Bin 0 -> 3327 bytes ...s01e01.1080p.bluray.x264-shortbrehd.pickle | Bin 0 -> 3339 bytes .../api_details_hd1080-wtl.pickle | Bin 0 -> 3175 bytes ...ffects.2013.720p.bluray.x264-sparks.pickle | Bin 0 -> 3307 bytes ...ffects.2013.720p.bluray.x264-sparks.pickle | Bin 0 -> 44675 bytes ...tails_voa-the_omega_man_x264_bluray.pickle | Bin 0 -> 3251 bytes ...d.cut.2005.1080p.bluray.x264-hd1080.pickle | Bin 0 -> 3367 bytes ...ds_reloaded_group:rovers_1080p_2013.pickle | Bin 0 -> 3685 bytes ...Bored_to_Death_group:iNGOT_720p_S01.pickle | Bin 0 -> 3650 bytes ...arch_Damnation_group:AJP69_720p_S01.pickle | Bin 0 -> 3495 bytes ...arch_La_Bamba_group:Grym_1080p_1987.pickle | Bin 0 -> 3499 bytes ...search_Rampart_group:DON_1080p_2011.pickle | Bin 0 -> 3483 bytes ...bored_to_death_group:ingot_720p_S01.pickle | Bin 0 -> 3650 bytes ...o_death_group:ingot_Extras_720p_S01.pickle | Bin 0 -> 3689 bytes ...y_towers_group:shortbrehd_1080p_S01.pickle | Bin 0 -> 4290 bytes ...side_effects_group:sparks_720p_2013.pickle | Bin 0 -> 3639 bytes .../api_search_the_omega_man_group:voa.pickle | Bin 0 -> 3574 bytes ...lk_the_line_group:hd1080_1080p_2005.pickle | Bin 0 -> 3668 bytes tests/test_scene.py | 624 ++++++++++++++++++ 46 files changed, 1042 insertions(+), 88 deletions(-) create mode 100644 tests/scene_responses/api_details_12 rounds.reloaded.2013.1080p.bluray.x264-rovers.pickle create mode 100644 tests/scene_responses/api_details_12.Rounds.Reloaded.2013.1080p.BluRay.x264-ROVERS.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01.Jonathan.Amess.Brooklyn.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01.Making.of.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01E03.Deleted.Scene.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01E04.Deleted.Scene.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.1.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.2.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Damnation.S01.720p.AMZN.WEB-DL.DDP5.1.H.264-AJP69.pickle create mode 100644 tests/scene_responses/api_details_Damnation.S01E03.One.Penny.720p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.pickle create mode 100644 tests/scene_responses/api_details_Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD.pickle create mode 100644 tests/scene_responses/api_details_Fawlty.Towers.S01E01.1080p.BluRay.x264-SHORTBREHD.pickle create mode 100644 tests/scene_responses/api_details_Fawlty.Towers.S01E02.1080p.BluRay.x264-SHORTBREHD.pickle create mode 100644 tests/scene_responses/api_details_Fawlty.Towers.S01E03.1080p.BluRay.x264-SHORTBREHD.pickle create mode 100644 tests/scene_responses/api_details_Fawlty.Towers.S01E04.1080p.BluRay.x264-SHORTBREHD.pickle create mode 100644 tests/scene_responses/api_details_Fawlty.Towers.S01E05.1080p.BluRay.x264-SHORTBREHD.pickle create mode 100644 tests/scene_responses/api_details_Fawlty.Towers.S01E06.1080p.BluRay.x264-SHORTBREHD.pickle create mode 100644 tests/scene_responses/api_details_La.Bamba.1987.LE.Bluray.1080p.DTS-HD.x264-Grym.pickle create mode 100644 tests/scene_responses/api_details_Rampart.2011.1080p.Bluray.DD5.1.x264-DON.pickle create mode 100644 tests/scene_responses/api_details_Side.Effects.2013.720p.BluRay.x264-SPARKS.pickle create mode 100644 tests/scene_responses/api_details_Walk.the.Line.Extended.Cut.2005.1080p.BluRay.x264-HD1080.pickle create mode 100644 tests/scene_responses/api_details_bored to.death.s01.extras.720p.bluray.x264-ingot.pickle create mode 100644 tests/scene_responses/api_details_bored to.death.s01e03.deleted.scene.720p.bluray.x264-ingot.pickle create mode 100644 tests/scene_responses/api_details_fawlty towers.s01.1080p.bluray.x264-shortbrehd.pickle create mode 100644 tests/scene_responses/api_details_fawlty towers.s01e01.1080p.bluray.x264-shortbrehd.pickle create mode 100644 tests/scene_responses/api_details_hd1080-wtl.pickle create mode 100644 tests/scene_responses/api_details_side effects.2013.720p.bluray.x264-sparks.pickle create mode 100644 tests/scene_responses/api_details_side.effects.2013.720p.bluray.x264-sparks.pickle create mode 100644 tests/scene_responses/api_details_voa-the_omega_man_x264_bluray.pickle create mode 100644 tests/scene_responses/api_details_walk the.line.extended.cut.2005.1080p.bluray.x264-hd1080.pickle create mode 100644 tests/scene_responses/api_search_12_rounds_reloaded_group:rovers_1080p_2013.pickle create mode 100644 tests/scene_responses/api_search_Bored_to_Death_group:iNGOT_720p_S01.pickle create mode 100644 tests/scene_responses/api_search_Damnation_group:AJP69_720p_S01.pickle create mode 100644 tests/scene_responses/api_search_La_Bamba_group:Grym_1080p_1987.pickle create mode 100644 tests/scene_responses/api_search_Rampart_group:DON_1080p_2011.pickle create mode 100644 tests/scene_responses/api_search_bored_to_death_group:ingot_720p_S01.pickle create mode 100644 tests/scene_responses/api_search_bored_to_death_group:ingot_Extras_720p_S01.pickle create mode 100644 tests/scene_responses/api_search_fawlty_towers_group:shortbrehd_1080p_S01.pickle create mode 100644 tests/scene_responses/api_search_side_effects_group:sparks_720p_2013.pickle create mode 100644 tests/scene_responses/api_search_the_omega_man_group:voa.pickle create mode 100644 tests/scene_responses/api_search_walk_the_line_group:hd1080_1080p_2005.pickle create mode 100644 tests/test_scene.py diff --git a/pythonbits/bb.py b/pythonbits/bb.py index 5284393..64acf99 100644 --- a/pythonbits/bb.py +++ b/pythonbits/bb.py @@ -24,7 +24,7 @@ from .submission import (Submission, form_field, finalize, SubmissionAttributeError) from .tracker import Tracker -from .scene import is_scene_crc, query_scene_fname +from . import scene def format_tag(tag): @@ -43,6 +43,17 @@ def format_choices(choices): for num, value in enumerate(choices) ]) +def prompt_yesno(question, default): + while True: + choices = '[Y/n]' if default else '[y/N]' + choice = input('%s %s ' % (question, choices)) + if not choice: + return default + elif choice.casefold() == 'y': + return True + elif choice.casefold() == 'n': + return False + class BbSubmission(Submission): default_fields = ("form_title", "tags", "cover") @@ -76,28 +87,48 @@ def submit(payload): t = Tracker() return t.upload(**payload) - @form_field('scene', 'checkbox') - def _render_scene(self): - # todo: if path is directory, choose file for crc - path = os.path.normpath(self['path']) # removes trailing slash - try: - try: - if os.path.exists(path) and not os.path.isdir(path): - return is_scene_crc(path) - except KeyboardInterrupt: - sys.stdout.write('...skipped\n') + # TODO: These should be detected as scene releases and produce an error message + # because they must be in a directory named after the release: - query_scene_fname(path) - except HTTPError as e: - log.notice(e) + # voa-the_omega_man_x264_bluray.mkv -> The.Omega.Man.1971.1080p.BluRay.x264-VOA/voa-the_omega_man_x264_bluray.mkv + # hd1080-wtl.mkv -> Walk.the.Line.Extended.Cut.2005.1080p.BluRay.x264-HD1080/hd1080-wtl.mkv - while True: - choice = input('Is this a scene release? [y/N] ') - - if not choice or choice.lower() == 'n': - return False - elif choice.lower() == 'y': - return True + @form_field('scene', 'checkbox') + def _render_scene(self): + def ask_user(): + return prompt_yesno('Is this a scene release?', default=False) + + def handle_error(filepath, error): + log.error(str(error)) + + path = self['path'] + modified = scene.check_integrity(path, on_error=handle_error) + # modified is True, False or None (unknown) + if modified is False: + return True + elif modified is True: + if prompt_yesno('Abort?', default=True): + # The return statement is there because sys.exit() is mocked in tests. + log.debug('Aborting') + return sys.exit(1) + else: + log.debug('Asking user') + return ask_user() + + # Check if release was renamed + release_names = scene.release_names(path) + if not release_names: + return False + elif release_names: + print('Existing releases:') + for release_name in release_names: + print(' * {}'.format(release_name)) + log.error('This release was very likely modified and should not be uploaded like this.') + if prompt_yesno('Abort?', default=True): + # The return statement is there because sys.exit() is mocked in tests. + return sys.exit(1) + else: + return ask_user() def data_method(self, source, target): def copy(source, target): diff --git a/pythonbits/scene.py b/pythonbits/scene.py index 90345e6..c0b4ef3 100644 --- a/pythonbits/scene.py +++ b/pythonbits/scene.py @@ -1,81 +1,379 @@ # -*- coding: utf-8 -*- import os import requests -import progressbar from base64 import b64decode -from zlib import crc32 +from bs4 import BeautifulSoup +import re +import guessit +import functools +import pprint from .logging import log + srrdb = b64decode('aHR0cHM6Ly9zcnJkYi5jb20v').decode('utf8') +class SceneError(Exception): + pass + +class APIError(Exception): + pass + +# FIXME: "hd1080-wtl.mkv" (from Walk.the.Line.Extended.Cut.2005.1080p.BluRay.x264-HD1080) +# should report an error, but it's not found on any scene indexers. + +def check_integrity(path, on_error=None): + """ + Check if `path` (file or directory) was modified + + Files that are not part of a scene release are ignored. + + Return True/False if this release was (not) modified or None if not sure. + """ + errors_found = False + something_found = False + if _isdir(path): + dirname = os.path.basename(path) + else: + dirname = '' + log.debug('Base path for {}: {}', path, dirname) + + guess = _guessit(path) + if 'release_group' not in guess: + log.debug('No release group found - cannot find scene release: {}', guess) + return None + + try: + if _isdir(path): + try: + _check_dir(path) + except SceneError as e: + errors_found = True + something_found = True + if on_error is not None: + on_error(dirname, e) + else: + raise + + for info in _yield_file_info(path): + log.debug('Scene info: {}', info) + # Allow mixed scene/non-scene releases by only checking known scene releases + if info['size'] and info['crc']: + something_found = True + relpath = os.path.join(dirname, info['filename']) + if dirname: + fspath = os.path.join(path, info['filename']) + else: + fspath = path + log.debug('Torrent path: {}', relpath) + log.debug('File system path: {}', fspath) + try: + _check_file(relpath, fspath, info) + except SceneError as e: + errors_found = True + if on_error is not None: + on_error(relpath, e) + else: + raise + except APIError as e: + # Connection failed; we can't tell + log.debug('Ignoring error: {}', e) + if on_error is not None: + on_error(dirname or os.path.basename(path), e) + else: + raise + else: + log.debug('Something found: {}', something_found) + log.debug('Errors found: {}', errors_found) + if something_found: + return errors_found + + +def _check_dir(path): + """ + Return True if `path` was not modified or None if not sure + + Raise SceneError if `path` does not match scene release + """ + try: + release_name, files = get_details(path) + except APIError: + return None + log.debug('Checking directory: {}', path) + log.debug('release_name: {}', release_name) + log.debug('files: {}', files) + if files: + basename = _get_basename_noext(path) + log.debug('Base name should be {}: {}', release_name, basename) + if release_name != basename: + raise SceneError('%s was renamed to %s' % (release_name, basename)) + else: + return True + + +def _check_file(relpath, fspath, info): + """ + Return True if `path` is unmodified or None if not sure + + relpath: Relative path that starts with the release name + fspath: Path that exists in the file system + + It is important that `path` is relative and starts with the release/torrent name. + + Raise SceneError if `path` does not match `info` + """ + log.debug('Checking file: {}: {}', relpath, fspath) + log.debug('Info: {}', info) + + if info['release_name'] is None: + log.debug('No info to check') + return None + + release_type = 'file' if relpath == os.path.basename(relpath) else 'directory' + log.debug('Release is {}', release_type) + + # File release names are identical to file name sans extension. + scene_release_type = 'file' if info['release_name'] == _get_basename_noext(info['filename']) else 'directory' + log.debug('Scene release is {}', scene_release_type) + + if scene_release_type == 'file': + # Scene released file so we don't care about our own directory name + filename = os.path.basename(fspath) + exp_filename = info['filename'] + log.debug('Existing filename: {}', filename) + log.debug('Expected filename: {}', exp_filename) + if filename != exp_filename: + raise SceneError('%s was renamed to %s' % (exp_filename, filename)) + else: + # Scene released directory + if release_type == 'file': + # Don't check directory name + filename = os.path.basename(fspath) + exp_filename = info['filename'] + else: + # Check full internal/relative path + filename = os.path.join(os.path.basename(os.path.dirname(fspath)), + os.path.basename(fspath)) + exp_filename = os.path.join(info['release_name'], info['filename']) + log.debug('Existing filename: {}', filename) + log.debug('Expected filename: {}', exp_filename) + if filename != exp_filename: + raise SceneError('%s was renamed to %s' % (exp_filename, filename)) + + if not _path_exists(fspath): + raise SceneError('%s: Missing file' % (fspath,)) + + try: + filesize = _path_getsize(fspath) + except OSError as e: + raise SceneError('%s: Unable to get file size: %s' % (fspath, e.strerror)) + log.debug('File size of {}: {} bytes', fspath, filesize) + if filesize != info['size']: + raise SceneError('%s: Wrong size: %s instead of %s bytes' % + (info['filename'], filesize, info['size'])) + + return True + -def check_scene_rename(fname, release): - release_url = srrdb + "release/details/{}".format(release) - r = requests.get(release_url) - - if fname not in r.text: - log.warning('Possibly renamed scene file!\n' - '\tFilename {}\n\tnot found at {}', - fname, release_url) - - -def crc(path): - log.debug('Calculating CRC32 value') - checksum = 0 - fsize = os.path.getsize(path) - i = 0 - chunk_size = 4 * 2**20 - with open(path, 'rb') as f: - with progressbar.DataTransferBar(max_value=fsize, - max_error=False) as bar: - while True: - i += 1 - data = f.read(chunk_size) - if not data: - return checksum & 0xFFFFFFFF - - bar.update(i*chunk_size) - checksum = crc32(data, checksum) - - -def is_scene_crc(path): - checksum = crc(path) - log.debug('CRC32 {:08X}', checksum) - r = requests.get(srrdb + 'api/search/archive-crc:%08X' % checksum) - r.raise_for_status() - - scene = int(r.json()['resultsCount']) != 0 - if int(r.json()['resultsCount']) > 1: - log.warning('More than one srrDB result for CRC32 query') - log.info('Scene checkbox set to {} ' - 'due to CRC query result'.format(scene)) - - if scene: - release = r.json()['results'][0]['release'] - fname = os.path.basename(path) - check_scene_rename(fname, release) - - return scene - - -def query_scene_fname(path): - if os.path.isfile(path): - query = os.path.splitext(os.path.basename(path))[0] - elif os.path.isdir(path): - query = os.path.basename(path) - elif not os.path.exists(path): - raise FileNotFoundError('File or directory not found: %s' % (path,)) +def release_names(path): + """ + Get release information from guess it. If we know the title, release group and year or season + Search for release title, resolution, release_group and season/episode or year. If the + last segment in `path` is not in the results, return them. Otherwise return an empty + list. + """ + guess = _guessit(path) + # If we don't have enough information, don't bother searching. + log.debug('Guess: {}', guess) + if 'release_group' not in guess or 'title' not in guess: + return [] + + log.debug('Looking for release names matching: {}', guess) + results = search(guess) + if not results and 'season' in guess and 'episode' in guess: + # Try again, search for season pack + guess.pop('episode', None) + log.debug('Looking for release names matching: {}', guess) + results = search(guess) + return results + + +def search(guess): + """ + Search for scene releases + + guess: Dictionary from guessit.guessit() + + Return a list of release names + """ + import sys + log.debug('Searching for {}', guess) + # Make search query + query = list(guess['title'].split(' ')) + # Use guess.get(...) to ignore non-existing values as well as None and "" + if guess.get('release_group'): + query.append('group:' + guess['release_group']) + if guess.get('other'): + query.append(guess['other']) + if guess.get('screen_size'): + query.append(guess['screen_size']) + if guess.get('type') == 'movie': + if guess.get('year'): + query.append(guess['year']) + elif guess.get('type') == 'episode': + episode_info = [] + if guess.get('season'): + episode_info.append('S%02d' % (guess['season'],)) + if guess.get('episode'): + episode_info.append('E%02d' % (guess['episode'],)) + if episode_info: + query.append(''.join(episode_info)) + + query_str = '/'.join(str(q) for q in query) + + # Make request + try: + r = _get("api/search/" + query_str) + except APIError: + return [] + + # Parse response + try: + json = r.json() + except ValueError: + log.debug('Invalid JSON: {}', r.text) else: - raise Exception('wat') + log.debug('Scene search result:\n{}', pprint.pformat(json)) + if json.get('results'): + return [r['release'] for r in json['results']] + return [] + + +def get_details(path): + """ + Find release info for file or directory at `path` + + Return the release name and a dictionary that maps file names to dictionaries with the + keys "release_name", "filename", "size" and "crc". + """ + r = _get('api/details/' + _get_basename_noext(path)) + # log.debug('Response:\n{}', r.text) + try: + json = r.json() + except ValueError: + # The API fixes our release name by capitalizing it correctly, removing file + # extension, etc and redirecting us to the releases web page. Try to find the + # correct release name in the HTML and make another API request with that. + log.debug('Finding real release name in HTML:') + soup = BeautifulSoup(r.text, features="html.parser") + # log.debug(soup.prettify()) + release_name_tag = soup.find(id='release-name') + if release_name_tag is not None: + release_name = release_name_tag.get('value') + if release_name: + log.debug('Found correct release name: {}', release_name) + return get_details(release_name) + else: + log.debug('Getting info from JSON:') + files = json.get('archived-files', []) + files_sorted = sorted(files, key=lambda f: f['name'].casefold()) + return json['name'], {f['name']: {'release_name': json['name'], + 'filename': f['name'], + 'size': f['size'], + 'crc': f['crc']} + for f in files_sorted} + return '', {} + + +def _yield_file_info(path): + """ + For each file in `path` yield a dictionary with the keys "release_name", "filename", + "size" and "crc" - # full search (slow) - r = requests.get(srrdb + "api/search/{}".format(query)) - r.raise_for_status() - results = r.json()['results'] + If no info can be found, all values except for "filename" are `None` and "filename" is + taken from `path` instead of the info returned by `get_details`. + + Raise APIError in case of connection or file system error. + """ + # Cover the following cases: + # - path is directory (season) and scene released directory + # - path is directory and scene released individual file (episodes) + # - path is file and scene released individual file + # - path is file and scene released directory + _, files = get_details(path) + + def default(filepath): + return {'release_name': None, 'filename': os.path.basename(filepath), 'size': None, 'crc': None} + + if files: + # Scene release is the same as this release (season pack or single episode) + yield from files.values() + + elif not _isdir(path): + # path is episode and scene release is season pack + log.debug('Looking for episode from season pack') + guess = _guessit(path) + # Try to find whole season if we searched for single episode + if 'release_group' in guess and 'season' in guess and 'episode' in guess: + guess.pop('episode', None) + results = search(guess) + # If we find the exact season, pick episode info + if len(results) == 1: + _, files = get_details(results[0]) + yield files.get(os.path.basename(path), default(path)) + else: + yield default(path) + else: + yield default(path) - if results: - print('Found srrDB results for filename:') - print("\t" + "\n".join(r['release'] for r in results)) else: - print('No results found in srrDB for query "{}"'.format(query)) + log.debug('Making season pack from individual episodes') + # path is season and scene released single episodes + try: + files = _os_listdir(path) + except OSError as e: + raise APIError('%s: %s' % (path, e.strerror)) + else: + log.debug('Found files:', files) + for filename in sorted(files): + _, files = get_details(filename) + yield files.get(filename, default(filename)) + + +@functools.lru_cache() +def _guessit(filepath): + release_name = os.path.basename(filepath) + if release_name.islower(): + match = re.search(r'^([a-z0-9]+)-(.+)\.([a-z0-9]{1,3})$', release_name) + if match: + release_name = '%s-%s.%s' % (match.group(2), match.group(1), match.group(3)) + return dict(guessit.guessit(release_name)) + + +@functools.lru_cache() +def _get(path): + url = srrdb + path + log.debug('Requesting URL: {}', url) + try: + return requests.get(url) + except requests.RequestException as e: + log.debug('Request failed: {}', e) + raise APIError(e) + + +def _get_basename_noext(path): + # os.path.splitext() removes anything after the rightmost "." which is no good for + # scene release names. + return re.sub(r'\.[a-z0-9]{1,3}$$', '', os.path.basename(path)) + + +def _isdir(path): + # Not using system calls makes testing easier and just looking for file extension + # should work pretty much always. + return not bool(re.search(r'\.[a-zA-Z0-9]{1,3}$', os.path.basename(path))) + + +# Allow patching in texts without side effects. +_path_exists = os.path.exists +_path_getsize = os.path.getsize +_os_listdir = os.listdir diff --git a/setup.py b/setup.py index f7f6956..3462e92 100644 --- a/setup.py +++ b/setup.py @@ -41,6 +41,7 @@ def find_version(*file_paths): "logbook~=1.2", "pyreadline~=2.1", "progressbar2~=3.38", + "beautifulsoup4~=4.9", ], python_requires=">=3.5,<4.0", tests_require=['tox', 'pytest', 'flake8'], diff --git a/tests/scene_responses/api_details_12 rounds.reloaded.2013.1080p.bluray.x264-rovers.pickle b/tests/scene_responses/api_details_12 rounds.reloaded.2013.1080p.bluray.x264-rovers.pickle new file mode 100644 index 0000000000000000000000000000000000000000..3f3a982cfed4ee2dffe0c4150a151585465d233c GIT binary patch literal 3335 zcmcguUvJz*5WmtS7p_g3f>eQ^(o%%fRPot&m!y~E5~(DCHfgR=bA6~#Ypv}~#>8j4 zyXz!Z3IYj14p{=JMj*ih5>(<5AwC4(g3rJ^56s%WyM$JS3c)>`cV}m3=ihH;J{Lk^Y5IJA;}&bJ~qMT|MJ7Wt%VR1H$8%^S1x({=LpMl1OwiAMzE zdyL~^D_@+u5>gwOUM)|TYjtvQg;_53Clzy%9fWSGZgI7@I^Tk5id5!EGuXpVy+Vxo z{7iM;FnUjn*-D;rx*uq%eNzNiDf1L*M?z|x?NQH7EmEq6obI$K zE;jSUXpdhhR}xI(Bf+kV_LsJBvz%`t!MS6Zf(e0+TQp{v@42>JvAj8I&FmPnJG-G( z@eFI5x7z_-Ai0@~x%V{mo|buUX5hUAvOy2DD?4oQa@8;vNJu3t>I>wml;I8E>nNSZ z^OVp$=I=;Ag0dQOM7y37P8f>sbdOJVLe&0rkE@k#Uy|%V>LAn*LW zuD*;}gt?+gPJK*CE;YgIh`X|bXIt4>tADoDKbvZ!_7t_RRc30lhO)r*Z7*`zR%ERN zZR+|0jpED;sDlqh!irBu9OKslv{20J`u_fYIdyH>4%#{mUEN`lx}MN0)ilsfsZ+4lkqn7F$`X(p=XDshMqDvtib80`<109@FKO;2$x#Gh!faR8$}SHg0xey z4N8Es?ZpfKg@Z0E0b;$O)1`7l50!=-|ES|29>vm=F-tN`6DmnRPGl2vgiKG@P*i>y zZBMO67bvfl5-4tHCtws#rD1?^I6L_awdHaT_|H^ZM!mqMs<2^kz20B`H@WtYka@B; zn*!|V*gXFPY`P-Q>h+m9t@1wu6fVb`z1-^u{NDl-=I&rfn2(*z^>?te9x*Q-;fx9u zv$Kz(1reQ9W5o7EzvuNyXK&^`HLKEVl=s@*#kgpO0aj?NVB^XhEHA36zl$vKiz{rK zMxM-WZDwqP9_%wIY>GAXFfQ_KyE->JlXS7=;<94QnN*m4j%IusT!&$YR>G^uHkOrA z(@Coz5?;v(xg<04u~fO+F10-M!nyp|7spS!@xY z=BhU5!Vcc{aU95|FdR*)wQ|}x&rsWDq0|QHdFDz+S?wq6*v@@7oFWd}_S8^>4jajC z;UZ&3y)NmO)JX{&v7ZfCxWP6&*z7VEYB-MUDG}HW;Q?5An_>X@YWEPlF0`BAcOmFP zcnJ5pz}E{Px*)p{!2xt8;eNC4aCmUk`$MV@CryknCZ!5YJc{K#8#M1EA|5vt1ENC> zi3q!9WJMN*cjDn}9)LUXb2ru#F#nxukYw8s=KhdRF_GYxco-+T2vdsu-4up1teR%f8RP0}ijdg|JG z)i~753Jq2lWEwUxTr!Q@)!rD`6pkt3{ literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_12.Rounds.Reloaded.2013.1080p.BluRay.x264-ROVERS.pickle b/tests/scene_responses/api_details_12.Rounds.Reloaded.2013.1080p.BluRay.x264-ROVERS.pickle new file mode 100644 index 0000000000000000000000000000000000000000..24b1948b3e225ec63f8c4ac76b53d27d8101bf2d GIT binary patch literal 11119 zcmcgyTW=&s6?U>-+c?=v5)=tRpc!7W!823cU48R{&4kCojsAr~Tt9N_4 zCw=j*b3sHxVU1b>DII|X4@eM+M}!c+fq#(){s^agZZ^A9ky8m{$x~gIbLw2ab52jy zFPA^-|9GkX6ju`RUQW_1Z4Ki-3DdGz+b8KLj#5&7T3-9O{HT1jSnKrSC?io;T0i^# z($WWw$RCo%W;CB8jFYU3NRyQ*Gtc#~jInc?*?~VCh2$%6OY4QL;e(?Y zJ5AKEEMjrW4}+wRp{i&2<=ynFaD!#7#7}0tu!`36xr&84UqlU=9GzM3~hIuAZ-#T`9ub$C8X+}s`90VL}Xyv z(vYU=lE`TX2BvM-kZjZD^j499X-id212l^cu;XGom?D-v#A|5=racFo$<}!7z`(SH4cl}vC#EF^rZvX|NE^J~ z%D}X0xFR;ZGw(v@&v7yX(>6w`VIt1xEi*6;a1&h&wE|ZqATuzHRMC)Jhtrp22Buw6 zhk^|1e?A!)nARW#nXddk%)m5uZO7!Uy=4ZbHQkjZQ|HwZ1Jg*C zJcM}T64WXSV=J;%WOyzorZEfCqNd7N;;dUS1Jm#ZR8?f0zJwW=R*~oGmd05bV+N*e zN5PJ3ab{7>z_e^y9`;<$iVQO_t+<+KDHdns!wgK@F0v(LaK0%*7G8)4RZ|`K z1Jj11ND6}Z&K12e1JhU+9o5n~wWKgGEs2)nLN&lAgTlbHY@5h+c(tT3FfGZdjIhob z`4k4GUClwdC~+cAVPIPK4Ba*q&J3h5Fm1aw!lK6OOAJiAD*Oy*@Ma*;!9q+Mu5C&p z;*8!31JkaAZ4YxJj)7@cRxRx4oW7(oFs*5Dh$Hd7$EgfVW5;qV+2O3cRR*RV$R^RTRVTa`AJ!;*woI+tcSCMRBv1Z$p4qJ$XYI=4sYU$dMlgwM5lcM~Q!L=tE;~ z(pa0$uQs=yk_?!{4+4;X{Qw^9$wQtdNx$1kNt%MU+D?1EHn@6#~=8k zQ5f|6$_3i@(>S^=^r)YJ>^Jgk(9|mm-vP%0_i5J5M{$xhQ_{J|SRMyvNLp8C>2KEc!v5s$);M6_^pk1kd$m~YjADp)5V@XuM11RF89I46U&x#skpM2kdY6y$;7mCgRTro zMq?m);dS@0q#Awu$;h&vLse2`BDkqntiM$~K%T80ULGC8>If=>@ohh-QY5*BD$%d_ zy&f55r!wsobKEn}vzP9@AB;AHJ{g2neFUpk#;c$)o(%hXt^HaxvJOEZ8rNFz00CkC z@PLp}6DpIViUedq`XTL35)`3y(t7Zih9`8mOQRDSpU}}``rZjmc9v**LbDT^(?|69 z8hw9vrf~XUt^J#0n=Dr`xZDK`gHu+9Db^sgk1sUdEz{z1rbsMUNDrU~o_SKNOh85dUR)hF&kVmf>6;@ggGI|V zpy)q<9w6(~g2z=o45bo*NwZ@2=7Z0_c(+*X2M|t@iYElKVU_7&Lr{>{%}!MY?T!Nt zL>HKJu>n{+|Bfe>|H0k^bpP-~IE%2gh-N{$-c`m3~hDR{K`#zrEDK$^ZZW literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT.pickle b/tests/scene_responses/api_details_Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT.pickle new file mode 100644 index 0000000000000000000000000000000000000000..5206022e4d048539990429e73a64b05518bdc2b2 GIT binary patch literal 7498 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 literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01.Jonathan.Amess.Brooklyn.720p.BluRay.x264-iNGOT.pickle b/tests/scene_responses/api_details_Bored.to.Death.S01.Jonathan.Amess.Brooklyn.720p.BluRay.x264-iNGOT.pickle new file mode 100644 index 0000000000000000000000000000000000000000..1c3959a506e5f5eea9c475b7f51adbba4434d94a GIT binary patch literal 3395 zcmcguZExH}5WdnR7p_g3wo(OxN~U~is@T4lyj+q?q$ZcXB+VsCt{*DYT6^{;c8i52tNKnK_g!mEsi}F*LwS9L9ttb_!`HsQQvux#DdS9QdKPt9BnCGq^F5c*=y5dqAo?J>Cz_D#d&;uM|o%`Kg&gS-HAej~+&1fYD%& z2DsQv7w0bf#007rwQ;RfRxVa)!zS*iRL;@^-;UkQE_GJt>ky79g=wYc?cqqK8ftw2&JCm>%QZm)>Cqr}VuI+`* z&;||-XUpE*omJ9j&ZW^)F?wney@_7*W|dWPpkCglb5q59epc}bhdF&#xyHG_<~l9u z({Kt2)uHY-2NcLxBSzF4so+>%>YeQ9@s^L?pX_MWap zT9#MeL=+)bR2~o)AsKL$Q8Nr|-omrZQf{!G9ZvKd|9-{05b&}ydF)QNBF7Ujftn7)8$wKVQ& zRfiD8Tj3&Y8X6UTX4b+($Wr!ljEvgySi3Ktbr{-(TZ+I z@LE!0(7*7}u}r4&PIYauertV6xmI7jp{(CrxN&_^xuEL$^`-h1U9Z-w$w^Vm>-tjd z!hEhGgEwE1HHaH-bBE5C@&#qp+oP7UPJjtEl5$4h7`y^NuVgMbl{LCi&vT~&|4Ae@M^0>f~6^d&maRHrSxROcCV zJd?<_hpqQUclkCBi(t~6`kHl=W){Emr2kWl@~?U@IA*i zvHK0n*I{dt6X7nZh_h9?MM8%sx7HK2-u!kcXC}e^`$%MiEwea1IT5vST;sBkpEd|H zx*9cc5^Rg&beG19s5X?eVZ(|$Ckoz51*s(?baBkuTQ+Gp@(btEW0xI0X^WBGNos5* zBi`-_vHKggizI!l31=R2Zk9$ZRFq-{w$|G@npD_uz5u<^n zwL`7ca~6%Fj5v*-LsBi$#((M2zTj2?7az7yZZvLxhy_A_j;2S27_C#<2V~m`_bC zJw#?(45UQ`zlxD$dF1#^D(h7k$4h;2LBVfm4=d}?g-4P=Bi*8?)MdxZKRZa9!`JZ5-w+Mo!gtSN_lF}Ggdc106Fh-m IVr*%D0SzOlW&YatK&iSb4%gjI~ z{)wT0-VZ6`Olx=+byy_&H!1Tym(l1+H1a6=Ai5&@4byWub$PUyiNqPk2@e_4EE=u+ zA+kV;MFYHgp(Bj(AT)UxP)S`RjNU?lF0;A4M=Q3;+pkBhklbutx)2 zY^95f*L-3E)r;DgR+>_-RA}8M?uca0(gWX))y*!oSC?uKjw*#|rRweBXR4s&r)I{B zGx>b`i2+l}Q>AwT&xypqV!U5$@85PkHMVb5!BxyWsx(5z)qw61$Br$Ms`>%hX%Jj& zq>KJGzf>;AD91;%CcJjU1@gcIez>F`u7Re8OQ)pH*&h?ytK}Q|dIB zriAKHcZUNKq}7-s>S{_jm6v>H+kCv~qxNUpT(x-n8m9+b2i|aI6%$B+hR)rtU00{% z)z>kLFjrI_5EoN2;3}hL7}>XIsfxt#h{3IU8-D_5`&r6~;>wd1-;|noelZt*~D4 z8pL)P8Wm8-BNjdsvbs1O1{lBFfEKbDUEkl|*J9Udrq|GkZ|fH2#CDjzfZ1wk+|w!) zy`pX93)&jlwcQ=f+t$!szP8|mo20276eq@1yLw~2hS>$SOoL{0H-c9ZP(km){ZpAt z`K`+OV(rexl5(@QwyJF0URb@gs9aWc{nk?Lx~^AhmE@$T<#m0jdU-xqmhPG_OVr_p z+uWh^rF=nI^Y*BvY|x-VT#SR$EbGZ(uB^w*<+^7z<^96^b9j-OEBo^`po-<0VFN`d zK$y~q#g>Tz0o|Uv{8Bu0c^(k$Wu44xW!;x52KYxT3lYiYpO0E4LA64-(utI^fmx!A zjg?STdKrz6%|;(cx8)+puBoS>AI`*afI&Dn^3tnIzvG!imNqP}tDWUb%C>(5&eNrd z=@-NE(sSTxGf$nG8lP4R|1(BmQoPg7zD~sdH8x@TE(V3V*v$~cSYD6VC;9?Pn2g%F z6M#WbClwjH)o`cpbx7wn)4rNi>SYqNTiz9sHGI#pO{`*r(jF`^va-L2EaF0iZj;dA z$*qlqt=orP%9%;9jvk6^ux%EnC&r@|wq0Bn^3w)kMu(#+&Vp@G?9x(r5!nWka%xy{ z1w_IdDIt|)gf6yAd)p>;N4{_|J$Bjgla?6no}|K7GUClH5v#aiyV&fBgReObTGkTh zkDtq)g4E%-q*KEWJnrELfZptlgB*#|`;5sH8#d|)pIvIDnzLvGX~c27{Ufxh=rLSx zKU#j=dUh|Y$1{txoZ$om@3*O0>JXn%3qvk@FSi@mlU|h{9DX>#7_DShGRvR+)|2@p z+Qb;Ak&PfDhBgA~6RiGeXuARJYfugz3O#*esTRQ`+&Niaav_c*vMb>fC33gr1{={a;Qp)7S0c3|g$?T;!J-FD<)gbwRVZs8(f zM!l};SLI0#o3Wb=S-8Pg+}-R_>Z>@C>`4*W5#b@!(@sSJ($(%EI4x*Y!EJ%p0{;;1 zw;))_0BZqnK?n!X9DxVbj>F;MQSbN2N*q-&!kCmYFrps|d@^j_jhGlTBm<&D4vGl7 zYFH2J1l|?B$xHxu#VhM85g7lKYGUA6qn8?;(&hiavAHUOZPAxNvK#a)f<+Epm@%Tq zC74L?tLVk4F2s~lUNni}94jXpbjG0k8qB9ALJu>uCHhiO!OvniSspt+pVGPr<9Mkj z1{C~)@(@`^E*#217{?}xOr0rr`NyZv?uo2rV>t=rn^?>mvgM;fIElwgLykn%q|jh> zL8e{xK8G(bRZpZo kJb|Oh4PU|6f5~Y02EIL+yWbtlLHNE3KfqJ?Db6kJPn(hIyZ`_I literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01E03.Deleted.Scene.720p.BluRay.x264-iNGOT.pickle b/tests/scene_responses/api_details_Bored.to.Death.S01E03.Deleted.Scene.720p.BluRay.x264-iNGOT.pickle new file mode 100644 index 0000000000000000000000000000000000000000..88989dbfb50b3b782e7b681f3916c1604c632140 GIT binary patch literal 3367 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 literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.1.720p.BluRay.x264-iNGOT.pickle b/tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.1.720p.BluRay.x264-iNGOT.pickle new file mode 100644 index 0000000000000000000000000000000000000000..e2b864dceb16cc73ff206a24fc293de6c1e41d71 GIT binary patch literal 3375 zcmcguTW=dh6n2`6gWFu%N)-qyErExo%6ffC8YgigHF0`L8YfEJhl0}8cz2SsWWBrH znN8wS5S36Hqme-BB9Pz#2`crG+mGO1^sjJccWo!MDo9ZL;GH>h=FGXD@3X$I-ycdv zKQZFddjVyfWgD(ZZ5E2bP0BpiVKjUajz0`P2``C3-EbXF9Ud;FLUEdL!UKjhlZLB* zh%``QQXj9L?+9bu4-6joR8p4+qc>5Y!z^y?(~4#Awrnw=Gw%8nr5dhnQ-fRhH15`Y z6iLlC?>_xIGdZE&Ce*;*J|OTPz*5Y?^7Qa zTgl?WRgV}zwL*3>TP!J;Dzt79XIwI;>7i#u>ZX_5tBW-VCKMD{b@%a8$}73j>{MYk zmuo*UWJr0c^p5Y^p%_|<_Dk*kdycC{_Dv|bikK&qM!>l0(|uxFkwsEf&nLSLf{Tr0 zG1%sp%4Hbk_=vk_q5YXH+$<%Vfcd^z*BNCD9XDUvDH4CrwarqVI1Sio6nFO>!#4K_ z<eXF3KV8V><`j=`nAhf%8=QOVj@^_x4JRp~ z+SJ+QfCOnZ=7@SLA@t-V-^a2%;-jJSw`3b z14Sr6n9_*EmWcvB-I*VIy{;Nt0IdJAMi#PV&6B$N_(x0=Ym_a#ypEN)&K1IyPVAHo z%o}BLvWTLR%jkv3esqTPUnYd~n%V<{a5@SI48z&+*WPaiZPy^O*cd+{ZeYcW?Xm8NFY{Qq3OFfBf4=VK@I|6SR_%r=IJIymtxXBS)WF+;_G zPYIK8Jo`c|VZFy)8z+;jxY(uj9e}pXJ ze1-0iz~=F-jhL-Fs~yUjL9o{ziL}3C6lShWg)JP-xXkBfbi(uwM^&5w%cMBTrSJl> z4aF^2H={0zgtrqyB1sP%9I4ihMe4SE;X-oku#+b(G1@&zgsrB;J6$4ndfjpm5D*(* zvu(7jCC;5ZmvaZHqfy(Zy63yxMVNrz?2n=yirxdpWUh_sbu6eoY9^Yqa2#pGw%vnc zw5sUS9rqwydE9z_H>gLrMq17g<-o^nYMR=_W7Ncu%lXW$2F|TF)tGq$M)9 z*4O z=Mq}C!Z=>)iwX*UMR{0R$1WU6u#C`(B2xzmuRMGD{H{ow7Pb>#zKPAOA<+OTglIil z>Jm0p<3@ws1)2JF3>S~$cB2g!t1PH9#xUZETR(+|Q4Rgp6W0)Y4v&)bX~7p*9Hmzm u2Yd-%VXD56`tSsfCpUZp-~J_|;XC;L#oYbjL=M7_Rrm>>!m}v1vVQ_oe)jDE literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.2.720p.BluRay.x264-iNGOT.pickle b/tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.2.720p.BluRay.x264-iNGOT.pickle new file mode 100644 index 0000000000000000000000000000000000000000..73cf0ef0e25b392f58d1db32880588c1021d2b2a GIT binary patch literal 3375 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 literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_Damnation.S01E03.One.Penny.720p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.pickle b/tests/scene_responses/api_details_Damnation.S01E03.One.Penny.720p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.pickle new file mode 100644 index 0000000000000000000000000000000000000000..7ab97a1b14fda257282003bdd9390050a76ba9d9 GIT binary patch literal 3383 zcmcgu-ESMm5vOBGRA@_mW(>Anwl2&dtvJ zX6ECLbo3#kgq&KBqoU)(VL@ z#W>+HLzzvJ&3}m^P-4>vubv+mV?2s29!FG4*9fCG(V)*9?i|pDWAVOiF=jFzL=>%B zf$LI>JNRkb?L=sj+I`(y=*5UlI4X`b(w~d%n9eB1qOuYDO2w!cO1XN~s9iXjMh7&)#csa1uo@Bzs9w=#wQ5bd+@KwY_|sCkNFRkx>TYqpzq;6lct$BND$U>k ze`;j~?ax)N8b<#U6PC26%IHLan}~_EbidZ$|I826^nEi5u2SV0#fuqNBYHqwCw-B0 zHH^r>0F6XjvomgIQah3E^gNHP0XUm?wE`+hJjl)qMElzjCjFj2Rxpe zzwgEm{lK2}Lb^~jg7T7*KXW;co{G^^v*^tYqqn4NlSk_6K3!g@7{-zk5)RAyl5&Id zaL0GM(x=HB5~@r6eGVv)uSSfhTe;wbA@xr8^>{Z#?@#x&+UfQkP9Jd{xaTe@7LW)Z zx_rC+o?4Sve}pJPtf)L9K0-3$Dx+2$IlPN!yV+TLaJD-*oAJ~GzK~tj^~1wMEe)+^1)feqN4F^_j?450 z@q8jts_h!(b)%~7_*83A-|uP|tWaCs{zX%JfBl-;*wPw}pU-J!?S@vFpH){kTJwtt zG;ky$y2;%H-pc9=Mz1|NQ7F{kZS1VI@3hvH8}02arFHw-*3C8LlB(-B*W2&udZXRQ zPAZzA>+8)+E2X-O+)7;*Aa1zBUAj^=%F1?dKy9T(Bair)61Q8|v%^wdPnGMP!0yWX z<(1dyqO?>GSK2@oJFsF8O(;N^;-zNmM1hFzEnoVfgLP>Ium{w2vZB@XPIoQ!Q)xK zH-vB1bH?4kN}+^JcWbcx;W79|)qAp9dxQGD_?r54SfJKwbBk*E|6IhdAb!=yC-KDOc`PZeVkB`ok0arTvp!m7`@H%_*x!HgV;&fdyraMsl~NYo#X zmqpPG1J|*z<4ww^VLOsj;6AE|^9{O3VwY#PTAA8#X8V*gi(t=vE{f5fRau;$OL{n> zaalGNO~TB9MpK*y$EG;ZrSS@?O=PXtw9{^hf}iAq+>#mlI9i=Ohjd)|g$wzy&yJt; z#MJO4H?~<2KOG9O8I9S`T%+wupA5+|6W&BA73WAw+Ph2JK(Fvodj6DWu?t%!yM2~3{aVM50|${|3b zC$F!!6Ig&duXdeMjMPO=Fl1b!bX#t47|YFtu#2~Sqz@TuLn>3LYH6XKA(ll$t`6aO zW;K(n4*)x{|JVs<6r1k3l0;#^#>nN|_ijj%`09rgsx2CQYe;)gehGmR&RM#2o^^6r&k`fV<+Yoy`Qy@8;UqDMF-c zV&WJnkRF}T<^PFe94vu7F_x9&FzH1s7D><$F=E6g2qgH27)1scBczo7#oCbbO7?@n zn3TUJ3#o;rhsf-SvAn3@Z(=H29y>ml%Z3%k@zO|IQ1ExOhn02Y!gEQQkz!F)8ZhFG ze}DP%o+#Q5wv$MH6PuYQIRQF^tUXEBWVr6Z{S%DpB{XI#Zmk3#R0#A-y>9Cfj+!|qu_==!KeR$X!s2N{3>?; Tatwp;c@w^XFX68#wzO{myYKLc literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD.pickle b/tests/scene_responses/api_details_Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD.pickle new file mode 100644 index 0000000000000000000000000000000000000000..19b1d9b8aacb53e40ded8e4148ec8c271bff3bf2 GIT binary patch literal 3319 zcmcguTW{P%6yCH+Hf(ciD^(zbNhgnZIicTi(Z3qFQ6#Z^c;tp+{UMI zw;7;FYPEQ`QHySiaAfQ*$Dhm9kd7((tg;%qN>MNBN@09XpPDNcm75#Y=t(4c84V6- zfQy}Uap{^*OrTmZKan4wQLdC}%_i=sWX{qf-;UMIF1J>fs}PPUg;}NI9pGoCpy)Gm zlf^k*Z#^+!N_ndEPT)C_7+8w;ORfD!uBXQKjVZW_na7lR$haEN1LD}RMN(BiAbWL! zi>-9g*W#DTNJ?9gz8Xtj{_2<)tDpddP?ZhC0~Dwk2ieOzQ4s)jkoV|dc-y0b!T2Nfdpvi!tLq} zbw*x&53>k!Mdbl;F(m`8GHQl_%^P^OlbluCXFKh)u{vr`Q2X)1EwEkF2`#!4 z*2-R;*e*k(0_u3g!iPdu6KBH!dwmMcJ=!9@=6&K3v8JIjp%L!XA(R?&vmCO zlPP^z-dw8Q*;-assvGOd*6r)-x0aLdxRpj%N~C(6Fekx0i1} z$Nm)>&yG(`ydIC2Ux7!PdFsr}(yCigYa%(GL>-1cga%K{&na3g2 zk!>I;orV=xJ0!fH5>iP<=wfTMcWqL0_Nh)kDBR=R5v0@vxi;bN) z_?qLOWleG6S-${Bb%oJFHZBaVaR zwnM9kZo~Bsqt#0D#l5f=&nMDyhSLgs(xPUmLwrUp47u#H+^%E)c}IS5(BTAQw3b=R ztUm4P$$S}YV~o?tMvxIhTLJY64j^f0I|1#jQw|;qJ$rMx8o@N&IbBt9A&wrh1L4FZ za<}CMo2lGf@*8;D#rB^}T{wyq$MbQc93rMkeXe%WbLd(^S#Brnz}`dKA5$#4>&PJp z9oC!N!bQT2dR^77%99*6UN;%2aD#2Pv)QNAS8@C}kRq`A!6T@pt%(AptNmkenozHR z+XSx({xLjgLa>$r)&$;!5RRZR3J)u7hr^@T`x{A2x@G;1Di~o*N*Nf@hh;q(Ebm54 z3>uOF(IJOIgk2@9g*5^ni=L$a!(DM^b1eenZK);(PBe9?QI{tF2TsgT5$uZI1d^Sg zXAvxNz`~3X-7djIg5O0CPH-Wnl=8Z%3ujh2y`VD&<=0?7H4%E4nN87~f(m{W!^!f* z@r9JuK^VtN-7%oxHaxe9LO6BD zOGA!7m88&MbwQ>c1H;ARxUICtz6uL#jImC{KZD0HhP+aDj3M{}o}}s1gr^9OnSTZc vd<9=)s-8-Hcm^*gH+&1<{Vk*6d-&mW?*5qOU{V+0rwaTG&*7IixAK1hAh_Xp literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_Fawlty.Towers.S01E01.1080p.BluRay.x264-SHORTBREHD.pickle b/tests/scene_responses/api_details_Fawlty.Towers.S01E01.1080p.BluRay.x264-SHORTBREHD.pickle new file mode 100644 index 0000000000000000000000000000000000000000..780bcaa2f006057399d5174b1eedb971847d725d GIT binary patch literal 8779 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 literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_Fawlty.Towers.S01E03.1080p.BluRay.x264-SHORTBREHD.pickle b/tests/scene_responses/api_details_Fawlty.Towers.S01E03.1080p.BluRay.x264-SHORTBREHD.pickle new file mode 100644 index 0000000000000000000000000000000000000000..63fd7ed98428bddddbe356df5dc9f455e1243b36 GIT binary patch literal 9760 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 I_pQc%0Z3?682|tP literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_Fawlty.Towers.S01E05.1080p.BluRay.x264-SHORTBREHD.pickle b/tests/scene_responses/api_details_Fawlty.Towers.S01E05.1080p.BluRay.x264-SHORTBREHD.pickle new file mode 100644 index 0000000000000000000000000000000000000000..39c562415c1a14e91e4b7ea12b3bf16311acffc2 GIT binary patch literal 8779 zcmcgyTW{Rf5msVZQWRek)IiZ1Ww$SOpxr&Zld>#ymzVe|snX^lNSy_D_pA_^R`DTW5{OiR( z{=Bx3|4T1N_>%|kFba-u0SUJ^wSO*N_8ZCA~WOEN0{P0nvBEfKYJy&?yMruXnN2VJs6 z#7k0D4tyyGv87s!OH~d+DF@3CZA+Fb%OI9=;O&;!Rs_4M3{oivu%(vCi&bq2$)y}@ zUX^UC`aLM693+uPs){OWNiF9fnJPl_4)_d+Ls}_^wj{P?-mGj(dMO7@6D-A0=Yq%? zWZ=s&-BN5(w_(AFFm)CV<(TFLB%6YwRpn5QX}6>)qyrfqN;f>IgN zd^x5qT@{RWWxphpV_N0~TePIA)+&@^S~DfSEw$8&)+&@^TGZMggHqKm3FVkZvS!GV zELWAG9Mf$>1U0p*dOo2X(*SANmaJA)8Okv&Nun;aQPl_}lw+EgOw+d7m94cL)1r)8 zvSn7b)^bcs$W|%;5Br6u3B)0Oh7Eh zG-@eE%dY$lB$i{^mL>QWg&X)Q)Ok1)kL*7@hY7$B1m`0kS>SnvD_lB}X8Kx~TRmIS&eoup%CmbLVRwNls>vMu^ ziMjzoK7X`UbD}!TF9)Ql+4hF2$`RI9; zzD;8%PAC*o2ROU`pLCgEX8={xEPZ!cfu(Vj^y4JLY}9Zlz6(`YpSm#|-E{l$q#&Cv zb!i+#7^wCG&%^!Lg?cUYwj&^k2a~nCP`X_lI58|-H1nV9odmCONayY)J|`dnalE*W zlyyPj-hbH1zR1!gilYM@L1S;+xYi1tKEX|)AvHveyJ6y<>-aa>;${3abo1jbTa(uH z4oTKHUgx%g1NhN+4r%MMu#V7##l=3OS7#;VDDblMqLKHFN&jblP|xLCxw@&?p-8x)f6iio5+p z)U{rZ9w-OsaS*FfFi?5oJs$P;d)|KE-M__+#k@V%ULCYoFSIAmw0Dbp=sc~r_VI01 zKxFrRwPJcKfO zo#K8Hx$zOq?GD<}~1ad$iNV7x*N}snl*YA7D0PiI|GZ;CpPeINIdx67_ zn$TW)E{Whu_Xr40*PG45!^1|d?M6QsHJ#9H4sh(a9&Mf)cwlbCWp;6tJ<7>X`1i^cYhiSCBi!r| z%ngEmG6E7DaVR&+$!<6tiSY1t?R(HqZIb}_H=537W1|_e14i%%To3@1ZoVGGTmf>< ziMi=5aXVlk9DIZTsqtnIJr^1@z?8O{k>!W=H^>TkJHG{TiCn#T3TGovJi)1)&59Qk zW)4qO52nrU#nJ#XmnNw5u)iM@7?|Mh!Fb@DsHoqK&+9RM8s}=80n?>HUDIT}&i|j$ zNz`ANN#I*At-yLO6Yvv*7%$F%Q&8-0;3N5ej( z403i15g3|0(z_1rPFHND7l=E+5U?3>0hV1X+-P@@dp;QW(Rg4?shju^Io+Y_^gPDl z+IZTh^E1ckmD$Xg*!_j{$Fo83-d)#+xbJwt&GSIAl&-Ka9J?b3NpG9Lb}bdVpiwM_bG_GmkIk%t zSMZB`3p(HtW}PP(hjqwK4j2iDgyb{Q8^2$H0P$@ z8IR2n7Q?2+98lz6Ko5|0V#5oT6GOU$VbL_)h7QqNIflq@$QNVtIVQgY zaA@BS4)S~Qhu4`t`I4M8Zt^Gc=a(#+d`159s_p)D&IZZfw#eVf*W@3$Z8iQ2pQBSy literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_Fawlty.Towers.S01E06.1080p.BluRay.x264-SHORTBREHD.pickle b/tests/scene_responses/api_details_Fawlty.Towers.S01E06.1080p.BluRay.x264-SHORTBREHD.pickle new file mode 100644 index 0000000000000000000000000000000000000000..4bb34f44fc78887868cfbfe6b24e86a8ab3d841d GIT binary patch literal 8779 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 literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_Side.Effects.2013.720p.BluRay.x264-SPARKS.pickle b/tests/scene_responses/api_details_Side.Effects.2013.720p.BluRay.x264-SPARKS.pickle new file mode 100644 index 0000000000000000000000000000000000000000..43eff2126de12c3248f5c1122ba073e313646243 GIT binary patch literal 9989 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 Fe*lX6MZW+5 literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_bored to.death.s01.extras.720p.bluray.x264-ingot.pickle b/tests/scene_responses/api_details_bored to.death.s01.extras.720p.bluray.x264-ingot.pickle new file mode 100644 index 0000000000000000000000000000000000000000..3f60f89b75e24211e813aa7641027738b424170f GIT binary patch literal 3335 zcmcgu-ER{|5I2y-sUabNgj%&o2UR74az1|$Vkb@{NWw=#Ohn8Bs^GM~TW5}(?~dKQ zB&HMnloot2}e<$Hp9B3jHu@-P=fgdAx$ zjaGk`S)jzG46mN(3*&-?mIxVD)J4MSH5BM^M>yMb$+1LFwj43J@EJv^mhZaM5)M9% zyBiEeQoF}{6SWw!i9p7orTBBI5z;BGP}NpKPb(El1+7?~EzHaoXS6G8jp#`vM>u8M zl;L6{U7Wla5DTbL%Ae1dE85v5+H{CFshG2LH*jKgv&+5JsRo2oTCu9t{cZeIidvyE zJ6)PB6namLSxTO+yu*Aql4FbUezCWI-}Cj@z9|h?G4qtx4!O`7-6pORTclJC7};zS zT&$;y(H_52F2||BNBk`Z?ayuCW-;A_oH4s;a>_Y6Zk|dvjW9=6vcs9lfU~-kTnHZ%$hyyZXgVIzLk?6y~&m2$(nKw5vh{H$1na zbQ(`nLU*aRDF6w|YRnP+dP+D@P<%&ve4-Pe_D6bLjd=UEpu55V(RSxF3kX9)=WjJG z>lJnN9n2!k6d(Jy&kDCW@!MtB~*737<4$Vex@Te@&wcf3tsU~++@vY->)iQr&@DHy&K9LQv9 zr(n27;Vj;c@qvgvjB+onn4!wH6u_OGW;X9jdug0vFU|J(W>&Ho3#~jhl zpD&}R^fKBWTa7MIUdu(0UDFT1C>)N%0ON3M@{QM)QP;PKDr{I>ulJX4CfEKEG7pt6 z!~lCeHc!0*n-2H&N@cpL7yoB~!i-$+@q2X3fBN9SbYixH1RJi>m7PkVT$YqAe1- zBDuAmunl^!M+LVC*3hRi%UV{cdSN>1V#~#4u~0P$H~SoQc?2ArVux13OUO2slv2}< zs~-~HO$n(aGxV@kIxUAZUG>7r^w{J3Pr7nqaFPmJ&B*r#M6BSZ<6)yGF23fvXjxYt z-+!+92~sEGa!$>F`NGHckKP=PV;sptJDjTwn=qRQo-Jypn)7H9X~cE?ojtU=95OwB zCtCTe`{HicjOP_)ImhV*KI&1k)FlC@HilgFUE#E`AHAhMIQR&HFy}Z9?Et(+{Dwuj?DGKJx2QYz=;#(9)j77c_xNYA4e6UuTwVaGNfIKh-=)0V4-B6QeDatjv; zGwOBDIHyi>*oeJkz`_l-;lXB$(m=;?WLt^AZU_&dnYJkkkgm3#g4>059lS31T?n4S z{VuT84Dc?9E`+cPok@65?>ihG?)CnVs>4woBaBI@0wYJUyeEU^orueEQ!yYq)R2g< ztB1|7N#H{{oXi7oM;^Sf8iDy=sV2wvHF>4c0Ym+d?VG70XvvWTl7paU5iDxp!iGL{-{de(bRnjc_IFbl&ai5lL1&DsugL>yA@ndayK*E275pM6lI6bR<0)-`FoBnb zVnD&KC=Zdf=fYDp1mnm=k*Po7t~`JK;;ziv4we(9-o#?oR{b6o!YMpnnra-XCxr&9 z3o;Fx7%maV?P_lftn;wRIUhv)5j>7DR4FGIf=}T|nm%3l0>M#vJviV?_zF|?rPPOK jus6Bk8~FAw84cgT_b=z}5BqWueyqb!@Em@Qb1VNRCO7SJ literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_bored to.death.s01e03.deleted.scene.720p.bluray.x264-ingot.pickle b/tests/scene_responses/api_details_bored to.death.s01e03.deleted.scene.720p.bluray.x264-ingot.pickle new file mode 100644 index 0000000000000000000000000000000000000000..5803edddf65e934c4562bf355c907484f9926749 GIT binary patch literal 3375 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 literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_hd1080-wtl.pickle b/tests/scene_responses/api_details_hd1080-wtl.pickle new file mode 100644 index 0000000000000000000000000000000000000000..e963b18d705b36da067bd85c4dc7d344f40a6266 GIT binary patch literal 3175 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 literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_side.effects.2013.720p.bluray.x264-sparks.pickle b/tests/scene_responses/api_details_side.effects.2013.720p.bluray.x264-sparks.pickle new file mode 100644 index 0000000000000000000000000000000000000000..36a49f1ce3738d1437e372619c7d4dbfe42190dc GIT binary patch literal 44675 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 literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_voa-the_omega_man_x264_bluray.pickle b/tests/scene_responses/api_details_voa-the_omega_man_x264_bluray.pickle new file mode 100644 index 0000000000000000000000000000000000000000..1b7719da6ea3df6ff2823f28d5a63951ae7c653f GIT binary patch literal 3251 zcmcguOK%iM5MJZQItzXP63Po{LM|A2cJ^U|jn|IAHV;1*3oi$RVAMO)c1=7xGw$wL z+k~JXMTCu7N+c#qq~s7OLE;!ix#S<@FXY5E`4_34nccMm3W-Rvhn?=~>gsxZRrOKd z7f+95;-4I0bUUP6@O;C!smmidc%AaV_c)CnM`I7752Mp^(6oF{P)|hjnMfYyf{2hK z&8E@vFER_1*p%Vb;~imKu+S1Aql!9DIK7GjJ?;pnNf#VTv}MZylMA0wlxq2|OD*Bx z)403FP$ae6yw_2SKAQ++>|2OGCu<=c*9z0xQs`-=LaCq?%jXMI=aF)GwH7^$8Li>p!OUcufcbM-+a%eu@&$svQdcGdpH?H9-W**lXAs0HMP2xJSMM~9xk?dyEj4pC^`4I2(-ZGacD*;Ft&&~+!X}+PS1J@{w15bhHD+FZ4G`?{dJ!T`~5XEX~4Lqlh8)Gp~$ z>gpSqMVKqPV8p|eWJ2fE3YjDJ@N7Lft98!SJ7?n!)SjUB<>F-dY(ZJzc$OR5bUmyu z_zmKC9F1bs^@)uSg}g3%Lx%Bt570t>-Y|A{cJi@n^OoN*NZ=SY6~uA5(e#NffSP`T zZW6OWJae~ncEYT?AtR_)7917uz36rXhZ6We|HWH9nM~!Kg=_P*n`?{OmD=ixwszy< z%GG)8lx`ST7i*UcW1+T?oRsnf!&t1In#)y`W9BLfU$_yDaOqsRP}ElaCbhLS%J6yg zxVu*|lEYlZh?y&O-`-RAi*qmFMQW}R%+-Kuwr_Xbfq@b^V=vw5segJ%1-!`nmP&PFRm;3uQUSNdrD; zQ?t}10jD;GT=hudG_ZHPram~N2!b(M&Maq^etWYo^GS3aW1L1df{YwlV>BQ*JfxxR z26Ui71^6hm_wr&bf^%^5`I?anacofC1E(FCyP-DN2-W69u!pxjY~9JkgkwahoR6E_ z2(c_02)&!0BNr0NVkcpTHt#yYxMtH0R}C=euz}x^+mo#e1-ddV<^8*G`~ z%@(DBj-x|UiNMYU_n@Bk848fDwjP1of<_g*7Wgd)9>I1C*m4GV3q%V-*oD0@xLfTw z9PaJ+exItYQ57SMNvQ%O2eD`;L*ea+%VAS7AUf1Qhp?-L^{`Ihmh4Y@H{6zot}RDk z{#&Zap#u$BY1Ct=|Dgl(PXrrsAc15z=vf4d8jdhyWS>Vck>DrUkJDF(DW$z^V#0Y- zO&;isVf8h6KrMtGW@bwcq@aQy#BsaQ9@(lqtaHx0 z5x)-)Vhr8?y*I`Xd<+lM^l8DT2#%@01_yiwpJS>%m-_G+_9r)d319swqv31#=K0+H T_COB8cUAZvp1{*MxAK1gYiZgw literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_details_walk the.line.extended.cut.2005.1080p.bluray.x264-hd1080.pickle b/tests/scene_responses/api_details_walk the.line.extended.cut.2005.1080p.bluray.x264-hd1080.pickle new file mode 100644 index 0000000000000000000000000000000000000000..7840adf98adb5405312931b45d972aa1ae091234 GIT binary patch literal 3367 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 literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_search_Bored_to_Death_group:iNGOT_720p_S01.pickle b/tests/scene_responses/api_search_Bored_to_Death_group:iNGOT_720p_S01.pickle new file mode 100644 index 0000000000000000000000000000000000000000..f7f87bad759883cf8c8eae6e03a3a6a8852e9b55 GIT binary patch literal 3650 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 Q_@W7afIq^Y;@m3!3ug=}uK)l5 literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_search_La_Bamba_group:Grym_1080p_1987.pickle b/tests/scene_responses/api_search_La_Bamba_group:Grym_1080p_1987.pickle new file mode 100644 index 0000000000000000000000000000000000000000..e5836d13cd16978b684eaf9f73e8a0c22abe7e77 GIT binary patch literal 3499 zcmcguTW=f36{c-UR2WN^6VynM7}&BfUUk};>t~*m_Ut6ajsacY1f;yYZG@y3Fqh| z-;T`9t);80Z3t$y@}k!Aj_^|}Yo*%Kd}XOrO0SqSl|EfXfO$?RCmYeek?w!wdV2J} zSq)c_@T}GgxX>9rB90xsNSW$0a?m5V*hv->sk}1o6=Ir{^Yk8_IF5I$d(1wtUF6=3 zxyh~i&4|05aL>J_G~_uIc-%X*(S!M2+%%F+z!|f;9gh0Z^(!LiSpoHL1Pj5OZ9aIw zZxF9qd03k}G|7?hkCwH>Q7ei6b@aa;`+t7q|7C59JkoC-(3OQsskE&5M8Jx%tlbg9 z-*%n8vMGB+SRX$>jXsyuD}14^xtLd&qDo>qNo}2`L^-WqiP=7qli7o}Y+s2_rQ!~C z4+J0~72Zq;=ND^A@M0<``ab&OVk*{-wl4|#NEje`&a!3#Vd%P*`|a2D=;+Is*_gk& zV8q2zWJ2fE445tOB`@#By!Mc{JLJvw&>sZ-Q7z9`ZG?2uC-q` zjApwTb1KD>VXUO z_bxW!cqUOT6i3D8aQVy`^gq?sh3eeGw-?vdrxcgXJ-t?&U)0O${Qt4Spdpvjj2g!F zJ5&~|?V+Pb%_)ECC32im!c`A1Wua~~|+J$M((2;*I%mfFm21<`W4j0xh=aE|4!&$4UpUKG(*&v0QR}50pLxPV_<-IVi^3Vo3&)(RWSZ`D zu_O+ul~~Th8Kgz?^AxQmvmMtv4%a^&eEnw7jWCsZIY)#A@2Aupb%@WYg&|jSTi89E z9nYx`f-^xdMjM%p%=$+^$!6XU?_rFS$cB)Smv$KS2?ClVw4;EI_ox65m0q~L)()Wo z^vRx)4-m?z>47Lu=I^Twj#jm~;`i~ii*O=FiU@5g)nZ9K{gMI=I8aCF`NW8olWKI% zY8Ksh6sW>eX literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_search_Rampart_group:DON_1080p_2011.pickle b/tests/scene_responses/api_search_Rampart_group:DON_1080p_2011.pickle new file mode 100644 index 0000000000000000000000000000000000000000..ff9cdbc6057c040fc5732b7e126d7068c9afe7f3 GIT binary patch literal 3483 zcmcgu-ESMm5vOfRR2WN^6ToPY8o06$UpfYI`Sw>vvK zJKyvBF#p-7v$^;uuQ2)~q+Iawz_+Q(BRR82dEk4TM!$#_KZ>43H{?vu@;yO45w#wE zP-2vauHdEB?;k8>o0cDXqO@8vOG~8_!aT=2N*Pc(8zOIMVUG*~!o&iyw0AoAzfdvj zW}x;9RkKoAC>=bD-Dl2`xecZItO~@Iu`#p~G(e-P=@y+F9yS4&@I4`Op9%xSz`dO9S)=L4VXLE47=Z@`>YFZfMi}u;2Cv#PK+~iBZ=l zHa-;czPuDN%&9d%pYc`0I5{~f$H6LF{=guCV{l5C1x8x7#u4+wU==IZh|AVcC5xF2 zj!MB{bP&PCq+P(&+wWb-<(l7W@3gw_?QUpyyW97*-3M>qzt_@Ax?$Yg=)PkZ?QT0c zsg_N{*yxnji%sR0^`@$L+z3awbiHO)v~B;G+S)E<1L9$H++ov54vS4AW^VRUUA1LFR8`I6c5wW{h;ZF%LZ%j)_I%F5xsUazk-^veIawxA^&SvHL$`?YHdHV)9q zlcrQWV~3n(lyDV=tIs7m7Gu(bal*}yXXTi5buXRtNpIdHEE|(IWT6-Mu47@BnNxaW z3sAlM5wghF+w>6Ivq*03CTtUA;8DRXf_?5(7TBRxZQNXmMmVZ*Suqwd-;ZHtY%3?fIU!<~ z?KvI-1mfaru8Wq9%R^O1DOF(P3^wcp z{vJeJ&h-=nR)+$YSazMTANC0x$*E*!gCj5QY(?<+M#h`}`u&#=Wx;l^oiOz# zHnV{m)u<4n_juV;kfoC}8tg8}G}Xg!i8yX|Gw|2pVV`r35l`LvQ}`Ly&@0>8cT@$z zr||PMc|L<*VrjJhduhPu@aq>PKKurLdnUEvckl&ni)Zo~{s4b`K6C$+W?<44;LjcS M3;Y%S7H3xZKO#LPQUCw| literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_search_bored_to_death_group:ingot_720p_S01.pickle b/tests/scene_responses/api_search_bored_to_death_group:ingot_720p_S01.pickle new file mode 100644 index 0000000000000000000000000000000000000000..e4c18bac28c7a3c5d09cf7bf1a6e9d92fa68272b GIT binary patch literal 3650 zcmcgu?QbJT8PD~c7u-uO*GeaO3iq8lG$dx zySFoQJ{1Z|843CflafCLgC_<#gRd_oBEk^iFK_&fN`?%GatC)$dNDDu2K&&)pa zd)|KU<~~}O8cF`-^^iV|C>Olg@onnzSWfIw9{3)o@lWHK_u^;q9XZjmd{0nM#I=9F zQwS-KT)_*=-%@jz5>5-tg?oNT?V|9DbxH&)?wh6J#y6UK>-)upvKbWbxzQf!7SGCe z=X9s>V5eD_E!ae;lV!71(o3dpE@-B?ocu$`2yfiqfw)U~y4>H}&z8>)X8Tsu{Kym7 zE_;=8kXlXSbRxn$=26TEjoVuvpT} z#pU@j9MS*8q^0iDRSbl_8_UUBvaa>lU-5iBdEcytS)x3vbs{eGke(3NNnWH(4MK9% zA(-rDlZn2*GVXO^S(NkscXZ;q{;BSV&XMCmx}Hk2uj=cGbSINuc|+Zh=TzXhf9wFk z{5}@7Y!UG=wA(F?`vLuGsq8d<4qvs8|}pggzWnPrcyXc5V8?U2%BI{23A-4+o($L3D*~Z!c!(=R zpVFAll1r!kO*ySziF_OC$=uP~PN3AM`syzAjs(L-U-@yiakaEmQkvKLnxY#3kZXOt zX0rUEpl8BhqT{Y;79%0BTYb{JuP>^juOYM%z`6*DhiVWCol`3c9f7C3wx7zH1KIvS zHroLp1b|dZ^Od`%0>$wxH?rw|)UNv-;&>c5p=|iX#)l%_mRF+?K~-k}jV~L<>FH@P z@mA6DI|d0HgHsY(%t+GM5WbP5uW=OmQLvn3u%Xh|K-|njOrL`C6VmDt6)|!lJwr@op zT%n=dX`STSD$!U-4_6DH2Oxzth5}PH$Xc;#1j?ciKg70C1o+yE3x$>z5{(FL;0J9N zF`&)ORd7{y7;jBpi6<+R@-Z9V)~~P$_HqI{n_@R+K7BzeFZHXx+x?OL~&4|Hp)5HTkuEYz-XzSrd(I902lR#mZlJ zjvNa?3Y1T7JQw}Q(6m6K{Y?)V>0s-|UPedK!o5ktehlrkUXK^6M9 zpdw$b(?bGMlAhX4)rR!Nqk>xmHSk=Hhlf^q>F#{oLm$VqWG=M`Zw)jW@)~n&ingyV zFGFoIErl&Rsb1K4J=@4`YDFIUuXE^-wyVByGZTCKvZN=chm!2Ftr7X9;U+3@%kjV- zh>NeeE?(A?uUwX^7K7dCq#V;$5cXLv{8!lJPTsR%{lP{Y%Gil%z{b;TsmWryMUT;G+Gs-MnkHa&C|)558-^b{s( zlZIVy7%8tnBlS|&1|!f$hl^uM127d3K3sur#?G0SwVkI-WV6$AcGhFv279~5-s!RL zoU>;=_T8-!_Pri^x5wUN-)BFVVedBvfV1<9=;u_OjT`VVf>Jp~PN00J9Q`2Xa;l{i zkR6J7BJCPcJ8BblBuCSJ&K&vD&Q{Eh|2NZqoCBDN0S_4KV~0h;qwvu z8Iq&^-;;y=g8lMEq0fHBetjXh*>BiyvCLnHX!d*dhv#GWkC$SQ{i(tJ%>Kgun#5M| EKl5Q(umAu6 literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_search_bored_to_death_group:ingot_Extras_720p_S01.pickle b/tests/scene_responses/api_search_bored_to_death_group:ingot_Extras_720p_S01.pickle new file mode 100644 index 0000000000000000000000000000000000000000..9d338296c1fe3f0d86a42bfea080c3d3745bbca5 GIT binary patch literal 3689 zcmcguYilFd8TQ8VrOMjtO<-wA7p5u;>)_Go;=5&oSMpx$wQMYHX(?WDG;{1T-OA8ZsBC7uL ztz1BP=m?%${ehZ0lyI6`&E4?=YUPEOuTdgczELRVx4zdr*lgsNN(DcE#|aNeH-A=I zoY(F8y}f2`E@u&;PL>MAqFyZMg(a;}SdIT7WQ5o6?m^t8JXtml8tL-c;auN}su#Kf z+ePS{lEAgyV`Ui>@T{PVY3^2AnRW{bw}clDmNHSzpzR4I*g6vd;jvJe8&B|rTe-t$ zk$jm8B0>%jEE?_nLrySCEE)i-R|n{E5rn1)fem)6faC!Xbh$0;6I!!P(FaqGx43{k zxYhI=hnm6$)>!QYxRP3Z-2=d$Q2<3UQ;Ub2&5+J%g%xc(bhT2URM3j$)xy$hsi@uC zZAR}#a-7rPga(*2(#efYpO}mqrTl!pysX`>(Y8(8S*1Kd&wM*JcVeqQyV+#noK{@X z>fQ;4<)T(tUR@}`C;d-Mnd&}Wg+t&uk({c=>uP`f9oN(2_swaT#maM9C*(p8=m~M` z_(jT8KOn~)g2{e5ne6K;<6bAGNjdL-M<`pOT}jnU%DiqgE= z*A!hJfL!hCHRI(s1w9i66CGzwGZ_hh-TI^EU42;{eGQ?F0M?NpE(${+bWY7Mumzs- zS|gD)2eQUMHrD|l1b~!_3+2Uv0>ySsC$wlIY}dRFv0V$$HHm)r(Jxv3arBVRFmWmte8Vp%8&eB;Gs zLrcnvMuax-info4(B|jMxGFu2C&!P)%N1DJh)wM3SJ)(bIYysNv+J{8p}Y-h&sQpM zla6N+Ra?=}9uB5oYh-=71S~Ini3Gg)f&{d=r!Oxrtmwu6a~86yyw{JkfuH}&>|ysRf*xhz-h2fH(IsirMI@Pr4x0W`;A*G6*mlyenWGp#mKhTk1l0K-ir?4+_Vy|>kjSe4P|Ye_Z) z_fg#j993o?sReqmTHNrvIPHReBs>>fs8r4u)YGpimVpjD4A19!vYb-Ac22YCk)v1` zPK_t0Fi9FX?0UmUI0u@nn=m>UffhSlJfYMFivbzL73g&AoVjT)ddfsPJ3VJ-J=U$W zH+$@@9{bTbd)8w=-Wg#(>9Mza>>c(~_On^`ZhZhaJHLp2MpfOY4i6(Jm1E>2ig`li z4t{%3-HettdEa~;kmM`t?MC{4`X4=HMY14_4en#|KhQnuxyl*Kz$R% ztfQJb3PewNb%D}Y3+@uJ-|qKWW1WX>&N)1u!uoUe3*^w`w)>aSIEUCT z*{{>^d7piN# literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_search_fawlty_towers_group:shortbrehd_1080p_S01.pickle b/tests/scene_responses/api_search_fawlty_towers_group:shortbrehd_1080p_S01.pickle new file mode 100644 index 0000000000000000000000000000000000000000..fef3d081858a6ed36059d3a5d5ec2191226ee830 GIT binary patch literal 4290 zcmcgv|7#n`6<1>UOO@Dh?jZEI2DU1J_|R%s-yB(%4Y8!0W5=?wltL*!G1?t_wqEUS zW@atxa%u12dS{g>lyHTof7FtT7l>XTN;{KJs*Id!2yf@$8 zd!P3{^I`I{zb+=ipSVHs6CX3qvOU+tHVeeuK4zZlFdY0MSo$b<7Tgtc9m91vc6hL{ zJC#U0O;gN#o3nJ~`?76g#BjQjet`NmA7tBZA5)fX>A8lU%jWd5?qxS@e;*C9r}^cg z+S=URZ*S~3HtXq3+C*GV&Fi@pHJ4NKx{@nY^n4{(1R+7J`Cu2s1I(gsYrhqDpJiUM zb^cOY=Zck*{;FFSF1PhPxcIAXUA)}Z#n)i)(&e_!Rf?}{@a4;GU8?BIFEjW-W)$r; z*LOHXpPbT1)Uli+i2zUl1knLB({~O-2;2dUJ3NGeY%=0f-ldqBay$e?r~wGMlRkJB zh--`^?lVA{iG%HbiCKb?2^b2*n`3w~PJM&>fIJwj0pK12L>*>v>jc*=gOAWEW;%?! z6vL{9Yuni17JwOgyA+nh=16xRaGjLs3q-OWer~sYoKf@@Wy^PzydFalg0if?Lf@e!hUVk|BmCT;r%iSv_j>K((@TtDLz5A72Zf5 z)uZUBhoG?+H|9qA@^Eh>!@!J<_EC{-yM5KA){*6a^nN6bcUA9)(%o2k~ieV1Z z-D3+Zm})_%7I%C`soCu?SRYKkW_B&UvV2IE4XgabGbt)L%*ijaW2=0~4o$qO#D-dn z?XQCUArVUZLx7I#zpCt@Q}zB4Ub~mq^;N|~oUCc9$|mRDu4516nUW`n4&d|M@N+}n z!sBYgfw+QTl^Tn2B3JQfP%O$@LT;bviR97ymM7I0M(Q?pjyQpVk@BN>U@BiMNzLmc zO+N6zAlFBF?Xdezj!(Hpc+Xx{41y@wZtZdVfm)VR--6JF09H9g4pbh>RfY|pS{$zO zRx6UV$FkN~mg#{(5E!J8D;1V?X%x#bY~RE!zgu^E$Z{Ci3F?!JOxVb0T`}cT2&#t! zjK(UO*6;VTp|`Sz+tZL|X$&K35G}&77GYRBqOR{%CNS1Q3~PX22y<2z83twRfSZMnm(SnRNilA&0fNaDq|6XIKwLCDG-%K=7#Y}n1V z;buee#zna-J21K!rfA&psLNg88DP!n(6ND->N6(8YO&J=m>gp>J~<1PU@R=O=f;{M z*>T){u=T<4>-YR__|%X$XYlYKpN>Xnv5h>2O>ns^@Z9P_jroTBz?+35@X>Z+JF)eb zbTaX2un#_tJsXgOxUomEhk*ISuAMk^riVFkVbQ5~8|{G92!1|~qKk5KvktonwqWU@t%dVF{>kBwi9C8E9t2D* zbff~HL$XnTUDNOST||z=bX4PsC9dvn2juwGj`neQ8hJD^f1z;86J62d|NI5&6%Z;y2>43Bou`N``vR} literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_search_side_effects_group:sparks_720p_2013.pickle b/tests/scene_responses/api_search_side_effects_group:sparks_720p_2013.pickle new file mode 100644 index 0000000000000000000000000000000000000000..23226bda68b379166006bcdd21b0aeae53e9056c GIT binary patch literal 3639 zcmcgu?QbJT8Bco7OWjK@*ON|E<)p>vq)V0cuI(h}I8H>)&b=fTCyISY2&HDcJIO3r z@9yo)Ch?VnR)RK0i-cg?4}e6ag31RZK;k1peB^)NL;n?iv%9tv-HCFd!XLad^E@;2 z%eyFu12xKmn^YJpK`|a=0a|6I!qOT}hfuj`lqOKH56@9s~R8}7Bw4x8AaFSF1g!&jX z)4|ORj~I+<#r$HvR95cPX~!bYyi}f|XPy#4fh0}azW9{m8D`u z*9TY381g(-I^K8fD4eOq^V(qkO~+N^_bn(G#mWmxH{e3`=?Sr|_(jrG&nHJ+g27%o zm>%d$s&2&6-BddMjyxgDslayk*aCvtCMLCX z5^&!)J8h2h0sUIwtgywEL*g8-+zlL;2Zps6aI$=IvRu&JPI*;Hfm%!PSAoBp;J-A& ze^uEbXX?fgT|)rrtBOYiThmsRheCL}j@^?sWlo6S!{^)a=bC(lC)7;`afLXQ8gpqz zsdTUy&dFCI$wqo%=IEK_N%h%*x=o!U!LTq;ew;2`DU|O@&8q`V(enVv)q!3so_wG= zNU5+?TGk~fmSfm~Nt;2Z?skdgaNvYm;Sv)U1-uhp348=qodGmn(X`Xk(|qi$yy12= z;#nG}#5b5GQ&>yWS3C0Ez^fz~tjYA%Wa=WqnI%K97ac_GwWMaTiF@B09~-NFqrO{f zeP?e|dDz-{tn59x_xMpw$*G$5XtQ-+)9S5yA}Qu|P1|hb*0WWK&U#g5J|@BvHeE02 z1!c!Qp{BA&{Vs9fCA(ME5@EKg#md!=Yxd;+!um^ev6`)V>n%nV(=~!Fj!;nQlx}=% zl_<=ohikd70+8G~LxHJkWIbQiJZX`SKVq6F0(|}Dg+fURi9&=j^no8bnr8G^@wM;a3w&|6Q(? zmWp4VYqwsKYZiCaa(QV*E&QJoj@80%4PtBP;8#sFws`=^M-?l3;W^=?4<;aea{Yzq zM}{T^8trdx*hq&<*Y{Hnk`(SO;tzW0op7q{xwd7X0?kVEQ66NW|2|a08+Cd}z(kT= zdx_eJvp7_6gP;bUhg1HcQCwMGiu&l|7#8%EHsS4|MkBn+P-oEg<>5uB%_OC;ZN}9L z3vZ_j=}GOtLI1T5Ez+^&4L4JaKR~n=0xn%D7X8k=Z)8US;|#M;~_F064na7Q!M3m`Sfd&NubM)!t;f`8_vjnx}cc!(3VUKyC#!e7$i*^cD$T}M};9&%%bWAvn@|_U#gNTQ-ZK;6lkjxWl*9ba6 zhp?k?BI)PM3SZmZj@a@4X4^eH5Zmn!#Rh?Q&@k>euf-+ee1!E@i>Rr&)F~1@cEd1g5;?G=j33& wX1{q^=(FFlPcH;F`;7e#)9i(aW}mY^ycoNGycC1%PYw2G_80coIJWZt1}S(})Bpeg literal 0 HcmV?d00001 diff --git a/tests/scene_responses/api_search_the_omega_man_group:voa.pickle b/tests/scene_responses/api_search_the_omega_man_group:voa.pickle new file mode 100644 index 0000000000000000000000000000000000000000..269732da5f9345336415b03fdaed7b9968973333 GIT binary patch literal 3574 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 E0T!29LjV8( literal 0 HcmV?d00001 diff --git a/tests/test_scene.py b/tests/test_scene.py new file mode 100644 index 0000000..cdff79d --- /dev/null +++ b/tests/test_scene.py @@ -0,0 +1,624 @@ +from pythonbits import scene, bb +from unittest.mock import patch, Mock, call +import pytest + +import json +import os +import pickle +import contextlib +import logbook + +# Silence guessit +import logging +logging.getLogger('rebulk.rebulk').setLevel(logging.INFO) +logging.getLogger('rebulk.rules').setLevel(logging.INFO) +logging.getLogger('rebulk.processors').setLevel(logging.INFO) + + +def mock_response(text): + return Mock(text=text, json=lambda: json.loads(text)) + +def mock_html(body): + return ('' + '' + '%s' + '') % (body,) + + +@patch('pythonbits.scene._yield_file_info') +@patch('pythonbits.scene._check_dir') +def test_check_integrity_expects_APIError_from_check_dir(mock_check_dir, mock_yield_file_info): + mock_check_dir.side_effect = scene.APIError('Owie!') + mock_yield_file_info.return_value = () + cb = Mock() + assert scene.check_integrity('path/to/Foo.S01.x264-ABC', on_error=cb) is None + assert mock_check_dir.call_args_list == [call('path/to/Foo.S01.x264-ABC')] + assert mock_yield_file_info.call_args_list == [] + assert [repr(arg) for arg in cb.call_args_list] == [repr(call('Foo.S01.x264-ABC', scene.APIError('Owie!')))] + +@patch('pythonbits.scene._yield_file_info') +@patch('pythonbits.scene._check_dir') +def test_check_integrity_expects_APIError_from_yield_file_info_with_file_release(mock_check_dir, mock_yield_file_info): + mock_check_dir.return_value = None + mock_yield_file_info.side_effect = scene.APIError('Ooophff!') + cb = Mock() + assert scene.check_integrity('path/to/Foo.S01E02.x264-ABC.mkv', on_error=cb) is None + assert mock_check_dir.call_args_list == [] + assert mock_yield_file_info.call_args_list == [call('path/to/Foo.S01E02.x264-ABC.mkv')] + assert [repr(arg) for arg in cb.call_args_list] == [repr(call('Foo.S01E02.x264-ABC.mkv', scene.APIError('Ooophff!')))] + +@patch('pythonbits.scene._yield_file_info') +@patch('pythonbits.scene._check_dir') +def test_check_integrity_expects_APIError_from_yield_file_info_with_directory_release(mock_check_dir, mock_yield_file_info): + mock_check_dir.return_value = None + mock_yield_file_info.side_effect = scene.APIError('Ooophff!') + cb = Mock() + assert scene.check_integrity('path/to/Foo.S01.x264-ABC', on_error=cb) is None + assert mock_check_dir.call_args_list == [call('path/to/Foo.S01.x264-ABC')] + assert mock_yield_file_info.call_args_list == [call('path/to/Foo.S01.x264-ABC')] + assert [repr(arg) for arg in cb.call_args_list] == [repr(call('Foo.S01.x264-ABC', scene.APIError('Ooophff!')))] + +@patch('pythonbits.scene._yield_file_info') +@patch('pythonbits.scene._check_dir') +def test_check_integrity_expects_SceneError_from_check_dir(mock_check_dir, mock_yield_file_info): + mock_check_dir.side_effect = scene.SceneError('Nooo!') + mock_yield_file_info.return_value = () + cb = Mock() + assert scene.check_integrity('path/to/Foo.S01.x264-ABC', on_error=cb) is True + assert mock_check_dir.call_args_list == [call('path/to/Foo.S01.x264-ABC')] + assert mock_yield_file_info.call_args_list == [call('path/to/Foo.S01.x264-ABC')] + assert [repr(arg) for arg in cb.call_args_list] == [repr(call('Foo.S01.x264-ABC', scene.SceneError('Nooo!')))] + +@patch('pythonbits.scene._check_dir') +@patch('pythonbits.scene._check_file') +@patch('pythonbits.scene._yield_file_info') +def test_check_integrity_expects_SceneError_from_check_file(mock_yield_file_info, mock_check_file, mock_check_dir): + mock_check_file.side_effect = scene.SceneError('Argh!') + infos = ({'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E01.x264-ABC.mkv', 'size': 123, 'crc': '1234ABCD'}, + {'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 234, 'crc': 'ABCD1234'}) + mock_yield_file_info.return_value = infos + cb = Mock() + assert scene.check_integrity('path/to/Foo.S01.x264-ABC', on_error=cb) is True + assert mock_check_dir.call_args_list == [call('path/to/Foo.S01.x264-ABC')] + assert mock_yield_file_info.call_args_list == [call('path/to/Foo.S01.x264-ABC')] + assert mock_check_file.call_args_list == [ + call('Foo.S01.x264-ABC/Foo.S01E01.x264-ABC.mkv', 'path/to/Foo.S01.x264-ABC/Foo.S01E01.x264-ABC.mkv', infos[0]), + call('Foo.S01.x264-ABC/Foo.S01E02.x264-ABC.mkv', 'path/to/Foo.S01.x264-ABC/Foo.S01E02.x264-ABC.mkv', infos[1])] + assert [repr(arg) for arg in cb.call_args_list] == [repr(call('Foo.S01.x264-ABC/Foo.S01E01.x264-ABC.mkv', + scene.SceneError('Argh!'))), + repr(call('Foo.S01.x264-ABC/Foo.S01E02.x264-ABC.mkv', + scene.SceneError('Argh!')))] + +@patch('pythonbits.scene._check_dir') +@patch('pythonbits.scene._check_file') +@patch('pythonbits.scene._yield_file_info') +def test_check_integrity_calls_check_file_correctly_for_directory_release(mock_yield_file_info, mock_check_file, mock_check_dir): + infos = ({'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E01.x264-ABC.mkv', 'size': 123, 'crc': '1234ABCD'}, + {'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 234, 'crc': 'ABCD1234'}) + mock_yield_file_info.return_value = infos + cb = Mock() + assert scene.check_integrity('path/to/Foo.S01.x264-ABC', on_error=cb) is False + assert mock_check_dir.call_args_list == [call('path/to/Foo.S01.x264-ABC')] + assert mock_yield_file_info.call_args_list == [call('path/to/Foo.S01.x264-ABC')] + assert mock_check_file.call_args_list == [ + call('Foo.S01.x264-ABC/Foo.S01E01.x264-ABC.mkv', 'path/to/Foo.S01.x264-ABC/Foo.S01E01.x264-ABC.mkv', infos[0]), + call('Foo.S01.x264-ABC/Foo.S01E02.x264-ABC.mkv', 'path/to/Foo.S01.x264-ABC/Foo.S01E02.x264-ABC.mkv', infos[1])] + assert [repr(arg) for arg in cb.call_args_list] == [] + +@patch('pythonbits.scene._check_dir') +@patch('pythonbits.scene._check_file') +@patch('pythonbits.scene._yield_file_info') +def test_check_integrity_calls_check_file_correctly_for_file_release(mock_yield_file_info, mock_check_file, mock_check_dir): + infos = ({'release_name': 'Foo.S01E02.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 123, 'crc': '1234ABCD'},) + mock_yield_file_info.return_value = infos + cb = Mock() + assert scene.check_integrity('path/to/Foo.S01E02.x264-ABC.mkv', on_error=cb) is False + assert mock_check_dir.call_args_list == [] + assert mock_check_file.call_args_list == [call('Foo.S01E02.x264-ABC.mkv', 'path/to/Foo.S01E02.x264-ABC.mkv', infos[0])] + assert mock_yield_file_info.call_args_list == [call('path/to/Foo.S01E02.x264-ABC.mkv')] + assert [repr(arg) for arg in cb.call_args_list] == [] + + +@patch('pythonbits.scene.search') +@patch('pythonbits.scene._guessit') +def test_release_names_returns_no_results_if_no_release_group(mock_guessit, mock_search): + mock_guessit.return_value = {'title': 'The Foo', 'season': 1, 'episode': 2} + assert scene.release_names('path/to/The.Foo.S01E02.x264.mkv') == [] + assert mock_guessit.call_args_list == [call('path/to/The.Foo.S01E02.x264.mkv')] + assert mock_search.call_args_list == [] + +@patch('pythonbits.scene.search') +@patch('pythonbits.scene._guessit') +def test_release_names_returns_no_results_if_no_title(mock_guessit, mock_search): + mock_guessit.return_value = {'release_group': 'ABC', 'season': 1, 'episode': 2} + assert scene.release_names('path/to/S01E02.x264-ABC.mkv') == [] + assert mock_guessit.call_args_list == [call('path/to/S01E02.x264-ABC.mkv')] + assert mock_search.call_args_list == [] + +@patch('pythonbits.scene.search') +@patch('pythonbits.scene._guessit') +def test_release_names_finds_something_on_first_try(mock_guessit, mock_search): + mock_guessit.return_value = {'title': 'The Foo', 'release_group': 'ABC', 'season': 1, 'episode': 2} + mock_search.return_value = ['The.Foo.S01E02.x264-ABC.mkv'] + assert scene.release_names('path/to/The.Foo.S01E02.x264-ABC.mkv') == mock_search.return_value + assert mock_guessit.call_args_list == [call('path/to/The.Foo.S01E02.x264-ABC.mkv')] + assert mock_search.call_args_list == [call(mock_guessit.return_value)] + +@patch('pythonbits.scene.search') +@patch('pythonbits.scene._guessit') +def test_release_names_finds_looks_for_season_release_on_second_try(mock_guessit, mock_search): + mock_guessit.return_value = {'title': 'The Foo', 'release_group': 'ABC', 'season': 1, 'episode': 2} + mock_search.side_effect = ([], ['The.Foo.S01.x264-ABC.mkv']) + assert scene.release_names('path/to/The.Foo.S01E02.x264-ABC.mkv') == ['The.Foo.S01.x264-ABC.mkv'] + assert mock_guessit.call_args_list == [call('path/to/The.Foo.S01E02.x264-ABC.mkv')] + assert mock_search.call_args_list == [ + call(mock_guessit.return_value), + call({'title': 'The Foo', 'release_group': 'ABC', 'season': 1})] + + +def test_check_file_on_nonscene_file_release(): + info = {'release_name': None, 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': None, 'crc': None} + assert scene._check_file('Foo.S01E02.x264-ABC.mkv', 'path/to/Foo.S01E02.x264-ABC.mkv', info) is None + +def test_check_file_on_nonscene_directory_release(): + info = {'release_name': None, 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': None, 'crc': None} + assert scene._check_file('Foo.S01.x264-ABC/Foo.S01E02.x264-ABC.mkv', 'path/to/Foo.S01.x264-ABC/Foo.S01E02.x264-ABC.mkv', info) is None + +def test_check_file_reports_wrong_filename_in_file_release_of_original_file_release(): + info = {'release_name': 'Foo.S01E02.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 123, 'crc': '1234ABCD'} + msg = r'^Foo.S01E02.x264-ABC.mkv was renamed to Foo S01E02 x264-ABC.mkv$' + with pytest.raises(scene.SceneError, match=msg): + scene._check_file('Foo S01E02 x264-ABC.mkv', 'path/to/Foo S01E02 x264-ABC.mkv', info) + +def test_check_file_reports_wrong_dirname_in_directory_release_of_original_directory_release(): + info = {'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 123, 'crc': '1234ABCD'} + msg = r'^Foo.S01.x264-ABC/Foo.S01E02.x264-ABC.mkv was renamed to Foo S01 x264-ABC/Foo.S01E02.x264-ABC.mkv$' + with pytest.raises(scene.SceneError, match=msg): + scene._check_file('Foo S01 x264-ABC/Foo.S01E02.x264-ABC.mkv', 'path/to/Foo S01 x264-ABC/Foo.S01E02.x264-ABC.mkv', info) + +@patch('pythonbits.scene._path_exists', Mock(return_value=True)) +@patch('pythonbits.scene._path_getsize', Mock(return_value=123)) +def test_check_file_ignores_dirname_in_directory_release_of_original_file_release(): + info = {'release_name': 'Foo.S01E02.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 123, 'crc': '1234ABCD'} + assert scene._check_file('Foo S01 x264/Foo.S01E02.x264-ABC.mkv', 'path/to/Foo S01 x264/Foo.S01E02.x264-ABC.mkv', info) is True + +@patch('pythonbits.scene._path_exists', Mock(return_value=True)) +@patch('pythonbits.scene._path_getsize', Mock(return_value=123)) +def test_check_file_ignores_dirname_in_file_release_of_original_directory_release(): + info = {'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 123, 'crc': '1234ABCD'} + assert scene._check_file('Foo.S01E02.x264-ABC.mkv', 'path/to/Foo.S01E02.x264-ABC.mkv', info) is True + +@patch('pythonbits.scene._path_exists', Mock(return_value=True)) +@patch('pythonbits.scene._path_getsize') +def test_check_file_finds_wrong_filesize(mock_getsize): + mock_getsize.return_value = 124 + info = {'release_name': 'Foo.S01E02.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 123, 'crc': '12345678'} + with pytest.raises(scene.SceneError, match=r'^Foo.S01E02.x264-ABC.mkv: Wrong size: 124 instead of 123 bytes$'): + scene._check_file('Foo.S01E02.x264-ABC.mkv', 'path/to/Foo.S01E02.x264-ABC.mkv', info) + assert mock_getsize.call_args_list == [call('path/to/Foo.S01E02.x264-ABC.mkv')] + +@patch('pythonbits.scene._path_exists', Mock(return_value=True)) +@patch('pythonbits.scene._path_getsize') +def test_check_file_finds_unmodified_release(mock_getsize): + mock_getsize.return_value = 123 + info = {'release_name': 'Foo.S01E02.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 123, 'crc': '12345678'} + assert scene._check_file('Foo.S01E02.x264-ABC.mkv', 'path/to/Foo.S01E02.x264-ABC.mkv', info) is True + assert mock_getsize.call_args_list == [call('path/to/Foo.S01E02.x264-ABC.mkv')] + + +@patch('pythonbits.scene.get_details') +def test_check_dir_finds_wrong_dirname(mock_get_details): + mock_get_details.return_value = ( + 'Foo.S01.x264-ABC', + {'Foo.S01E01.x264-ABC.mkv': {'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E01.x264-ABC.mkv', 'size': 123, 'crc': '12345678'}, + 'Foo.S01E02.x264-ABC.mkv': {'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 234, 'crc': 'ABCD1234'}}) + with pytest.raises(scene.SceneError, match=r'^Foo.S01.x264-ABC was renamed to Foo S01 x264-ABC$'): + scene._check_dir('path/to/Foo S01 x264-ABC') + +@patch('pythonbits.scene.get_details') +def test_check_dir_finds_correct_dirname(mock_get_details): + mock_get_details.return_value = ( + 'Foo.S01.x264-ABC', + {'Foo.S01E01.x264-ABC.mkv': {'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E01.x264-ABC.mkv', 'size': 123, 'crc': '12345678'}, + 'Foo.S01E02.x264-ABC.mkv': {'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 234, 'crc': 'ABCD1234'}}) + assert scene._check_dir('path/to/Foo.S01.x264-ABC') is True + +@patch('pythonbits.scene.get_details') +def test_check_dir_fails_to_connect(mock_get_details): + mock_get_details.side_effect = scene.APIError() + assert scene._check_dir('path/to/Foo.S01.x264-ABC') is None + + +@patch('pythonbits.scene._get') +def test_get_details_fails_to_connect(mock_get): + mock_get.side_effect = scene.APIError('Something went wrong') + with pytest.raises(scene.APIError, match='^Something went wrong$'): + scene.get_details('path/to/foo.txt') + assert mock_get.call_args_list == [call('api/details/foo')] + + +@patch('pythonbits.scene._get') +def test_get_details_finds_release(mock_get): + mock_get.return_value = mock_response(json.dumps({'name': 'Foo', + 'archived-files': [{'name': 'Foo.png', + 'size': 123, + 'crc': '1234ABCD'}]})) + assert scene.get_details('path/to/foo.txt') == ('Foo', {'Foo.png': {'release_name': 'Foo', + 'filename': 'Foo.png', + 'size': 123, + 'crc': '1234ABCD'}}) + assert mock_get.call_args_list == [call('api/details/foo')] + +@patch('pythonbits.scene._get') +def test_get_details_is_redirected_to_correct_web_page(mock_get): + mock_get.side_effect = (mock_response(mock_html('')), + mock_response(json.dumps({'name': 'Foo', + 'archived-files': [{'name': 'Foo.png', + 'size': 123, + 'crc': '1234ABCD'}]}))) + assert scene.get_details('foo') == ('Foo', {'Foo.png': {'release_name': 'Foo', + 'filename': 'Foo.png', + 'size': 123, + 'crc': '1234ABCD'}}) + assert mock_get.call_args_list == [call('api/details/foo'), + call('api/details/Foo-Bar')] + +@patch('pythonbits.scene._get') +def test_get_details_finds_nothing(mock_get): + mock_get.return_value = mock_response('') + assert scene.get_details('foo') == ('', {}) + assert mock_get.call_args_list == [call('api/details/foo')] + + +@patch('pythonbits.scene._get') +def test_search_fails_to_connect(mock_get): + mock_get.side_effect = scene.APIError() + guess = {'title': 'Foo Bar Baz'} + assert scene.search(guess) == [] + assert mock_get.call_args_list == [call('api/search/Foo/Bar/Baz')] + +@patch('pythonbits.scene._get') +def test_search_for_movie(mock_get): + mock_get.return_value = mock_response( + json.dumps({'results': [{'release': 'The Foo, the Bar and the Bazzy'}, + {'release': 'Foo Bar goes to Baz'}]})) + guess = {'title': 'Foo Bar Baz', + 'type': 'movie', + 'year': 2005, + 'release_group': 'TEHFOO'} + assert scene.search(guess) == ['The Foo, the Bar and the Bazzy', + 'Foo Bar goes to Baz'] + assert mock_get.call_args_list == [call('api/search/Foo/Bar/Baz/group:TEHFOO/2005')] + +@patch('pythonbits.scene._get') +def test_search_for_episode(mock_get): + mock_get.return_value = mock_response( + json.dumps({'results': [{'release': 'The Foo, the Bar and the Bazzy'}, + {'release': 'Foo Bar goes to Baz'}]})) + guess = {'title': 'Foo Bar Baz', + 'type': 'episode', + 'season': 3, 'episode': 5, + 'release_group': 'TEHFOO'} + assert scene.search(guess) == ['The Foo, the Bar and the Bazzy', + 'Foo Bar goes to Baz'] + assert mock_get.call_args_list == [call('api/search/Foo/Bar/Baz/group:TEHFOO/S03E05')] + +@patch('pythonbits.scene._get') +def test_search_for_season(mock_get): + mock_get.return_value = mock_response( + json.dumps({'results': [{'release': 'The Foo, the Bar and the Bazzy'}, + {'release': 'Foo Bar goes to Baz'}]})) + guess = {'title': 'Foo Bar Baz', + 'type': 'episode', + 'season': 3, + 'release_group': 'TEHFOO'} + assert scene.search(guess) == ['The Foo, the Bar and the Bazzy', + 'Foo Bar goes to Baz'] + assert mock_get.call_args_list == [call('api/search/Foo/Bar/Baz/group:TEHFOO/S03')] + + +@patch('pythonbits.scene.get_details') +def test_yield_file_info_for_season_release_of_original_season_release(mock_get_details): + mock_get_details.return_value = ( + 'Foo.S01', + {'Foo.S01E01.mkv': {'release_name': 'Foo.S01', 'filename': 'Foo.S01E01.mkv', 'size': 123, 'crc': '12345678'}, + 'Foo.S01E02.mkv': {'release_name': 'Foo.S01', 'filename': 'Foo.S01E02.mkv', 'size': 234, 'crc': 'ABCD1234'}}) + infos = tuple(scene._yield_file_info('path/to/Foo.S01')) + assert infos == ({'release_name': 'Foo.S01', 'filename': 'Foo.S01E01.mkv', 'size': 123, 'crc': '12345678'}, + {'release_name': 'Foo.S01', 'filename': 'Foo.S01E02.mkv', 'size': 234, 'crc': 'ABCD1234'}) + +@patch('pythonbits.scene.get_details') +def test_yield_file_info_for_episode_release_of_original_episode_release(mock_get_details): + mock_get_details.return_value = ( + 'Foo.S01E01', + {'Foo.S01E01.mkv': {'release_name': 'Foo.S01E01', 'filename': 'Foo.S01E01.mkv', 'size': 123, 'crc': '12345678'}}) + infos = tuple(scene._yield_file_info('path/to/Foo.S01E01.mkv')) + assert infos == ({'release_name': 'Foo.S01E01', 'filename': 'Foo.S01E01.mkv', 'size': 123, 'crc': '12345678'},) + +@patch('pythonbits.scene._os_listdir') +@patch('pythonbits.scene.get_details') +def test_yield_file_info_for_season_release_of_original_episode_release(mock_get_details, mock_listdir): + mock_get_details.side_effect = ( + ('', {}), + ('Foo.S01E01.x264-ABC', + {'Foo.S01E01.x264-ABC.mkv': {'release_name': 'Foo.S01E01.x264-ABC', 'filename': 'Foo.S01E01.x264-ABC.mkv', + 'size': 123, 'crc': '12345678'}}), + ('Foo.S01E02.x264-ABC', + {'Foo.S01E02.x264-ABC.mkv': {'release_name': 'Foo.S01E02.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', + 'size': 234, 'crc': 'ABCD1234'}}), + ('', {}), + ) + mock_listdir.return_value = ['Foo.S01E01.x264-ABC.mkv', 'Foo.S01E02.x264-ABC.mkv', 'unknown file'] + infos = tuple(scene._yield_file_info('path/to/Foo.S01.x264-ABC')) + assert infos == ({'release_name': 'Foo.S01E01.x264-ABC', 'filename': 'Foo.S01E01.x264-ABC.mkv', 'size': 123, 'crc': '12345678'}, + {'release_name': 'Foo.S01E02.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 234, 'crc': 'ABCD1234'}, + {'release_name': None, 'filename': 'unknown file', 'size': None, 'crc': None}) + assert mock_listdir.call_args_list == [call('path/to/Foo.S01.x264-ABC')] + assert mock_get_details.call_args_list == [call('path/to/Foo.S01.x264-ABC'), + call('Foo.S01E01.x264-ABC.mkv'), + call('Foo.S01E02.x264-ABC.mkv'), + call('unknown file')] + +@patch('pythonbits.scene._guessit') +@patch('pythonbits.scene.search') +@patch('pythonbits.scene.get_details') +def test_yield_file_info_for_episode_release_of_original_season_release_with_enough_information( + mock_get_details, mock_search, mock_guessit): + mock_get_details.side_effect = ( + ('', {}), + ('Foo.S01.x264-ABC', + {'Foo.S01E01.x264-ABC.mkv': {'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E01.x264-ABC.mkv', + 'size': 123, 'crc': '12345678'}, + 'Foo.S01E02.x264-ABC.mkv': {'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', + 'size': 234, 'crc': 'ABCD1234'}}) + ) + mock_guessit.return_value = {'release_group': 'TEHFOO', 'season': 1, 'episode': 2} + mock_search.return_value = ['Foo.S01.x264-ABC'] + infos = tuple(scene._yield_file_info('path/to/Foo.S01E02.x264-ABC.mkv')) + assert infos == ({'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': 234, 'crc': 'ABCD1234'},) + assert mock_get_details.call_args_list == [call('path/to/Foo.S01E02.x264-ABC.mkv'), call('Foo.S01.x264-ABC')] + assert mock_guessit.called_with('path/to/Foo.S01E02.x264-ABC.mkv') + assert mock_search.call_args_list == [call({'release_group': 'TEHFOO', 'season': 1})] + +@patch('pythonbits.scene._guessit') +@patch('pythonbits.scene.search') +@patch('pythonbits.scene.get_details') +def test_yield_file_info_for_episode_release_of_original_season_release_with_enough_information_no_retry( + mock_get_details, mock_search, mock_guessit): + mock_get_details.return_value = ('', {}) + mock_guessit.return_value = {'release_group': 'TEHFOO', 'season': 1} + infos = tuple(scene._yield_file_info('path/to/Foo.S01E02.x264-ABC.mkv')) + assert infos == ({'release_name': None, 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': None, 'crc': None},) + assert mock_get_details.call_args_list == [call('path/to/Foo.S01E02.x264-ABC.mkv')] + assert mock_guessit.call_args_list == [call('path/to/Foo.S01E02.x264-ABC.mkv')] + assert mock_search.call_args_list == [] + +@patch('pythonbits.scene._guessit') +@patch('pythonbits.scene.search') +@patch('pythonbits.scene.get_details') +def test_yield_file_info_for_episode_release_of_original_season_release_with_enough_information_no_search_results( + mock_get_details, mock_search, mock_guessit): + mock_get_details.return_value = ('', {}) + mock_guessit.return_value = {'release_group': 'TEHFOO', 'season': 1, 'episode': 2} + mock_search.return_value = [] + infos = tuple(scene._yield_file_info('path/to/Foo.S01E02.x264-ABC.mkv')) + assert infos == ({'release_name': None, 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': None, 'crc': None},) + assert mock_get_details.call_args_list == [call('path/to/Foo.S01E02.x264-ABC.mkv')] + assert mock_guessit.call_args_list == [call('path/to/Foo.S01E02.x264-ABC.mkv')] + assert mock_search.call_args_list == [call({'release_group': 'TEHFOO', 'season': 1})] + +@patch('pythonbits.scene._guessit') +@patch('pythonbits.scene.search') +@patch('pythonbits.scene.get_details') +def test_yield_file_info_for_episode_release_of_original_season_release_with_enough_information_no_group( + mock_get_details, mock_search, mock_guessit): + mock_get_details.return_value = ('', {}) + mock_guessit.return_value = {'season': 1, 'episode': 2} + mock_search.return_value = [] + infos = tuple(scene._yield_file_info('path/to/Foo.S01E02.x264-ABC.mkv')) + assert infos == ({'release_name': None, 'filename': 'Foo.S01E02.x264-ABC.mkv', 'size': None, 'crc': None},) + assert mock_get_details.call_args_list == [call('path/to/Foo.S01E02.x264-ABC.mkv')] + assert mock_guessit.call_args_list == [call('path/to/Foo.S01E02.x264-ABC.mkv')] + assert mock_search.call_args_list == [] + + +### Integration tests + +# The first item is the release name, all following items are file (name, size) tuples. If +# there is only one item, it's a single-file release. File size of directories is ignored. +scene_releases = ( + # Movie in release name directory + (('Walk.the.Line.Extended.Cut.2005.1080p.BluRay.x264-HD1080', -1), + ('Walk.the.Line.Extended.Cut.2005.1080p.BluRay.x264-HD1080/hd1080-wtl.mkv', 11743374939)), + + # Release name is identical to name of only file + extension + (('12.Rounds.Reloaded.2013.1080p.BluRay.x264-ROVERS.mkv', 7037061105),), + + # Release name is identical to name of only file + extension in lower case + (('side.effects.2013.720p.bluray.x264-sparks.mkv', 4690527189),), + + # Same as above but in directory with proper release name + (('Side.Effects.2013.720p.BluRay.x264-SPARKS', -1), + ('Side.Effects.2013.720p.BluRay.x264-SPARKS/side.effects.2013.720p.bluray.x264-sparks.mkv', 4690527189),), + + # Single episode release + (('Fawlty.Towers.S01E01.1080p.BluRay.x264-SHORTBREHD.mkv', 2342662389),), + + # Season pack of single episode releases + (('Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD', -1), + ('Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD/Fawlty.Towers.S01E01.1080p.BluRay.x264-SHORTBREHD.mkv', 2342662389), + ('Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD/Fawlty.Towers.S01E02.1080p.BluRay.x264-SHORTBREHD.mkv', 2342806335), + ('Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD/Fawlty.Towers.S01E03.1080p.BluRay.x264-SHORTBREHD.mkv', 2838653040), + ('Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD/Fawlty.Towers.S01E04.1080p.BluRay.x264-SHORTBREHD.mkv', 2343647191), + ('Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD/Fawlty.Towers.S01E05.1080p.BluRay.x264-SHORTBREHD.mkv', 2342958161), + ('Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD/Fawlty.Towers.S01E06.1080p.BluRay.x264-SHORTBREHD.mkv', 2342527200)), + + # Season pack release + (('Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT', -1), + ('Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT/Bored.to.Death.S01.Jonathan.Amess.Brooklyn.720p.BluRay.x264-iNGOT.mkv', 518652629), + ('Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT/Bored.to.Death.S01.Making.of.720p.BluRay.x264-iNGOT.mkv', 779447228), + ('Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT/Bored.to.Death.S01E03.Deleted.Scene.720p.BluRay.x264-iNGOT.mkv', 30779540), + ('Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT/Bored.to.Death.S01E04.Deleted.Scene.720p.BluRay.x264-iNGOT.mkv', 138052914), + ('Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT/Bored.to.Death.S01E08.Deleted.Scene.1.720p.BluRay.x264-iNGOT.mkv', 68498554), + ('Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT/Bored.to.Death.S01E08.Deleted.Scene.2.720p.BluRay.x264-iNGOT.mkv', 45583011)), + + # Single episode from season pack release + (('Bored.to.Death.S01E03.Deleted.Scene.720p.BluRay.x264-iNGOT.mkv', 30779540),), +) + +non_scene_releases = ( + ('Rampart.2011.1080p.Bluray.DD5.1.x264-DON.mkv', 123), + ('La.Bamba.1987.LE.Bluray.1080p.DTS-HD.x264-Grym.mkv', 123), + ('Damnation.S01.720p.AMZN.WEB-DL.DDP5.1.H.264-AJP69', 123), + ('Damnation.S01E03.One.Penny.720p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.mkv', 123), + ('The Film Without a Group (1984).mkv', 123), +) + +capture_requests = False +real_scene_get = scene._get +capture_dir = os.path.join(os.path.dirname(__file__), 'scene_responses') + +def capture_request(path): + filepath = os.path.join(capture_dir, path.replace('/', '_') + '.pickle') + if not capture_requests and os.path.exists(filepath): + with open(filepath, 'rb') as f: + return pickle.loads(f.read()) + else: + response = real_scene_get(path) + if not os.path.exists(capture_dir): + os.mkdir(capture_dir) + with open(filepath, 'wb') as f: + f.write(pickle.dumps(response)) + return response + +@contextlib.contextmanager +def mock_files(*filespecs, path_prefix=''): + def mock_exists(path): + for path_,size in filespecs: + if os.path.join(path_prefix, path_) == path: + return True + return False + + def mock_getsize(path): + for path_,size in filespecs: + if os.path.join(path_prefix, path_) == path: + return size + raise FileNotFoundError(path) + + exists_p = patch('pythonbits.scene._path_exists', mock_exists) + filesize_p = patch('pythonbits.scene._path_getsize', mock_getsize) + exists_p.start() + filesize_p.start() + yield + exists_p.stop() + filesize_p.stop() + +@pytest.mark.parametrize('content', scene_releases, ids=(fs[0][0] for fs in scene_releases)) +@patch('pythonbits.scene._get', capture_request) +@patch('pythonbits.bb.prompt_yesno') +@patch('pythonbits.scene._os_listdir') +def test_detection_of_unmodified_scene_release(mock_listdir, mock_prompt_yesno, content): + release_name = content[0][0] + mock_listdir.return_value = [os.path.basename(fs[0]) for fs in content[1:]] + s = bb.VideoSubmission(path='path/to/' + release_name) + with mock_files(*content, path_prefix='path/to'): + assert s['scene'] is True + assert mock_prompt_yesno.call_args_list == [] + +@pytest.mark.parametrize('content', scene_releases, ids=(fs[0][0] for fs in scene_releases)) +@patch('pythonbits.scene._get', capture_request) +@patch('sys.exit') +@patch('pythonbits.bb.prompt_yesno') +@patch('pythonbits.scene._os_listdir') +def test_detection_of_scene_release_with_wrong_file_size(mock_listdir, mock_prompt_yesno, mock_exit, content): + mock_prompt_yesno.return_value = False + mock_exit.return_value = '' + mock_listdir.return_value = [os.path.basename(fs[0]) for fs in content[1:]] + release_name = content[0][0] + modified_content = ((relpath, size-1) for relpath,size in content) + with mock_files(*modified_content, path_prefix='path/to'): + # User wants to abort + mock_prompt_yesno.side_effect = (True,) + assert bb.VideoSubmission(path='path/to/' + release_name)['scene'] is '' + assert mock_prompt_yesno.call_args_list == [call('Abort?', default=True)] + assert mock_exit.call_args_list == [call(1)] + mock_prompt_yesno.reset_mock() + mock_exit.reset_mock() + + # User wants to submit anyway but not as scene + mock_prompt_yesno.side_effect = (False, False) + assert bb.VideoSubmission(path='path/to/' + release_name)['scene'] is False + assert mock_prompt_yesno.call_args_list == [call('Abort?', default=True), + call('Is this a scene release?', default=False)] + assert mock_exit.call_args_list == [] + mock_prompt_yesno.reset_mock() + mock_exit.reset_mock() + + # User wants to submit anyway and insists on scene release + mock_prompt_yesno.side_effect = (False, True) + assert bb.VideoSubmission(path='path/to/' + release_name)['scene'] is True + assert mock_prompt_yesno.call_args_list == [call('Abort?', default=True), + call('Is this a scene release?', default=False)] + assert mock_exit.call_args_list == [] + +@pytest.mark.parametrize('content', scene_releases, ids=(fs[0][0] for fs in scene_releases)) +@patch('pythonbits.scene._get', capture_request) +@patch('sys.exit') +@patch('pythonbits.bb.prompt_yesno') +@patch('pythonbits.scene._os_listdir') +def test_detection_of_scene_release_with_wrong_release_name(mock_listdir, mock_prompt_yesno, mock_exit, content): + mock_prompt_yesno.return_value = False + mock_exit.return_value = '' + mock_listdir.return_value = [os.path.basename(fs[0]) for fs in content[1:]] + correct_release_name = content[0][0] + wrong_release_name = correct_release_name.lower().replace('.', ' ', 1) + with mock_files(*content, path_prefix='path/to'): + # User wants to abort + mock_prompt_yesno.side_effect = (True,) + assert bb.VideoSubmission(path='path/to/' + wrong_release_name)['scene'] is '' + assert mock_prompt_yesno.call_args_list == [call('Abort?', default=True)] + assert mock_exit.call_args_list == [call(1)] + mock_prompt_yesno.reset_mock() + mock_exit.reset_mock() + + # User wants to submit anyway but not as scene + mock_prompt_yesno.side_effect = (False, False) + assert bb.VideoSubmission(path='path/to/' + wrong_release_name)['scene'] is False + assert mock_prompt_yesno.call_args_list == [call('Abort?', default=True), + call('Is this a scene release?', default=False)] + assert mock_exit.call_args_list == [] + mock_prompt_yesno.reset_mock() + mock_exit.reset_mock() + + # User wants to submit anyway and insists on scene release + mock_prompt_yesno.side_effect = (False, True) + assert bb.VideoSubmission(path='path/to/' + wrong_release_name)['scene'] is True + assert mock_prompt_yesno.call_args_list == [call('Abort?', default=True), + call('Is this a scene release?', default=False)] + assert mock_exit.call_args_list == [] + +@pytest.mark.parametrize('content', non_scene_releases, ids=(fs[0] for fs in non_scene_releases)) +@patch('pythonbits.scene._get', capture_request) +@patch('sys.exit') +@patch('pythonbits.bb.prompt_yesno') +@patch('pythonbits.scene._os_listdir') +def test_detection_of_non_scene_release(mock_listdir, mock_prompt_yesno, mock_exit, content): + release_name = content[0] + s = bb.VideoSubmission(path='path/to/' + release_name) + with mock_files(*content, path_prefix='path/to'): + assert s['scene'] is False + assert mock_prompt_yesno.call_args_list == [] + +@patch('pythonbits.scene._get', capture_request) +@patch('sys.exit') +@patch('pythonbits.bb.prompt_yesno') +def test_workaround_for_group_in_front(mock_prompt_yesno, mock_exit): + mock_prompt_yesno.return_value = False + mock_exit.return_value = '' + correct_release_name = 'The.Omega.Man.1971.1080p.BluRay.x264-VOA' + wrong_release_name = 'voa-the_omega_man_x264_bluray.mkv' + with mock_files((wrong_release_name, 123), path_prefix='path/to'): + mock_prompt_yesno.side_effect = (True,) + assert bb.VideoSubmission(path='path/to/' + wrong_release_name)['scene'] is '' + assert mock_prompt_yesno.call_args_list == [call('Abort?', default=True)] + assert mock_exit.call_args_list == [call(1)] From ed363a1c3f0d38fece09dee2b9bd402e49488103 Mon Sep 17 00:00:00 2001 From: plotski Date: Tue, 9 Jun 2020 15:48:04 +0200 Subject: [PATCH 02/10] Fix some flake8 complaints --- tests/test_scene.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/tests/test_scene.py b/tests/test_scene.py index cdff79d..aa1c7bf 100644 --- a/tests/test_scene.py +++ b/tests/test_scene.py @@ -6,7 +6,6 @@ import os import pickle import contextlib -import logbook # Silence guessit import logging @@ -342,10 +341,10 @@ def test_yield_file_info_for_season_release_of_original_episode_release(mock_get ('', {}), ('Foo.S01E01.x264-ABC', {'Foo.S01E01.x264-ABC.mkv': {'release_name': 'Foo.S01E01.x264-ABC', 'filename': 'Foo.S01E01.x264-ABC.mkv', - 'size': 123, 'crc': '12345678'}}), + 'size': 123, 'crc': '12345678'}}), ('Foo.S01E02.x264-ABC', {'Foo.S01E02.x264-ABC.mkv': {'release_name': 'Foo.S01E02.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', - 'size': 234, 'crc': 'ABCD1234'}}), + 'size': 234, 'crc': 'ABCD1234'}}), ('', {}), ) mock_listdir.return_value = ['Foo.S01E01.x264-ABC.mkv', 'Foo.S01E02.x264-ABC.mkv', 'unknown file'] @@ -368,9 +367,9 @@ def test_yield_file_info_for_episode_release_of_original_season_release_with_eno ('', {}), ('Foo.S01.x264-ABC', {'Foo.S01E01.x264-ABC.mkv': {'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E01.x264-ABC.mkv', - 'size': 123, 'crc': '12345678'}, + 'size': 123, 'crc': '12345678'}, 'Foo.S01E02.x264-ABC.mkv': {'release_name': 'Foo.S01.x264-ABC', 'filename': 'Foo.S01E02.x264-ABC.mkv', - 'size': 234, 'crc': 'ABCD1234'}}) + 'size': 234, 'crc': 'ABCD1234'}}) ) mock_guessit.return_value = {'release_group': 'TEHFOO', 'season': 1, 'episode': 2} mock_search.return_value = ['Foo.S01.x264-ABC'] @@ -422,7 +421,7 @@ def test_yield_file_info_for_episode_release_of_original_season_release_with_eno assert mock_search.call_args_list == [] -### Integration tests +# Integration tests # The first item is the release name, all following items are file (name, size) tuples. If # there is only one item, it's a single-file release. File size of directories is ignored. @@ -535,11 +534,11 @@ def test_detection_of_scene_release_with_wrong_file_size(mock_listdir, mock_prom mock_exit.return_value = '' mock_listdir.return_value = [os.path.basename(fs[0]) for fs in content[1:]] release_name = content[0][0] - modified_content = ((relpath, size-1) for relpath,size in content) + modified_content = ((relpath, size - 1) for relpath,size in content) with mock_files(*modified_content, path_prefix='path/to'): # User wants to abort mock_prompt_yesno.side_effect = (True,) - assert bb.VideoSubmission(path='path/to/' + release_name)['scene'] is '' + assert bb.VideoSubmission(path='path/to/' + release_name)['scene'] == '' assert mock_prompt_yesno.call_args_list == [call('Abort?', default=True)] assert mock_exit.call_args_list == [call(1)] mock_prompt_yesno.reset_mock() @@ -575,7 +574,7 @@ def test_detection_of_scene_release_with_wrong_release_name(mock_listdir, mock_p with mock_files(*content, path_prefix='path/to'): # User wants to abort mock_prompt_yesno.side_effect = (True,) - assert bb.VideoSubmission(path='path/to/' + wrong_release_name)['scene'] is '' + assert bb.VideoSubmission(path='path/to/' + wrong_release_name)['scene'] == '' assert mock_prompt_yesno.call_args_list == [call('Abort?', default=True)] assert mock_exit.call_args_list == [call(1)] mock_prompt_yesno.reset_mock() @@ -615,10 +614,9 @@ def test_detection_of_non_scene_release(mock_listdir, mock_prompt_yesno, mock_ex def test_workaround_for_group_in_front(mock_prompt_yesno, mock_exit): mock_prompt_yesno.return_value = False mock_exit.return_value = '' - correct_release_name = 'The.Omega.Man.1971.1080p.BluRay.x264-VOA' wrong_release_name = 'voa-the_omega_man_x264_bluray.mkv' with mock_files((wrong_release_name, 123), path_prefix='path/to'): mock_prompt_yesno.side_effect = (True,) - assert bb.VideoSubmission(path='path/to/' + wrong_release_name)['scene'] is '' + assert bb.VideoSubmission(path='path/to/' + wrong_release_name)['scene'] == '' assert mock_prompt_yesno.call_args_list == [call('Abort?', default=True)] assert mock_exit.call_args_list == [call(1)] From 3d9e304f54c74a0c01bf27eff6cf3dd89b07ee33 Mon Sep 17 00:00:00 2001 From: plotski Date: Tue, 9 Jun 2020 15:51:42 +0200 Subject: [PATCH 03/10] Fix more flake8 complaints --- pythonbits/scene.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pythonbits/scene.py b/pythonbits/scene.py index c0b4ef3..46db08f 100644 --- a/pythonbits/scene.py +++ b/pythonbits/scene.py @@ -13,15 +13,19 @@ srrdb = b64decode('aHR0cHM6Ly9zcnJkYi5jb20v').decode('utf8') + class SceneError(Exception): pass + class APIError(Exception): pass + # FIXME: "hd1080-wtl.mkv" (from Walk.the.Line.Extended.Cut.2005.1080p.BluRay.x264-HD1080) # should report an error, but it's not found on any scene indexers. + def check_integrity(path, on_error=None): """ Check if `path` (file or directory) was modified @@ -206,7 +210,6 @@ def search(guess): Return a list of release names """ - import sys log.debug('Searching for {}', guess) # Make search query query = list(guess['title'].split(' ')) From bf96470c74a21225c00dc84d14723f07fab813ea Mon Sep 17 00:00:00 2001 From: plotski Date: Sat, 13 Jun 2020 12:02:52 +0200 Subject: [PATCH 04/10] Allow scene releases to be renamed to RELEASE_NAME.mkv --- pythonbits/scene.py | 19 ++++++++++--------- tests/test_scene.py | 13 +++++++++++++ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/pythonbits/scene.py b/pythonbits/scene.py index 46db08f..36c63f4 100644 --- a/pythonbits/scene.py +++ b/pythonbits/scene.py @@ -143,26 +143,27 @@ def _check_file(relpath, fspath, info): if scene_release_type == 'file': # Scene released file so we don't care about our own directory name filename = os.path.basename(fspath) - exp_filename = info['filename'] + exp_filenames = (info['filename'],) log.debug('Existing filename: {}', filename) - log.debug('Expected filename: {}', exp_filename) - if filename != exp_filename: - raise SceneError('%s was renamed to %s' % (exp_filename, filename)) + log.debug('Expected filename: {}', exp_filenames) + if filename not in exp_filenames: + raise SceneError('%s was renamed to %s' % (exp_filenames[0], filename)) else: # Scene released directory if release_type == 'file': # Don't check directory name filename = os.path.basename(fspath) - exp_filename = info['filename'] + exp_filenames = (info['filename'], + info['release_name'] + '.mkv') else: # Check full internal/relative path filename = os.path.join(os.path.basename(os.path.dirname(fspath)), os.path.basename(fspath)) - exp_filename = os.path.join(info['release_name'], info['filename']) + exp_filenames = (os.path.join(info['release_name'], info['filename']),) log.debug('Existing filename: {}', filename) - log.debug('Expected filename: {}', exp_filename) - if filename != exp_filename: - raise SceneError('%s was renamed to %s' % (exp_filename, filename)) + log.debug('Expected filename: {}', exp_filenames) + if filename not in exp_filenames: + raise SceneError('%s was renamed to %s' % (exp_filenames[0], filename)) if not _path_exists(fspath): raise SceneError('%s: Missing file' % (fspath,)) diff --git a/tests/test_scene.py b/tests/test_scene.py index aa1c7bf..ddc2265 100644 --- a/tests/test_scene.py +++ b/tests/test_scene.py @@ -620,3 +620,16 @@ def test_workaround_for_group_in_front(mock_prompt_yesno, mock_exit): assert bb.VideoSubmission(path='path/to/' + wrong_release_name)['scene'] == '' assert mock_prompt_yesno.call_args_list == [call('Abort?', default=True)] assert mock_exit.call_args_list == [call(1)] + +@patch('pythonbits.scene._get', capture_request) +@patch('sys.exit') +@patch('pythonbits.bb.prompt_yesno') +def test_renaming_is_ok_if_file_name_is_release_name(mock_prompt_yesno, mock_exit): + mock_prompt_yesno.return_value = False + mock_exit.return_value = '' + acceptable_release_name = 'Walk.the.Line.Extended.Cut.2005.1080p.BluRay.x264-HD1080.mkv' + content = (acceptable_release_name, 11743374939) + with mock_files(content, path_prefix='path/to'): + assert bb.VideoSubmission(path='path/to/' + acceptable_release_name)['scene'] == True + assert mock_prompt_yesno.call_args_list == [] + assert mock_exit.call_args_list == [] From e23d29fd9880c086078635b432386d40cd086dca Mon Sep 17 00:00:00 2001 From: plotski Date: Sat, 13 Jun 2020 12:03:59 +0200 Subject: [PATCH 05/10] Display which files are mocked in scene tests --- tests/test_scene.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_scene.py b/tests/test_scene.py index ddc2265..84ef1c5 100644 --- a/tests/test_scene.py +++ b/tests/test_scene.py @@ -492,6 +492,10 @@ def capture_request(path): @contextlib.contextmanager def mock_files(*filespecs, path_prefix=''): + print('Mocking files:') + for fs in filespecs: + print(fs) + def mock_exists(path): for path_,size in filespecs: if os.path.join(path_prefix, path_) == path: From 76bd6fb05df90b91418958d991a0e90073fa704c Mon Sep 17 00:00:00 2001 From: plotski Date: Sat, 13 Jun 2020 12:04:36 +0200 Subject: [PATCH 06/10] Make scene test prettier --- tests/test_scene.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_scene.py b/tests/test_scene.py index 84ef1c5..357fc21 100644 --- a/tests/test_scene.py +++ b/tests/test_scene.py @@ -616,11 +616,11 @@ def test_detection_of_non_scene_release(mock_listdir, mock_prompt_yesno, mock_ex @patch('sys.exit') @patch('pythonbits.bb.prompt_yesno') def test_workaround_for_group_in_front(mock_prompt_yesno, mock_exit): - mock_prompt_yesno.return_value = False + mock_prompt_yesno.side_effect = (True,) mock_exit.return_value = '' wrong_release_name = 'voa-the_omega_man_x264_bluray.mkv' - with mock_files((wrong_release_name, 123), path_prefix='path/to'): - mock_prompt_yesno.side_effect = (True,) + content = (wrong_release_name, 123) + with mock_files(content, path_prefix='path/to'): assert bb.VideoSubmission(path='path/to/' + wrong_release_name)['scene'] == '' assert mock_prompt_yesno.call_args_list == [call('Abort?', default=True)] assert mock_exit.call_args_list == [call(1)] From a27d7061589213598d73ba2336f2883532725d41 Mon Sep 17 00:00:00 2001 From: plotski Date: Sat, 13 Jun 2020 12:11:58 +0200 Subject: [PATCH 07/10] Move prompt_yesno() into separate module --- pythonbits/bb.py | 18 ++++-------------- pythonbits/prompt.py | 13 +++++++++++++ tests/test_scene.py | 12 ++++++------ 3 files changed, 23 insertions(+), 20 deletions(-) create mode 100644 pythonbits/prompt.py diff --git a/pythonbits/bb.py b/pythonbits/bb.py index 64acf99..9298b85 100644 --- a/pythonbits/bb.py +++ b/pythonbits/bb.py @@ -25,6 +25,7 @@ SubmissionAttributeError) from .tracker import Tracker from . import scene +from . import prompt def format_tag(tag): @@ -43,17 +44,6 @@ def format_choices(choices): for num, value in enumerate(choices) ]) -def prompt_yesno(question, default): - while True: - choices = '[Y/n]' if default else '[y/N]' - choice = input('%s %s ' % (question, choices)) - if not choice: - return default - elif choice.casefold() == 'y': - return True - elif choice.casefold() == 'n': - return False - class BbSubmission(Submission): default_fields = ("form_title", "tags", "cover") @@ -96,7 +86,7 @@ def submit(payload): @form_field('scene', 'checkbox') def _render_scene(self): def ask_user(): - return prompt_yesno('Is this a scene release?', default=False) + return prompt.yesno('Is this a scene release?', default=False) def handle_error(filepath, error): log.error(str(error)) @@ -107,7 +97,7 @@ def handle_error(filepath, error): if modified is False: return True elif modified is True: - if prompt_yesno('Abort?', default=True): + if prompt.yesno('Abort?', default=True): # The return statement is there because sys.exit() is mocked in tests. log.debug('Aborting') return sys.exit(1) @@ -124,7 +114,7 @@ def handle_error(filepath, error): for release_name in release_names: print(' * {}'.format(release_name)) log.error('This release was very likely modified and should not be uploaded like this.') - if prompt_yesno('Abort?', default=True): + if prompt.yesno('Abort?', default=True): # The return statement is there because sys.exit() is mocked in tests. return sys.exit(1) else: diff --git a/pythonbits/prompt.py b/pythonbits/prompt.py new file mode 100644 index 0000000..5583cde --- /dev/null +++ b/pythonbits/prompt.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + + +def yesno(question, default): + while True: + choices = '[Y/n]' if default else '[y/N]' + choice = input('%s %s ' % (question, choices)) + if not choice: + return default + elif choice.casefold() == 'y': + return True + elif choice.casefold() == 'n': + return False diff --git a/tests/test_scene.py b/tests/test_scene.py index 357fc21..a488079 100644 --- a/tests/test_scene.py +++ b/tests/test_scene.py @@ -518,7 +518,7 @@ def mock_getsize(path): @pytest.mark.parametrize('content', scene_releases, ids=(fs[0][0] for fs in scene_releases)) @patch('pythonbits.scene._get', capture_request) -@patch('pythonbits.bb.prompt_yesno') +@patch('pythonbits.bb.prompt.yesno') @patch('pythonbits.scene._os_listdir') def test_detection_of_unmodified_scene_release(mock_listdir, mock_prompt_yesno, content): release_name = content[0][0] @@ -531,7 +531,7 @@ def test_detection_of_unmodified_scene_release(mock_listdir, mock_prompt_yesno, @pytest.mark.parametrize('content', scene_releases, ids=(fs[0][0] for fs in scene_releases)) @patch('pythonbits.scene._get', capture_request) @patch('sys.exit') -@patch('pythonbits.bb.prompt_yesno') +@patch('pythonbits.bb.prompt.yesno') @patch('pythonbits.scene._os_listdir') def test_detection_of_scene_release_with_wrong_file_size(mock_listdir, mock_prompt_yesno, mock_exit, content): mock_prompt_yesno.return_value = False @@ -567,7 +567,7 @@ def test_detection_of_scene_release_with_wrong_file_size(mock_listdir, mock_prom @pytest.mark.parametrize('content', scene_releases, ids=(fs[0][0] for fs in scene_releases)) @patch('pythonbits.scene._get', capture_request) @patch('sys.exit') -@patch('pythonbits.bb.prompt_yesno') +@patch('pythonbits.bb.prompt.yesno') @patch('pythonbits.scene._os_listdir') def test_detection_of_scene_release_with_wrong_release_name(mock_listdir, mock_prompt_yesno, mock_exit, content): mock_prompt_yesno.return_value = False @@ -603,7 +603,7 @@ def test_detection_of_scene_release_with_wrong_release_name(mock_listdir, mock_p @pytest.mark.parametrize('content', non_scene_releases, ids=(fs[0] for fs in non_scene_releases)) @patch('pythonbits.scene._get', capture_request) @patch('sys.exit') -@patch('pythonbits.bb.prompt_yesno') +@patch('pythonbits.bb.prompt.yesno') @patch('pythonbits.scene._os_listdir') def test_detection_of_non_scene_release(mock_listdir, mock_prompt_yesno, mock_exit, content): release_name = content[0] @@ -614,7 +614,7 @@ def test_detection_of_non_scene_release(mock_listdir, mock_prompt_yesno, mock_ex @patch('pythonbits.scene._get', capture_request) @patch('sys.exit') -@patch('pythonbits.bb.prompt_yesno') +@patch('pythonbits.bb.prompt.yesno') def test_workaround_for_group_in_front(mock_prompt_yesno, mock_exit): mock_prompt_yesno.side_effect = (True,) mock_exit.return_value = '' @@ -627,7 +627,7 @@ def test_workaround_for_group_in_front(mock_prompt_yesno, mock_exit): @patch('pythonbits.scene._get', capture_request) @patch('sys.exit') -@patch('pythonbits.bb.prompt_yesno') +@patch('pythonbits.bb.prompt.yesno') def test_renaming_is_ok_if_file_name_is_release_name(mock_prompt_yesno, mock_exit): mock_prompt_yesno.return_value = False mock_exit.return_value = '' From d169540a230ac0d2eacf6d52e28363a73d81fbb6 Mon Sep 17 00:00:00 2001 From: plotski Date: Sun, 14 Jun 2020 18:43:57 +0200 Subject: [PATCH 08/10] For tests, store API responses as text instead of pickles --- ...oaded.2013.1080p.bluray.x264-rovers.pickle | Bin 3335 -> 0 bytes ...ded.2013.1080p.bluray.x264-rovers.response | 0 ...ed.2013.1080p.BluRay.x264-ROVERS.response} | Bin 11119 -> 7770 bytes ...01.EXTRAS.720p.BluRay.x264-iNGOT.response} | Bin 7498 -> 4149 bytes ...ess.Brooklyn.720p.BluRay.x264-iNGOT.pickle | Bin 3395 -> 0 bytes ...s.Brooklyn.720p.BluRay.x264-iNGOT.response | 0 ...01.Making.of.720p.BluRay.x264-iNGOT.pickle | Bin 3339 -> 0 bytes ....Making.of.720p.BluRay.x264-iNGOT.response | 0 ...eleted.Scene.720p.BluRay.x264-iNGOT.pickle | Bin 3367 -> 0 bytes ...eted.Scene.720p.BluRay.x264-iNGOT.response | 0 ...eleted.Scene.720p.BluRay.x264-iNGOT.pickle | Bin 3367 -> 0 bytes ...eted.Scene.720p.BluRay.x264-iNGOT.response | 0 ...eted.Scene.1.720p.BluRay.x264-iNGOT.pickle | Bin 3375 -> 0 bytes ...ed.Scene.1.720p.BluRay.x264-iNGOT.response | 0 ...eted.Scene.2.720p.BluRay.x264-iNGOT.pickle | Bin 3375 -> 0 bytes ...ed.Scene.2.720p.BluRay.x264-iNGOT.response | 0 ...720p.AMZN.WEB-DL.DDP5.1.H.264-AJP69.pickle | Bin 3331 -> 0 bytes ...0p.AMZN.WEB-DL.DDP5.1.H.264-AJP69.response | 0 ...720p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.pickle | Bin 3383 -> 0 bytes ...0p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.response | 0 ...rs.S01.1080p.BluRay.x264-SHORTBREHD.pickle | Bin 3319 -> 0 bytes ....S01.1080p.BluRay.x264-SHORTBREHD.response | 0 ...E01.1080p.BluRay.x264-SHORTBREHD.response} | Bin 8779 -> 5426 bytes ...E02.1080p.BluRay.x264-SHORTBREHD.response} | Bin 8780 -> 5427 bytes ...E03.1080p.BluRay.x264-SHORTBREHD.response} | Bin 9760 -> 6407 bytes ...E04.1080p.BluRay.x264-SHORTBREHD.response} | Bin 8779 -> 5426 bytes ...E05.1080p.BluRay.x264-SHORTBREHD.response} | Bin 8779 -> 5426 bytes ...E06.1080p.BluRay.x264-SHORTBREHD.response} | Bin 8779 -> 5426 bytes ...87.LE.Bluray.1080p.DTS-HD.x264-Grym.pickle | Bin 3319 -> 0 bytes ....LE.Bluray.1080p.DTS-HD.x264-Grym.response | 0 ...rt.2011.1080p.Bluray.DD5.1.x264-DON.pickle | Bin 3295 -> 0 bytes ....2011.1080p.Bluray.DD5.1.x264-DON.response | 0 ...cts.2013.720p.BluRay.x264-SPARKS.response} | Bin 9989 -> 6668 bytes ...ut.2005.1080p.BluRay.x264-HD1080.response} | Bin 8531 -> 5150 bytes ...h.s01.extras.720p.bluray.x264-ingot.pickle | Bin 3335 -> 0 bytes ...s01.extras.720p.bluray.x264-ingot.response | 0 ...eleted.scene.720p.bluray.x264-ingot.pickle | Bin 3375 -> 0 bytes ...eted.scene.720p.bluray.x264-ingot.response | 0 ...rs.s01.1080p.bluray.x264-shortbrehd.pickle | Bin 3327 -> 0 bytes ....s01.1080p.bluray.x264-shortbrehd.response | 0 ...s01e01.1080p.bluray.x264-shortbrehd.pickle | Bin 3339 -> 0 bytes ...1e01.1080p.bluray.x264-shortbrehd.response | 0 .../api_details_hd1080-wtl.pickle | Bin 3175 -> 0 bytes .../api_details_hd1080-wtl.response | 0 ...ffects.2013.720p.bluray.x264-sparks.pickle | Bin 3307 -> 0 bytes ...ects.2013.720p.bluray.x264-sparks.response | 0 ...ffects.2013.720p.bluray.x264-sparks.pickle | Bin 44675 -> 0 bytes ...ects.2013.720p.bluray.x264-sparks.response | 954 ++++++++++++++++++ ...tails_voa-the_omega_man_x264_bluray.pickle | Bin 3251 -> 0 bytes ...ils_voa-the_omega_man_x264_bluray.response | 0 ...d.cut.2005.1080p.bluray.x264-hd1080.pickle | Bin 3367 -> 0 bytes ...cut.2005.1080p.bluray.x264-hd1080.response | 0 ...ds_reloaded_group:rovers_1080p_2013.pickle | Bin 3685 -> 0 bytes ..._reloaded_group:rovers_1080p_2013.response | 1 + ...Bored_to_Death_group:iNGOT_720p_S01.pickle | Bin 3650 -> 0 bytes ...red_to_Death_group:iNGOT_720p_S01.response | 1 + ...arch_Damnation_group:AJP69_720p_S01.pickle | Bin 3495 -> 0 bytes ...ch_Damnation_group:AJP69_720p_S01.response | 1 + ...arch_La_Bamba_group:Grym_1080p_1987.pickle | Bin 3499 -> 0 bytes ...ch_La_Bamba_group:Grym_1080p_1987.response | 1 + ...search_Rampart_group:DON_1080p_2011.pickle | Bin 3483 -> 0 bytes ...arch_Rampart_group:DON_1080p_2011.response | 1 + ...bored_to_death_group:ingot_720p_S01.pickle | Bin 3650 -> 0 bytes ...red_to_death_group:ingot_720p_S01.response | 1 + ...o_death_group:ingot_Extras_720p_S01.pickle | Bin 3689 -> 0 bytes ...death_group:ingot_Extras_720p_S01.response | 1 + ...y_towers_group:shortbrehd_1080p_S01.pickle | Bin 4290 -> 0 bytes ...towers_group:shortbrehd_1080p_S01.response | 1 + ...side_effects_group:sparks_720p_2013.pickle | Bin 3639 -> 0 bytes ...de_effects_group:sparks_720p_2013.response | 1 + .../api_search_the_omega_man_group:voa.pickle | Bin 3574 -> 0 bytes ...pi_search_the_omega_man_group:voa.response | 1 + ...lk_the_line_group:hd1080_1080p_2005.pickle | Bin 3668 -> 0 bytes ..._the_line_group:hd1080_1080p_2005.response | 1 + tests/test_scene.py | 11 +- 75 files changed, 970 insertions(+), 6 deletions(-) delete mode 100644 tests/scene_responses/api_details_12 rounds.reloaded.2013.1080p.bluray.x264-rovers.pickle create mode 100644 tests/scene_responses/api_details_12 rounds.reloaded.2013.1080p.bluray.x264-rovers.response rename tests/scene_responses/{api_details_12.Rounds.Reloaded.2013.1080p.BluRay.x264-ROVERS.pickle => api_details_12.Rounds.Reloaded.2013.1080p.BluRay.x264-ROVERS.response} (69%) rename tests/scene_responses/{api_details_Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT.pickle => api_details_Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT.response} (54%) delete mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01.Jonathan.Amess.Brooklyn.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01.Jonathan.Amess.Brooklyn.720p.BluRay.x264-iNGOT.response delete mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01.Making.of.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01.Making.of.720p.BluRay.x264-iNGOT.response delete mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01E03.Deleted.Scene.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01E03.Deleted.Scene.720p.BluRay.x264-iNGOT.response delete mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01E04.Deleted.Scene.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01E04.Deleted.Scene.720p.BluRay.x264-iNGOT.response delete mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.1.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.1.720p.BluRay.x264-iNGOT.response delete mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.2.720p.BluRay.x264-iNGOT.pickle create mode 100644 tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.2.720p.BluRay.x264-iNGOT.response delete mode 100644 tests/scene_responses/api_details_Damnation.S01.720p.AMZN.WEB-DL.DDP5.1.H.264-AJP69.pickle create mode 100644 tests/scene_responses/api_details_Damnation.S01.720p.AMZN.WEB-DL.DDP5.1.H.264-AJP69.response delete mode 100644 tests/scene_responses/api_details_Damnation.S01E03.One.Penny.720p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.pickle create mode 100644 tests/scene_responses/api_details_Damnation.S01E03.One.Penny.720p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.response delete mode 100644 tests/scene_responses/api_details_Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD.pickle create mode 100644 tests/scene_responses/api_details_Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD.response rename tests/scene_responses/{api_details_Fawlty.Towers.S01E01.1080p.BluRay.x264-SHORTBREHD.pickle => api_details_Fawlty.Towers.S01E01.1080p.BluRay.x264-SHORTBREHD.response} (61%) rename tests/scene_responses/{api_details_Fawlty.Towers.S01E02.1080p.BluRay.x264-SHORTBREHD.pickle => api_details_Fawlty.Towers.S01E02.1080p.BluRay.x264-SHORTBREHD.response} (61%) rename tests/scene_responses/{api_details_Fawlty.Towers.S01E03.1080p.BluRay.x264-SHORTBREHD.pickle => api_details_Fawlty.Towers.S01E03.1080p.BluRay.x264-SHORTBREHD.response} (65%) rename tests/scene_responses/{api_details_Fawlty.Towers.S01E04.1080p.BluRay.x264-SHORTBREHD.pickle => api_details_Fawlty.Towers.S01E04.1080p.BluRay.x264-SHORTBREHD.response} (61%) rename tests/scene_responses/{api_details_Fawlty.Towers.S01E05.1080p.BluRay.x264-SHORTBREHD.pickle => api_details_Fawlty.Towers.S01E05.1080p.BluRay.x264-SHORTBREHD.response} (61%) rename tests/scene_responses/{api_details_Fawlty.Towers.S01E06.1080p.BluRay.x264-SHORTBREHD.pickle => api_details_Fawlty.Towers.S01E06.1080p.BluRay.x264-SHORTBREHD.response} (61%) delete mode 100644 tests/scene_responses/api_details_La.Bamba.1987.LE.Bluray.1080p.DTS-HD.x264-Grym.pickle create mode 100644 tests/scene_responses/api_details_La.Bamba.1987.LE.Bluray.1080p.DTS-HD.x264-Grym.response delete mode 100644 tests/scene_responses/api_details_Rampart.2011.1080p.Bluray.DD5.1.x264-DON.pickle create mode 100644 tests/scene_responses/api_details_Rampart.2011.1080p.Bluray.DD5.1.x264-DON.response rename tests/scene_responses/{api_details_Side.Effects.2013.720p.BluRay.x264-SPARKS.pickle => api_details_Side.Effects.2013.720p.BluRay.x264-SPARKS.response} (66%) rename tests/scene_responses/{api_details_Walk.the.Line.Extended.Cut.2005.1080p.BluRay.x264-HD1080.pickle => api_details_Walk.the.Line.Extended.Cut.2005.1080p.BluRay.x264-HD1080.response} (60%) delete mode 100644 tests/scene_responses/api_details_bored to.death.s01.extras.720p.bluray.x264-ingot.pickle create mode 100644 tests/scene_responses/api_details_bored to.death.s01.extras.720p.bluray.x264-ingot.response delete mode 100644 tests/scene_responses/api_details_bored to.death.s01e03.deleted.scene.720p.bluray.x264-ingot.pickle create mode 100644 tests/scene_responses/api_details_bored to.death.s01e03.deleted.scene.720p.bluray.x264-ingot.response delete mode 100644 tests/scene_responses/api_details_fawlty towers.s01.1080p.bluray.x264-shortbrehd.pickle create mode 100644 tests/scene_responses/api_details_fawlty towers.s01.1080p.bluray.x264-shortbrehd.response delete mode 100644 tests/scene_responses/api_details_fawlty towers.s01e01.1080p.bluray.x264-shortbrehd.pickle create mode 100644 tests/scene_responses/api_details_fawlty towers.s01e01.1080p.bluray.x264-shortbrehd.response delete mode 100644 tests/scene_responses/api_details_hd1080-wtl.pickle create mode 100644 tests/scene_responses/api_details_hd1080-wtl.response delete mode 100644 tests/scene_responses/api_details_side effects.2013.720p.bluray.x264-sparks.pickle create mode 100644 tests/scene_responses/api_details_side effects.2013.720p.bluray.x264-sparks.response delete mode 100644 tests/scene_responses/api_details_side.effects.2013.720p.bluray.x264-sparks.pickle create mode 100644 tests/scene_responses/api_details_side.effects.2013.720p.bluray.x264-sparks.response delete mode 100644 tests/scene_responses/api_details_voa-the_omega_man_x264_bluray.pickle create mode 100644 tests/scene_responses/api_details_voa-the_omega_man_x264_bluray.response delete mode 100644 tests/scene_responses/api_details_walk the.line.extended.cut.2005.1080p.bluray.x264-hd1080.pickle create mode 100644 tests/scene_responses/api_details_walk the.line.extended.cut.2005.1080p.bluray.x264-hd1080.response delete mode 100644 tests/scene_responses/api_search_12_rounds_reloaded_group:rovers_1080p_2013.pickle create mode 100644 tests/scene_responses/api_search_12_rounds_reloaded_group:rovers_1080p_2013.response delete mode 100644 tests/scene_responses/api_search_Bored_to_Death_group:iNGOT_720p_S01.pickle create mode 100644 tests/scene_responses/api_search_Bored_to_Death_group:iNGOT_720p_S01.response delete mode 100644 tests/scene_responses/api_search_Damnation_group:AJP69_720p_S01.pickle create mode 100644 tests/scene_responses/api_search_Damnation_group:AJP69_720p_S01.response delete mode 100644 tests/scene_responses/api_search_La_Bamba_group:Grym_1080p_1987.pickle create mode 100644 tests/scene_responses/api_search_La_Bamba_group:Grym_1080p_1987.response delete mode 100644 tests/scene_responses/api_search_Rampart_group:DON_1080p_2011.pickle create mode 100644 tests/scene_responses/api_search_Rampart_group:DON_1080p_2011.response delete mode 100644 tests/scene_responses/api_search_bored_to_death_group:ingot_720p_S01.pickle create mode 100644 tests/scene_responses/api_search_bored_to_death_group:ingot_720p_S01.response delete mode 100644 tests/scene_responses/api_search_bored_to_death_group:ingot_Extras_720p_S01.pickle create mode 100644 tests/scene_responses/api_search_bored_to_death_group:ingot_Extras_720p_S01.response delete mode 100644 tests/scene_responses/api_search_fawlty_towers_group:shortbrehd_1080p_S01.pickle create mode 100644 tests/scene_responses/api_search_fawlty_towers_group:shortbrehd_1080p_S01.response delete mode 100644 tests/scene_responses/api_search_side_effects_group:sparks_720p_2013.pickle create mode 100644 tests/scene_responses/api_search_side_effects_group:sparks_720p_2013.response delete mode 100644 tests/scene_responses/api_search_the_omega_man_group:voa.pickle create mode 100644 tests/scene_responses/api_search_the_omega_man_group:voa.response delete mode 100644 tests/scene_responses/api_search_walk_the_line_group:hd1080_1080p_2005.pickle create mode 100644 tests/scene_responses/api_search_walk_the_line_group:hd1080_1080p_2005.response diff --git a/tests/scene_responses/api_details_12 rounds.reloaded.2013.1080p.bluray.x264-rovers.pickle b/tests/scene_responses/api_details_12 rounds.reloaded.2013.1080p.bluray.x264-rovers.pickle deleted file mode 100644 index 3f3a982cfed4ee2dffe0c4150a151585465d233c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3335 zcmcguUvJz*5WmtS7p_g3f>eQ^(o%%fRPot&m!y~E5~(DCHfgR=bA6~#Ypv}~#>8j4 zyXz!Z3IYj14p{=JMj*ih5>(<5AwC4(g3rJ^56s%WyM$JS3c)>`cV}m3=ihH;J{Lk^Y5IJA;}&bJ~qMT|MJ7Wt%VR1H$8%^S1x({=LpMl1OwiAMzE zdyL~^D_@+u5>gwOUM)|TYjtvQg;_53Clzy%9fWSGZgI7@I^Tk5id5!EGuXpVy+Vxo z{7iM;FnUjn*-D;rx*uq%eNzNiDf1L*M?z|x?NQH7EmEq6obI$K zE;jSUXpdhhR}xI(Bf+kV_LsJBvz%`t!MS6Zf(e0+TQp{v@42>JvAj8I&FmPnJG-G( z@eFI5x7z_-Ai0@~x%V{mo|buUX5hUAvOy2DD?4oQa@8;vNJu3t>I>wml;I8E>nNSZ z^OVp$=I=;Ag0dQOM7y37P8f>sbdOJVLe&0rkE@k#Uy|%V>LAn*LW zuD*;}gt?+gPJK*CE;YgIh`X|bXIt4>tADoDKbvZ!_7t_RRc30lhO)r*Z7*`zR%ERN zZR+|0jpED;sDlqh!irBu9OKslv{20J`u_fYIdyH>4%#{mUEN`lx}MN0)ilsfsZ+4lkqn7F$`X(p=XDshMqDvtib80`<109@FKO;2$x#Gh!faR8$}SHg0xey z4N8Es?ZpfKg@Z0E0b;$O)1`7l50!=-|ES|29>vm=F-tN`6DmnRPGl2vgiKG@P*i>y zZBMO67bvfl5-4tHCtws#rD1?^I6L_awdHaT_|H^ZM!mqMs<2^kz20B`H@WtYka@B; zn*!|V*gXFPY`P-Q>h+m9t@1wu6fVb`z1-^u{NDl-=I&rfn2(*z^>?te9x*Q-;fx9u zv$Kz(1reQ9W5o7EzvuNyXK&^`HLKEVl=s@*#kgpO0aj?NVB^XhEHA36zl$vKiz{rK zMxM-WZDwqP9_%wIY>GAXFfQ_KyE->JlXS7=;<94QnN*m4j%IusT!&$YR>G^uHkOrA z(@Coz5?;v(xg<04u~fO+F10-M!nyp|7spS!@xY z=BhU5!Vcc{aU95|FdR*)wQ|}x&rsWDq0|QHdFDz+S?wq6*v@@7oFWd}_S8^>4jajC z;UZ&3y)NmO)JX{&v7ZfCxWP6&*z7VEYB-MUDG}HW;Q?5An_>X@YWEPlF0`BAcOmFP zcnJ5pz}E{Px*)p{!2xt8;eNC4aCmUk`$MV@CryknCZ!5YJc{K#8#M1EA|5vt1ENC> zi3q!9WJMN*cjDn}9)LUXb2ru#F#nxukYw8s=KhdRF_GYxco-+T2vdsu-4up1teR%f8RP0}ijdg|JG z)i~753Jq2lWEwUxTr!Q@)!rD`6pkt3{ diff --git a/tests/scene_responses/api_details_12 rounds.reloaded.2013.1080p.bluray.x264-rovers.response b/tests/scene_responses/api_details_12 rounds.reloaded.2013.1080p.bluray.x264-rovers.response new file mode 100644 index 0000000..e69de29 diff --git a/tests/scene_responses/api_details_12.Rounds.Reloaded.2013.1080p.BluRay.x264-ROVERS.pickle b/tests/scene_responses/api_details_12.Rounds.Reloaded.2013.1080p.BluRay.x264-ROVERS.response similarity index 69% rename from tests/scene_responses/api_details_12.Rounds.Reloaded.2013.1080p.BluRay.x264-ROVERS.pickle rename to tests/scene_responses/api_details_12.Rounds.Reloaded.2013.1080p.BluRay.x264-ROVERS.response index 24b1948b3e225ec63f8c4ac76b53d27d8101bf2d..8f3dd5f004b1226f16461a50ab80061282abfad6 100644 GIT binary patch delta 8 PcmaDKcFSg?LzEl<6nF#0 literal 11119 zcmcgyTW=&s6?U>-+c?=v5)=tRpc!7W!823cU48R{&4kCojsAr~Tt9N_4 zCw=j*b3sHxVU1b>DII|X4@eM+M}!c+fq#(){s^agZZ^A9ky8m{$x~gIbLw2ab52jy zFPA^-|9GkX6ju`RUQW_1Z4Ki-3DdGz+b8KLj#5&7T3-9O{HT1jSnKrSC?io;T0i^# z($WWw$RCo%W;CB8jFYU3NRyQ*Gtc#~jInc?*?~VCh2$%6OY4QL;e(?Y zJ5AKEEMjrW4}+wRp{i&2<=ynFaD!#7#7}0tu!`36xr&84UqlU=9GzM3~hIuAZ-#T`9ub$C8X+}s`90VL}Xyv z(vYU=lE`TX2BvM-kZjZD^j499X-id212l^cu;XGom?D-v#A|5=racFo$<}!7z`(SH4cl}vC#EF^rZvX|NE^J~ z%D}X0xFR;ZGw(v@&v7yX(>6w`VIt1xEi*6;a1&h&wE|ZqATuzHRMC)Jhtrp22Buw6 zhk^|1e?A!)nARW#nXddk%)m5uZO7!Uy=4ZbHQkjZQ|HwZ1Jg*C zJcM}T64WXSV=J;%WOyzorZEfCqNd7N;;dUS1Jm#ZR8?f0zJwW=R*~oGmd05bV+N*e zN5PJ3ab{7>z_e^y9`;<$iVQO_t+<+KDHdns!wgK@F0v(LaK0%*7G8)4RZ|`K z1Jj11ND6}Z&K12e1JhU+9o5n~wWKgGEs2)nLN&lAgTlbHY@5h+c(tT3FfGZdjIhob z`4k4GUClwdC~+cAVPIPK4Ba*q&J3h5Fm1aw!lK6OOAJiAD*Oy*@Ma*;!9q+Mu5C&p z;*8!31JkaAZ4YxJj)7@cRxRx4oW7(oFs*5Dh$Hd7$EgfVW5;qV+2O3cRR*RV$R^RTRVTa`AJ!;*woI+tcSCMRBv1Z$p4qJ$XYI=4sYU$dMlgwM5lcM~Q!L=tE;~ z(pa0$uQs=yk_?!{4+4;X{Qw^9$wQtdNx$1kNt%MU+D?1EHn@6#~=8k zQ5f|6$_3i@(>S^=^r)YJ>^Jgk(9|mm-vP%0_i5J5M{$xhQ_{J|SRMyvNLp8C>2KEc!v5s$);M6_^pk1kd$m~YjADp)5V@XuM11RF89I46U&x#skpM2kdY6y$;7mCgRTro zMq?m);dS@0q#Awu$;h&vLse2`BDkqntiM$~K%T80ULGC8>If=>@ohh-QY5*BD$%d_ zy&f55r!wsobKEn}vzP9@AB;AHJ{g2neFUpk#;c$)o(%hXt^HaxvJOEZ8rNFz00CkC z@PLp}6DpIViUedq`XTL35)`3y(t7Zih9`8mOQRDSpU}}``rZjmc9v**LbDT^(?|69 z8hw9vrf~XUt^J#0n=Dr`xZDK`gHu+9Db^sgk1sUdEz{z1rbsMUNDrU~o_SKNOh85dUR)hF&kVmf>6;@ggGI|V zpy)q<9w6(~g2z=o45bo*NwZ@2=7Z0_c(+*X2M|t@iYElKVU_7&Lr{>{%}!MY?T!Nt zL>HKJu>n{+|Bfe>|H0k^bpP-~IE%2gh-N{$-c`m3~hDR{K`#zrEDK$^ZZW diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT.pickle b/tests/scene_responses/api_details_Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT.response similarity index 54% rename from tests/scene_responses/api_details_Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT.pickle rename to tests/scene_responses/api_details_Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT.response index 5206022e4d048539990429e73a64b05518bdc2b2..1d0f2508c3fc17eb795408129a322562c5834e40 100644 GIT binary patch delta 8 PcmX?QwN+uGgQ)-j5Xu7( literal 7498 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 diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01.Jonathan.Amess.Brooklyn.720p.BluRay.x264-iNGOT.pickle b/tests/scene_responses/api_details_Bored.to.Death.S01.Jonathan.Amess.Brooklyn.720p.BluRay.x264-iNGOT.pickle deleted file mode 100644 index 1c3959a506e5f5eea9c475b7f51adbba4434d94a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3395 zcmcguZExH}5WdnR7p_g3wo(OxN~U~is@T4lyj+q?q$ZcXB+VsCt{*DYT6^{;c8i52tNKnK_g!mEsi}F*LwS9L9ttb_!`HsQQvux#DdS9QdKPt9BnCGq^F5c*=y5dqAo?J>Cz_D#d&;uM|o%`Kg&gS-HAej~+&1fYD%& z2DsQv7w0bf#007rwQ;RfRxVa)!zS*iRL;@^-;UkQE_GJt>ky79g=wYc?cqqK8ftw2&JCm>%QZm)>Cqr}VuI+`* z&;||-XUpE*omJ9j&ZW^)F?wney@_7*W|dWPpkCglb5q59epc}bhdF&#xyHG_<~l9u z({Kt2)uHY-2NcLxBSzF4so+>%>YeQ9@s^L?pX_MWap zT9#MeL=+)bR2~o)AsKL$Q8Nr|-omrZQf{!G9ZvKd|9-{05b&}ydF)QNBF7Ujftn7)8$wKVQ& zRfiD8Tj3&Y8X6UTX4b+($Wr!ljEvgySi3Ktbr{-(TZ+I z@LE!0(7*7}u}r4&PIYauertV6xmI7jp{(CrxN&_^xuEL$^`-h1U9Z-w$w^Vm>-tjd z!hEhGgEwE1HHaH-bBE5C@&#qp+oP7UPJjtEl5$4h7`y^NuVgMbl{LCi&vT~&|4Ae@M^0>f~6^d&maRHrSxROcCV zJd?<_hpqQUclkCBi(t~6`kHl=W){Emr2kWl@~?U@IA*i zvHK0n*I{dt6X7nZh_h9?MM8%sx7HK2-u!kcXC}e^`$%MiEwea1IT5vST;sBkpEd|H zx*9cc5^Rg&beG19s5X?eVZ(|$Ckoz51*s(?baBkuTQ+Gp@(btEW0xI0X^WBGNos5* zBi`-_vHKggizI!l31=R2Zk9$ZRFq-{w$|G@npD_uz5u<^n zwL`7ca~6%Fj5v*-LsBi$#((M2zTj2?7az7yZZvLxhy_A_j;2S27_C#<2V~m`_bC zJw#?(45UQ`zlxD$dF1#^D(h7k$4h;2LBVfm4=d}?g-4P=Bi*8?)MdxZKRZa9!`JZ5-w+Mo!gtSN_lF}Ggdc106Fh-m IVr*%D0SzOlW&YatK&iSb4%gjI~ z{)wT0-VZ6`Olx=+byy_&H!1Tym(l1+H1a6=Ai5&@4byWub$PUyiNqPk2@e_4EE=u+ zA+kV;MFYHgp(Bj(AT)UxP)S`RjNU?lF0;A4M=Q3;+pkBhklbutx)2 zY^95f*L-3E)r;DgR+>_-RA}8M?uca0(gWX))y*!oSC?uKjw*#|rRweBXR4s&r)I{B zGx>b`i2+l}Q>AwT&xypqV!U5$@85PkHMVb5!BxyWsx(5z)qw61$Br$Ms`>%hX%Jj& zq>KJGzf>;AD91;%CcJjU1@gcIez>F`u7Re8OQ)pH*&h?ytK}Q|dIB zriAKHcZUNKq}7-s>S{_jm6v>H+kCv~qxNUpT(x-n8m9+b2i|aI6%$B+hR)rtU00{% z)z>kLFjrI_5EoN2;3}hL7}>XIsfxt#h{3IU8-D_5`&r6~;>wd1-;|noelZt*~D4 z8pL)P8Wm8-BNjdsvbs1O1{lBFfEKbDUEkl|*J9Udrq|GkZ|fH2#CDjzfZ1wk+|w!) zy`pX93)&jlwcQ=f+t$!szP8|mo20276eq@1yLw~2hS>$SOoL{0H-c9ZP(km){ZpAt z`K`+OV(rexl5(@QwyJF0URb@gs9aWc{nk?Lx~^AhmE@$T<#m0jdU-xqmhPG_OVr_p z+uWh^rF=nI^Y*BvY|x-VT#SR$EbGZ(uB^w*<+^7z<^96^b9j-OEBo^`po-<0VFN`d zK$y~q#g>Tz0o|Uv{8Bu0c^(k$Wu44xW!;x52KYxT3lYiYpO0E4LA64-(utI^fmx!A zjg?STdKrz6%|;(cx8)+puBoS>AI`*afI&Dn^3tnIzvG!imNqP}tDWUb%C>(5&eNrd z=@-NE(sSTxGf$nG8lP4R|1(BmQoPg7zD~sdH8x@TE(V3V*v$~cSYD6VC;9?Pn2g%F z6M#WbClwjH)o`cpbx7wn)4rNi>SYqNTiz9sHGI#pO{`*r(jF`^va-L2EaF0iZj;dA z$*qlqt=orP%9%;9jvk6^ux%EnC&r@|wq0Bn^3w)kMu(#+&Vp@G?9x(r5!nWka%xy{ z1w_IdDIt|)gf6yAd)p>;N4{_|J$Bjgla?6no}|K7GUClH5v#aiyV&fBgReObTGkTh zkDtq)g4E%-q*KEWJnrELfZptlgB*#|`;5sH8#d|)pIvIDnzLvGX~c27{Ufxh=rLSx zKU#j=dUh|Y$1{txoZ$om@3*O0>JXn%3qvk@FSi@mlU|h{9DX>#7_DShGRvR+)|2@p z+Qb;Ak&PfDhBgA~6RiGeXuARJYfugz3O#*esTRQ`+&Niaav_c*vMb>fC33gr1{={a;Qp)7S0c3|g$?T;!J-FD<)gbwRVZs8(f zM!l};SLI0#o3Wb=S-8Pg+}-R_>Z>@C>`4*W5#b@!(@sSJ($(%EI4x*Y!EJ%p0{;;1 zw;))_0BZqnK?n!X9DxVbj>F;MQSbN2N*q-&!kCmYFrps|d@^j_jhGlTBm<&D4vGl7 zYFH2J1l|?B$xHxu#VhM85g7lKYGUA6qn8?;(&hiavAHUOZPAxNvK#a)f<+Epm@%Tq zC74L?tLVk4F2s~lUNni}94jXpbjG0k8qB9ALJu>uCHhiO!OvniSspt+pVGPr<9Mkj z1{C~)@(@`^E*#217{?}xOr0rr`NyZv?uo2rV>t=rn^?>mvgM;fIElwgLykn%q|jh> zL8e{xK8G(bRZpZo kJb|Oh4PU|6f5~Y02EIL+yWbtlLHNE3KfqJ?Db6kJPn(hIyZ`_I diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01.Making.of.720p.BluRay.x264-iNGOT.response b/tests/scene_responses/api_details_Bored.to.Death.S01.Making.of.720p.BluRay.x264-iNGOT.response new file mode 100644 index 0000000..e69de29 diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01E03.Deleted.Scene.720p.BluRay.x264-iNGOT.pickle b/tests/scene_responses/api_details_Bored.to.Death.S01E03.Deleted.Scene.720p.BluRay.x264-iNGOT.pickle deleted file mode 100644 index 88989dbfb50b3b782e7b681f3916c1604c632140..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3367 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 diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01E04.Deleted.Scene.720p.BluRay.x264-iNGOT.response b/tests/scene_responses/api_details_Bored.to.Death.S01E04.Deleted.Scene.720p.BluRay.x264-iNGOT.response new file mode 100644 index 0000000..e69de29 diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.1.720p.BluRay.x264-iNGOT.pickle b/tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.1.720p.BluRay.x264-iNGOT.pickle deleted file mode 100644 index e2b864dceb16cc73ff206a24fc293de6c1e41d71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3375 zcmcguTW=dh6n2`6gWFu%N)-qyErExo%6ffC8YgigHF0`L8YfEJhl0}8cz2SsWWBrH znN8wS5S36Hqme-BB9Pz#2`crG+mGO1^sjJccWo!MDo9ZL;GH>h=FGXD@3X$I-ycdv zKQZFddjVyfWgD(ZZ5E2bP0BpiVKjUajz0`P2``C3-EbXF9Ud;FLUEdL!UKjhlZLB* zh%``QQXj9L?+9bu4-6joR8p4+qc>5Y!z^y?(~4#Awrnw=Gw%8nr5dhnQ-fRhH15`Y z6iLlC?>_xIGdZE&Ce*;*J|OTPz*5Y?^7Qa zTgl?WRgV}zwL*3>TP!J;Dzt79XIwI;>7i#u>ZX_5tBW-VCKMD{b@%a8$}73j>{MYk zmuo*UWJr0c^p5Y^p%_|<_Dk*kdycC{_Dv|bikK&qM!>l0(|uxFkwsEf&nLSLf{Tr0 zG1%sp%4Hbk_=vk_q5YXH+$<%Vfcd^z*BNCD9XDUvDH4CrwarqVI1Sio6nFO>!#4K_ z<eXF3KV8V><`j=`nAhf%8=QOVj@^_x4JRp~ z+SJ+QfCOnZ=7@SLA@t-V-^a2%;-jJSw`3b z14Sr6n9_*EmWcvB-I*VIy{;Nt0IdJAMi#PV&6B$N_(x0=Ym_a#ypEN)&K1IyPVAHo z%o}BLvWTLR%jkv3esqTPUnYd~n%V<{a5@SI48z&+*WPaiZPy^O*cd+{ZeYcW?Xm8NFY{Qq3OFfBf4=VK@I|6SR_%r=IJIymtxXBS)WF+;_G zPYIK8Jo`c|VZFy)8z+;jxY(uj9e}pXJ ze1-0iz~=F-jhL-Fs~yUjL9o{ziL}3C6lShWg)JP-xXkBfbi(uwM^&5w%cMBTrSJl> z4aF^2H={0zgtrqyB1sP%9I4ihMe4SE;X-oku#+b(G1@&zgsrB;J6$4ndfjpm5D*(* zvu(7jCC;5ZmvaZHqfy(Zy63yxMVNrz?2n=yirxdpWUh_sbu6eoY9^Yqa2#pGw%vnc zw5sUS9rqwydE9z_H>gLrMq17g<-o^nYMR=_W7Ncu%lXW$2F|TF)tGq$M)9 z*4O z=Mq}C!Z=>)iwX*UMR{0R$1WU6u#C`(B2xzmuRMGD{H{ow7Pb>#zKPAOA<+OTglIil z>Jm0p<3@ws1)2JF3>S~$cB2g!t1PH9#xUZETR(+|Q4Rgp6W0)Y4v&)bX~7p*9Hmzm u2Yd-%VXD56`tSsfCpUZp-~J_|;XC;L#oYbjL=M7_Rrm>>!m}v1vVQ_oe)jDE diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.1.720p.BluRay.x264-iNGOT.response b/tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.1.720p.BluRay.x264-iNGOT.response new file mode 100644 index 0000000..e69de29 diff --git a/tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.2.720p.BluRay.x264-iNGOT.pickle b/tests/scene_responses/api_details_Bored.to.Death.S01E08.Deleted.Scene.2.720p.BluRay.x264-iNGOT.pickle deleted file mode 100644 index 73cf0ef0e25b392f58d1db32880588c1021d2b2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3375 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 diff --git a/tests/scene_responses/api_details_Damnation.S01.720p.AMZN.WEB-DL.DDP5.1.H.264-AJP69.response b/tests/scene_responses/api_details_Damnation.S01.720p.AMZN.WEB-DL.DDP5.1.H.264-AJP69.response new file mode 100644 index 0000000..e69de29 diff --git a/tests/scene_responses/api_details_Damnation.S01E03.One.Penny.720p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.pickle b/tests/scene_responses/api_details_Damnation.S01E03.One.Penny.720p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.pickle deleted file mode 100644 index 7ab97a1b14fda257282003bdd9390050a76ba9d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3383 zcmcgu-ESMm5vOBGRA@_mW(>Anwl2&dtvJ zX6ECLbo3#kgq&KBqoU)(VL@ z#W>+HLzzvJ&3}m^P-4>vubv+mV?2s29!FG4*9fCG(V)*9?i|pDWAVOiF=jFzL=>%B zf$LI>JNRkb?L=sj+I`(y=*5UlI4X`b(w~d%n9eB1qOuYDO2w!cO1XN~s9iXjMh7&)#csa1uo@Bzs9w=#wQ5bd+@KwY_|sCkNFRkx>TYqpzq;6lct$BND$U>k ze`;j~?ax)N8b<#U6PC26%IHLan}~_EbidZ$|I826^nEi5u2SV0#fuqNBYHqwCw-B0 zHH^r>0F6XjvomgIQah3E^gNHP0XUm?wE`+hJjl)qMElzjCjFj2Rxpe zzwgEm{lK2}Lb^~jg7T7*KXW;co{G^^v*^tYqqn4NlSk_6K3!g@7{-zk5)RAyl5&Id zaL0GM(x=HB5~@r6eGVv)uSSfhTe;wbA@xr8^>{Z#?@#x&+UfQkP9Jd{xaTe@7LW)Z zx_rC+o?4Sve}pJPtf)L9K0-3$Dx+2$IlPN!yV+TLaJD-*oAJ~GzK~tj^~1wMEe)+^1)feqN4F^_j?450 z@q8jts_h!(b)%~7_*83A-|uP|tWaCs{zX%JfBl-;*wPw}pU-J!?S@vFpH){kTJwtt zG;ky$y2;%H-pc9=Mz1|NQ7F{kZS1VI@3hvH8}02arFHw-*3C8LlB(-B*W2&udZXRQ zPAZzA>+8)+E2X-O+)7;*Aa1zBUAj^=%F1?dKy9T(Bair)61Q8|v%^wdPnGMP!0yWX z<(1dyqO?>GSK2@oJFsF8O(;N^;-zNmM1hFzEnoVfgLP>Ium{w2vZB@XPIoQ!Q)xK zH-vB1bH?4kN}+^JcWbcx;W79|)qAp9dxQGD_?r54SfJKwbBk*E|6IhdAb!=yC-KDOc`PZeVkB`ok0arTvp!m7`@H%_*x!HgV;&fdyraMsl~NYo#X zmqpPG1J|*z<4ww^VLOsj;6AE|^9{O3VwY#PTAA8#X8V*gi(t=vE{f5fRau;$OL{n> zaalGNO~TB9MpK*y$EG;ZrSS@?O=PXtw9{^hf}iAq+>#mlI9i=Ohjd)|g$wzy&yJt; z#MJO4H?~<2KOG9O8I9S`T%+wupA5+|6W&BA73WAw+Ph2JK(Fvodj6DWu?t%!yM2~3{aVM50|${|3b zC$F!!6Ig&duXdeMjMPO=Fl1b!bX#t47|YFtu#2~Sqz@TuLn>3LYH6XKA(ll$t`6aO zW;K(n4*)x{|JVs<6r1k3l0;#^#>nN|_ijj%`09rgsx2CQYe;)gehGmR&RM#2o^^6r&k`fV<+Yoy`Qy@8;UqDMF-c zV&WJnkRF}T<^PFe94vu7F_x9&FzH1s7D><$F=E6g2qgH27)1scBczo7#oCbbO7?@n zn3TUJ3#o;rhsf-SvAn3@Z(=H29y>ml%Z3%k@zO|IQ1ExOhn02Y!gEQQkz!F)8ZhFG ze}DP%o+#Q5wv$MH6PuYQIRQF^tUXEBWVr6Z{S%DpB{XI#Zmk3#R0#A-y>9Cfj+!|qu_==!KeR$X!s2N{3>?; Tatwp;c@w^XFX68#wzO{myYKLc diff --git a/tests/scene_responses/api_details_Damnation.S01E03.One.Penny.720p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.response b/tests/scene_responses/api_details_Damnation.S01E03.One.Penny.720p.AMZN.WEB-DL.DD+5.1.H.264-AJP69.response new file mode 100644 index 0000000..e69de29 diff --git a/tests/scene_responses/api_details_Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD.pickle b/tests/scene_responses/api_details_Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD.pickle deleted file mode 100644 index 19b1d9b8aacb53e40ded8e4148ec8c271bff3bf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3319 zcmcguTW{P%6yCH+Hf(ciD^(zbNhgnZIicTi(Z3qFQ6#Z^c;tp+{UMI zw;7;FYPEQ`QHySiaAfQ*$Dhm9kd7((tg;%qN>MNBN@09XpPDNcm75#Y=t(4c84V6- zfQy}Uap{^*OrTmZKan4wQLdC}%_i=sWX{qf-;UMIF1J>fs}PPUg;}NI9pGoCpy)Gm zlf^k*Z#^+!N_ndEPT)C_7+8w;ORfD!uBXQKjVZW_na7lR$haEN1LD}RMN(BiAbWL! zi>-9g*W#DTNJ?9gz8Xtj{_2<)tDpddP?ZhC0~Dwk2ieOzQ4s)jkoV|dc-y0b!T2Nfdpvi!tLq} zbw*x&53>k!Mdbl;F(m`8GHQl_%^P^OlbluCXFKh)u{vr`Q2X)1EwEkF2`#!4 z*2-R;*e*k(0_u3g!iPdu6KBH!dwmMcJ=!9@=6&K3v8JIjp%L!XA(R?&vmCO zlPP^z-dw8Q*;-assvGOd*6r)-x0aLdxRpj%N~C(6Fekx0i1} z$Nm)>&yG(`ydIC2Ux7!PdFsr}(yCigYa%(GL>-1cga%K{&na3g2 zk!>I;orV=xJ0!fH5>iP<=wfTMcWqL0_Nh)kDBR=R5v0@vxi;bN) z_?qLOWleG6S-${Bb%oJFHZBaVaR zwnM9kZo~Bsqt#0D#l5f=&nMDyhSLgs(xPUmLwrUp47u#H+^%E)c}IS5(BTAQw3b=R ztUm4P$$S}YV~o?tMvxIhTLJY64j^f0I|1#jQw|;qJ$rMx8o@N&IbBt9A&wrh1L4FZ za<}CMo2lGf@*8;D#rB^}T{wyq$MbQc93rMkeXe%WbLd(^S#Brnz}`dKA5$#4>&PJp z9oC!N!bQT2dR^77%99*6UN;%2aD#2Pv)QNAS8@C}kRq`A!6T@pt%(AptNmkenozHR z+XSx({xLjgLa>$r)&$;!5RRZR3J)u7hr^@T`x{A2x@G;1Di~o*N*Nf@hh;q(Ebm54 z3>uOF(IJOIgk2@9g*5^ni=L$a!(DM^b1eenZK);(PBe9?QI{tF2TsgT5$uZI1d^Sg zXAvxNz`~3X-7djIg5O0CPH-Wnl=8Z%3ujh2y`VD&<=0?7H4%E4nN87~f(m{W!^!f* z@r9JuK^VtN-7%oxHaxe9LO6BD zOGA!7m88&MbwQ>c1H;ARxUICtz6uL#jImC{KZD0HhP+aDj3M{}o}}s1gr^9OnSTZc vd<9=)s-8-Hcm^*gH+&1<{Vk*6d-&mW?*5qOU{V+0rwaTG&*7IixAK1hAh_Xp diff --git a/tests/scene_responses/api_details_Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD.response b/tests/scene_responses/api_details_Fawlty.Towers.S01.1080p.BluRay.x264-SHORTBREHD.response new file mode 100644 index 0000000..e69de29 diff --git a/tests/scene_responses/api_details_Fawlty.Towers.S01E01.1080p.BluRay.x264-SHORTBREHD.pickle b/tests/scene_responses/api_details_Fawlty.Towers.S01E01.1080p.BluRay.x264-SHORTBREHD.response similarity index 61% rename from tests/scene_responses/api_details_Fawlty.Towers.S01E01.1080p.BluRay.x264-SHORTBREHD.pickle rename to tests/scene_responses/api_details_Fawlty.Towers.S01E01.1080p.BluRay.x264-SHORTBREHD.response index 780bcaa2f006057399d5174b1eedb971847d725d..23e78ad3ea159ec6fb54886ea55fa6ad24e60ace 100644 GIT binary patch delta 8 PcmX@@vPo;BgOMlz5jO)Q literal 8779 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 diff --git a/tests/scene_responses/api_details_Fawlty.Towers.S01E03.1080p.BluRay.x264-SHORTBREHD.pickle b/tests/scene_responses/api_details_Fawlty.Towers.S01E03.1080p.BluRay.x264-SHORTBREHD.response similarity index 65% rename from tests/scene_responses/api_details_Fawlty.Towers.S01E03.1080p.BluRay.x264-SHORTBREHD.pickle rename to tests/scene_responses/api_details_Fawlty.Towers.S01E03.1080p.BluRay.x264-SHORTBREHD.response index 63fd7ed98428bddddbe356df5dc9f455e1243b36..a514ed0f67fab820e0e9bf9fb9d1554f4f127bcb 100644 GIT binary patch delta 8 PcmZ4B({8lUfn5>+4(kH9 literal 9760 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 I_pQc%0Z3?682|tP diff --git a/tests/scene_responses/api_details_Fawlty.Towers.S01E05.1080p.BluRay.x264-SHORTBREHD.pickle b/tests/scene_responses/api_details_Fawlty.Towers.S01E05.1080p.BluRay.x264-SHORTBREHD.response similarity index 61% rename from tests/scene_responses/api_details_Fawlty.Towers.S01E05.1080p.BluRay.x264-SHORTBREHD.pickle rename to tests/scene_responses/api_details_Fawlty.Towers.S01E05.1080p.BluRay.x264-SHORTBREHD.response index 39c562415c1a14e91e4b7ea12b3bf16311acffc2..65147af37b8cc702f73f26aef0ff1a9c9a3bc7ec 100644 GIT binary patch delta 8 PcmX@@vPo;BgOMlz5jO)Q literal 8779 zcmcgyTW{Rf5msVZQWRek)IiZ1Ww$SOpxr&Zld>#ymzVe|snX^lNSy_D_pA_^R`DTW5{OiR( z{=Bx3|4T1N_>%|kFba-u0SUJ^wSO*N_8ZCA~WOEN0{P0nvBEfKYJy&?yMruXnN2VJs6 z#7k0D4tyyGv87s!OH~d+DF@3CZA+Fb%OI9=;O&;!Rs_4M3{oivu%(vCi&bq2$)y}@ zUX^UC`aLM693+uPs){OWNiF9fnJPl_4)_d+Ls}_^wj{P?-mGj(dMO7@6D-A0=Yq%? zWZ=s&-BN5(w_(AFFm)CV<(TFLB%6YwRpn5QX}6>)qyrfqN;f>IgN zd^x5qT@{RWWxphpV_N0~TePIA)+&@^S~DfSEw$8&)+&@^TGZMggHqKm3FVkZvS!GV zELWAG9Mf$>1U0p*dOo2X(*SANmaJA)8Okv&Nun;aQPl_}lw+EgOw+d7m94cL)1r)8 zvSn7b)^bcs$W|%;5Br6u3B)0Oh7Eh zG-@eE%dY$lB$i{^mL>QWg&X)Q)Ok1)kL*7@hY7$B1m`0kS>SnvD_lB}X8Kx~TRmIS&eoup%CmbLVRwNls>vMu^ ziMjzoK7X`UbD}!TF9)Ql+4hF2$`RI9; zzD;8%PAC*o2ROU`pLCgEX8={xEPZ!cfu(Vj^y4JLY}9Zlz6(`YpSm#|-E{l$q#&Cv zb!i+#7^wCG&%^!Lg?cUYwj&^k2a~nCP`X_lI58|-H1nV9odmCONayY)J|`dnalE*W zlyyPj-hbH1zR1!gilYM@L1S;+xYi1tKEX|)AvHveyJ6y<>-aa>;${3abo1jbTa(uH z4oTKHUgx%g1NhN+4r%MMu#V7##l=3OS7#;VDDblMqLKHFN&jblP|xLCxw@&?p-8x)f6iio5+p z)U{rZ9w-OsaS*FfFi?5oJs$P;d)|KE-M__+#k@V%ULCYoFSIAmw0Dbp=sc~r_VI01 zKxFrRwPJcKfO zo#K8Hx$zOq?GD<}~1ad$iNV7x*N}snl*YA7D0PiI|GZ;CpPeINIdx67_ zn$TW)E{Whu_Xr40*PG45!^1|d?M6QsHJ#9H4sh(a9&Mf)cwlbCWp;6tJ<7>X`1i^cYhiSCBi!r| z%ngEmG6E7DaVR&+$!<6tiSY1t?R(HqZIb}_H=537W1|_e14i%%To3@1ZoVGGTmf>< ziMi=5aXVlk9DIZTsqtnIJr^1@z?8O{k>!W=H^>TkJHG{TiCn#T3TGovJi)1)&59Qk zW)4qO52nrU#nJ#XmnNw5u)iM@7?|Mh!Fb@DsHoqK&+9RM8s}=80n?>HUDIT}&i|j$ zNz`ANN#I*At-yLO6Yvv*7%$F%Q&8-0;3N5ej( z403i15g3|0(z_1rPFHND7l=E+5U?3>0hV1X+-P@@dp;QW(Rg4?shju^Io+Y_^gPDl z+IZTh^E1ckmD$Xg*!_j{$Fo83-d)#+xbJwt&GSIAl&-Ka9J?b3NpG9Lb}bdVpiwM_bG_GmkIk%t zSMZB`3p(HtW}PP(hjqwK4j2iDgyb{Q8^2$H0P$@ z8IR2n7Q?2+98lz6Ko5|0V#5oT6GOU$VbL_)h7QqNIflq@$QNVtIVQgY zaA@BS4)S~Qhu4`t`I4M8Zt^Gc=a(#+d`159s_p)D&IZZfw#eVf*W@3$Z8iQ2pQBSy diff --git a/tests/scene_responses/api_details_Fawlty.Towers.S01E06.1080p.BluRay.x264-SHORTBREHD.pickle b/tests/scene_responses/api_details_Fawlty.Towers.S01E06.1080p.BluRay.x264-SHORTBREHD.response similarity index 61% rename from tests/scene_responses/api_details_Fawlty.Towers.S01E06.1080p.BluRay.x264-SHORTBREHD.pickle rename to tests/scene_responses/api_details_Fawlty.Towers.S01E06.1080p.BluRay.x264-SHORTBREHD.response index 4bb34f44fc78887868cfbfe6b24e86a8ab3d841d..d43ff3bed0735023b34bcde7176cda1a0eed5444 100644 GIT binary patch delta 8 PcmX@@vPo;BgOMlz5jO)Q literal 8779 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 diff --git a/tests/scene_responses/api_details_Rampart.2011.1080p.Bluray.DD5.1.x264-DON.response b/tests/scene_responses/api_details_Rampart.2011.1080p.Bluray.DD5.1.x264-DON.response new file mode 100644 index 0000000..e69de29 diff --git a/tests/scene_responses/api_details_Side.Effects.2013.720p.BluRay.x264-SPARKS.pickle b/tests/scene_responses/api_details_Side.Effects.2013.720p.BluRay.x264-SPARKS.response similarity index 66% rename from tests/scene_responses/api_details_Side.Effects.2013.720p.BluRay.x264-SPARKS.pickle rename to tests/scene_responses/api_details_Side.Effects.2013.720p.BluRay.x264-SPARKS.response index 43eff2126de12c3248f5c1122ba073e313646243..3d197fc2e5d242fb71bf73778dae0f4b8abde65f 100644 GIT binary patch delta 8 PcmZqm>oM8rz#|0!4paiG literal 9989 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 Fe*lX6MZW+5 diff --git a/tests/scene_responses/api_details_bored to.death.s01.extras.720p.bluray.x264-ingot.pickle b/tests/scene_responses/api_details_bored to.death.s01.extras.720p.bluray.x264-ingot.pickle deleted file mode 100644 index 3f60f89b75e24211e813aa7641027738b424170f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3335 zcmcgu-ER{|5I2y-sUabNgj%&o2UR74az1|$Vkb@{NWw=#Ohn8Bs^GM~TW5}(?~dKQ zB&HMnloot2}e<$Hp9B3jHu@-P=fgdAx$ zjaGk`S)jzG46mN(3*&-?mIxVD)J4MSH5BM^M>yMb$+1LFwj43J@EJv^mhZaM5)M9% zyBiEeQoF}{6SWw!i9p7orTBBI5z;BGP}NpKPb(El1+7?~EzHaoXS6G8jp#`vM>u8M zl;L6{U7Wla5DTbL%Ae1dE85v5+H{CFshG2LH*jKgv&+5JsRo2oTCu9t{cZeIidvyE zJ6)PB6namLSxTO+yu*Aql4FbUezCWI-}Cj@z9|h?G4qtx4!O`7-6pORTclJC7};zS zT&$;y(H_52F2||BNBk`Z?ayuCW-;A_oH4s;a>_Y6Zk|dvjW9=6vcs9lfU~-kTnHZ%$hyyZXgVIzLk?6y~&m2$(nKw5vh{H$1na zbQ(`nLU*aRDF6w|YRnP+dP+D@P<%&ve4-Pe_D6bLjd=UEpu55V(RSxF3kX9)=WjJG z>lJnN9n2!k6d(Jy&kDCW@!MtB~*737<4$Vex@Te@&wcf3tsU~++@vY->)iQr&@DHy&K9LQv9 zr(n27;Vj;c@qvgvjB+onn4!wH6u_OGW;X9jdug0vFU|J(W>&Ho3#~jhl zpD&}R^fKBWTa7MIUdu(0UDFT1C>)N%0ON3M@{QM)QP;PKDr{I>ulJX4CfEKEG7pt6 z!~lCeHc!0*n-2H&N@cpL7yoB~!i-$+@q2X3fBN9SbYixH1RJi>m7PkVT$YqAe1- zBDuAmunl^!M+LVC*3hRi%UV{cdSN>1V#~#4u~0P$H~SoQc?2ArVux13OUO2slv2}< zs~-~HO$n(aGxV@kIxUAZUG>7r^w{J3Pr7nqaFPmJ&B*r#M6BSZ<6)yGF23fvXjxYt z-+!+92~sEGa!$>F`NGHckKP=PV;sptJDjTwn=qRQo-Jypn)7H9X~cE?ojtU=95OwB zCtCTe`{HicjOP_)ImhV*KI&1k)FlC@HilgFUE#E`AHAhMIQR&HFy}Z9?Et(+{Dwuj?DGKJx2QYz=;#(9)j77c_xNYA4e6UuTwVaGNfIKh-=)0V4-B6QeDatjv; zGwOBDIHyi>*oeJkz`_l-;lXB$(m=;?WLt^AZU_&dnYJkkkgm3#g4>059lS31T?n4S z{VuT84Dc?9E`+cPok@65?>ihG?)CnVs>4woBaBI@0wYJUyeEU^orueEQ!yYq)R2g< ztB1|7N#H{{oXi7oM;^Sf8iDy=sV2wvHF>4c0Ym+d?VG70XvvWTl7paU5iDxp!iGL{-{de(bRnjc_IFbl&ai5lL1&DsugL>yA@ndayK*E275pM6lI6bR<0)-`FoBnb zVnD&KC=Zdf=fYDp1mnm=k*Po7t~`JK;;ziv4we(9-o#?oR{b6o!YMpnnra-XCxr&9 z3o;Fx7%maV?P_lftn;wRIUhv)5j>7DR4FGIf=}T|nm%3l0>M#vJviV?_zF|?rPPOK jus6Bk8~FAw84cgT_b=z}5BqWueyqb!@Em@Qb1VNRCO7SJ diff --git a/tests/scene_responses/api_details_bored to.death.s01.extras.720p.bluray.x264-ingot.response b/tests/scene_responses/api_details_bored to.death.s01.extras.720p.bluray.x264-ingot.response new file mode 100644 index 0000000..e69de29 diff --git a/tests/scene_responses/api_details_bored to.death.s01e03.deleted.scene.720p.bluray.x264-ingot.pickle b/tests/scene_responses/api_details_bored to.death.s01e03.deleted.scene.720p.bluray.x264-ingot.pickle deleted file mode 100644 index 5803edddf65e934c4562bf355c907484f9926749..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3375 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 diff --git a/tests/scene_responses/api_details_fawlty towers.s01e01.1080p.bluray.x264-shortbrehd.response b/tests/scene_responses/api_details_fawlty towers.s01e01.1080p.bluray.x264-shortbrehd.response new file mode 100644 index 0000000..e69de29 diff --git a/tests/scene_responses/api_details_hd1080-wtl.pickle b/tests/scene_responses/api_details_hd1080-wtl.pickle deleted file mode 100644 index e963b18d705b36da067bd85c4dc7d344f40a6266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3175 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 diff --git a/tests/scene_responses/api_details_side effects.2013.720p.bluray.x264-sparks.response b/tests/scene_responses/api_details_side effects.2013.720p.bluray.x264-sparks.response new file mode 100644 index 0000000..e69de29 diff --git a/tests/scene_responses/api_details_side.effects.2013.720p.bluray.x264-sparks.pickle b/tests/scene_responses/api_details_side.effects.2013.720p.bluray.x264-sparks.pickle deleted file mode 100644 index 36a49f1ce3738d1437e372619c7d4dbfe42190dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44675 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 diff --git a/tests/scene_responses/api_details_side.effects.2013.720p.bluray.x264-sparks.response b/tests/scene_responses/api_details_side.effects.2013.720p.bluray.x264-sparks.response new file mode 100644 index 0000000..180bfa8 --- /dev/null +++ b/tests/scene_responses/api_details_side.effects.2013.720p.bluray.x264-sparks.response @@ -0,0 +1,954 @@ + + + + + + + + + +Side.Effects.2013.720p.BluRay.x264-SPARKS - Release Information - srrDB + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

srrDB

+
+
+
+ Upload +
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+ 1439 +
+
+
+ Uploads today +
+
+
+
+ 100% + + Bitcoin logo + +
+
+
+ Completed daily pres +
+
+
+
+ +No downloads here. + +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + +
+
+
+
+ +
+
    +
  • + U: Anonymous
  • +
  • D: 2013-05-08 03:56:18
  • +
  • C: X264 +
  • +
+
+
+
+
+
+
+
+ You were redirected to this page (side.effects.2013.720p.bluray.x264-sparks) +
+ + +
+
+

+ MOVIE > + +

+
+
+
+ + + + + + +
+ Rating:
+ 7.2/10 (43,135 votes)
+ Genre:
+ Thriller, +Drama, +Crime
+ Runtime:
+ 106 min +
+ Country:
+ USA
+ Language:
+ French, +English
+ More releases:
+ tt2053463 + +
+ + A young woman's world unravels when a drug prescribed by her psychiatrist has unexpected side effects.
+
+
+
+ +
+
+

RELEASE >

+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ReScene versionpyReScene 0.5 + SPARKS + + File sizeCRC
Download + + + + + + +
74,430 +
+
+ Stored files + +
+ + + + + + + + + + + + + + + + + + + + + + + +
22,440 + 54DD7DA9 +
31,734 + 752D47B0 +
4,304 + 44FDACC0 +
3,008 + 708DD41C +
+
RAR-files + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
sparks-se2013-720.rar50,000,0000233504F
sparks-se2013-720.r0050,000,0000677299D
sparks-se2013-720.r0150,000,000EC01531C
sparks-se2013-720.r0250,000,000C044ED66
sparks-se2013-720.r0350,000,000FA484708
sparks-se2013-720.r0450,000,00041725205
sparks-se2013-720.r0550,000,000A9F30BF5
sparks-se2013-720.r0650,000,000840C9399
sparks-se2013-720.r0750,000,0002BAC7066
sparks-se2013-720.r0850,000,000A7F4142A
sparks-se2013-720.r0950,000,000D0A04760
sparks-se2013-720.r1050,000,0006BD558B2
sparks-se2013-720.r1150,000,0006E178796
sparks-se2013-720.r1250,000,00019E7E43D
sparks-se2013-720.r1350,000,000FFCC1F83
sparks-se2013-720.r1450,000,000A970D95B
sparks-se2013-720.r1550,000,00087F617A5
sparks-se2013-720.r1650,000,0000A7C2AD4
sparks-se2013-720.r1750,000,0007277867D
sparks-se2013-720.r1850,000,000C79F4001
sparks-se2013-720.r1950,000,0007E6BA438
sparks-se2013-720.r2050,000,0003671EF14
sparks-se2013-720.r2150,000,000BBCBC8B5
sparks-se2013-720.r2250,000,000BCF190DD
sparks-se2013-720.r2350,000,00027D0767C
sparks-se2013-720.r2450,000,000B00EE001
sparks-se2013-720.r2550,000,000073DC106
sparks-se2013-720.r2650,000,0008B9A046A
sparks-se2013-720.r2750,000,000D802F557
sparks-se2013-720.r2850,000,000DCB7BC5B
sparks-se2013-720.r2950,000,00023D37257
sparks-se2013-720.r3050,000,0000C664E2C
sparks-se2013-720.r3150,000,000403648C1
sparks-se2013-720.r3250,000,00076512350
sparks-se2013-720.r3350,000,0005352710E
sparks-se2013-720.r3450,000,000A92EA8C3
sparks-se2013-720.r3550,000,0009564FE74
sparks-se2013-720.r3650,000,0006DC41C50
sparks-se2013-720.r3750,000,0004BD37672
sparks-se2013-720.r3850,000,00002DEB28D
sparks-se2013-720.r3950,000,000FAF71B1F
sparks-se2013-720.r4050,000,00040FAC16E
sparks-se2013-720.r4150,000,000E65420F9
sparks-se2013-720.r4250,000,000C51D24B5
sparks-se2013-720.r4350,000,000616F033A
sparks-se2013-720.r4450,000,0002AB3A89C
sparks-se2013-720.r4550,000,00084338566
sparks-se2013-720.r4650,000,0007EA3F06F
sparks-se2013-720.r4750,000,000DF40C499
sparks-se2013-720.r4850,000,000CB54903C
sparks-se2013-720.r4950,000,000CEE9C201
sparks-se2013-720.r5050,000,0002BA64EA6
sparks-se2013-720.r5150,000,00001C346EC
sparks-se2013-720.r5250,000,00039F39945
sparks-se2013-720.r5350,000,000F38AC573
sparks-se2013-720.r5450,000,000F676B007
sparks-se2013-720.r5550,000,000CA5BCAB7
sparks-se2013-720.r5650,000,0007B4560FD
sparks-se2013-720.r5750,000,00046F0BAE7
sparks-se2013-720.r5850,000,0001306CAA0
sparks-se2013-720.r5950,000,000874690DC
sparks-se2013-720.r6050,000,000DD04B043
sparks-se2013-720.r6150,000,0001549577C
sparks-se2013-720.r6250,000,000CBB032CE
sparks-se2013-720.r6350,000,000A59AE9B9
sparks-se2013-720.r6450,000,0001529019F
sparks-se2013-720.r6550,000,0000E1AB989
sparks-se2013-720.r6650,000,00064F9FEFD
sparks-se2013-720.r6750,000,000355D31A5
sparks-se2013-720.r6850,000,000D416E0D5
sparks-se2013-720.r6950,000,0006AB89D1A
sparks-se2013-720.r7050,000,00058025821
sparks-se2013-720.r7150,000,000BE9DA1A0
sparks-se2013-720.r7250,000,00034848609
sparks-se2013-720.r7350,000,000E4567113
sparks-se2013-720.r7450,000,00080FD596E
sparks-se2013-720.r7550,000,000C11432EC
sparks-se2013-720.r7650,000,000A9026355
sparks-se2013-720.r7750,000,0003848AA5B
sparks-se2013-720.r7850,000,000D9E3E607
sparks-se2013-720.r7950,000,0005107125B
sparks-se2013-720.r8050,000,000E2CD502C
sparks-se2013-720.r8150,000,000D90792E8
sparks-se2013-720.r8250,000,000F04B5266
sparks-se2013-720.r8350,000,00055AE2CFA
sparks-se2013-720.r8450,000,0007294E926
sparks-se2013-720.r8550,000,00062DE8D51
sparks-se2013-720.r8650,000,00057A38E30
sparks-se2013-720.r8750,000,00021733A9C
sparks-se2013-720.r8850,000,000C2F39A6D
sparks-se2013-720.r8950,000,0007BEC3B11
sparks-se2013-720.r9050,000,000E71C6F28
sparks-se2013-720.r9150,000,0006E15D50F
sparks-se2013-720.r9240,537,059085101CE

Total size:4,690,537,059
+
Archived files + + + + + + + +
+ side.effects.2013.720p.bluray.x264-sparks.mkv [89e90bf7d04a0776] + 4,690,527,189EF39A8F0
+
Video files + + + + + + + + + + + + +
Sample
sparks-se2013-720.sample.mkv38,590,319024774B7
+
RAR Recovery + + + + + + +
Not Present
+
LabelsVIDEO, MOVIE, HD READY, BLURAY, RETAIL, H264
Warnings (94) + MHD_FIRSTVOLUME flag set for sparks-se2013-720.r00.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r01.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r02.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r03.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r04.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r05.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r06.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r07.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r08.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r09.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r10.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r11.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r12.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r13.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r14.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r15.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r16.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r17.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r18.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r19.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r20.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r21.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r22.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r23.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r24.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r25.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r26.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r27.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r28.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r29.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r30.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r31.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r32.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r33.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r34.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r35.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r36.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r37.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r38.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r39.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r40.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r41.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r42.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r43.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r44.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r45.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r46.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r47.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r48.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r49.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r50.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r51.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r52.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r53.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r54.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r55.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r56.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r57.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r58.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r59.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r60.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r61.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r62.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r63.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r64.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r65.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r66.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r67.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r68.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r69.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r70.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r71.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r72.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r73.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r74.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r75.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r76.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r77.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r78.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r79.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r80.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r81.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r82.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r83.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r84.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r85.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r86.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r87.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r88.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r89.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r90.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r91.
+ MHD_FIRSTVOLUME flag set for sparks-se2013-720.r92.
+ Custom RAR packer detected.
+
+
+
+
+
+ +
+
+
+
+ + + + diff --git a/tests/scene_responses/api_details_voa-the_omega_man_x264_bluray.pickle b/tests/scene_responses/api_details_voa-the_omega_man_x264_bluray.pickle deleted file mode 100644 index 1b7719da6ea3df6ff2823f28d5a63951ae7c653f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3251 zcmcguOK%iM5MJZQItzXP63Po{LM|A2cJ^U|jn|IAHV;1*3oi$RVAMO)c1=7xGw$wL z+k~JXMTCu7N+c#qq~s7OLE;!ix#S<@FXY5E`4_34nccMm3W-Rvhn?=~>gsxZRrOKd z7f+95;-4I0bUUP6@O;C!smmidc%AaV_c)CnM`I7752Mp^(6oF{P)|hjnMfYyf{2hK z&8E@vFER_1*p%Vb;~imKu+S1Aql!9DIK7GjJ?;pnNf#VTv}MZylMA0wlxq2|OD*Bx z)403FP$ae6yw_2SKAQ++>|2OGCu<=c*9z0xQs`-=LaCq?%jXMI=aF)GwH7^$8Li>p!OUcufcbM-+a%eu@&$svQdcGdpH?H9-W**lXAs0HMP2xJSMM~9xk?dyEj4pC^`4I2(-ZGacD*;Ft&&~+!X}+PS1J@{w15bhHD+FZ4G`?{dJ!T`~5XEX~4Lqlh8)Gp~$ z>gpSqMVKqPV8p|eWJ2fE3YjDJ@N7Lft98!SJ7?n!)SjUB<>F-dY(ZJzc$OR5bUmyu z_zmKC9F1bs^@)uSg}g3%Lx%Bt570t>-Y|A{cJi@n^OoN*NZ=SY6~uA5(e#NffSP`T zZW6OWJae~ncEYT?AtR_)7917uz36rXhZ6We|HWH9nM~!Kg=_P*n`?{OmD=ixwszy< z%GG)8lx`ST7i*UcW1+T?oRsnf!&t1In#)y`W9BLfU$_yDaOqsRP}ElaCbhLS%J6yg zxVu*|lEYlZh?y&O-`-RAi*qmFMQW}R%+-Kuwr_Xbfq@b^V=vw5segJ%1-!`nmP&PFRm;3uQUSNdrD; zQ?t}10jD;GT=hudG_ZHPram~N2!b(M&Maq^etWYo^GS3aW1L1df{YwlV>BQ*JfxxR z26Ui71^6hm_wr&bf^%^5`I?anacofC1E(FCyP-DN2-W69u!pxjY~9JkgkwahoR6E_ z2(c_02)&!0BNr0NVkcpTHt#yYxMtH0R}C=euz}x^+mo#e1-ddV<^8*G`~ z%@(DBj-x|UiNMYU_n@Bk848fDwjP1of<_g*7Wgd)9>I1C*m4GV3q%V-*oD0@xLfTw z9PaJ+exItYQ57SMNvQ%O2eD`;L*ea+%VAS7AUf1Qhp?-L^{`Ihmh4Y@H{6zot}RDk z{#&Zap#u$BY1Ct=|Dgl(PXrrsAc15z=vf4d8jdhyWS>Vck>DrUkJDF(DW$z^V#0Y- zO&;isVf8h6KrMtGW@bwcq@aQy#BsaQ9@(lqtaHx0 z5x)-)Vhr8?y*I`Xd<+lM^l8DT2#%@01_yiwpJS>%m-_G+_9r)d319swqv31#=K0+H T_COB8cUAZvp1{*MxAK1gYiZgw diff --git a/tests/scene_responses/api_details_voa-the_omega_man_x264_bluray.response b/tests/scene_responses/api_details_voa-the_omega_man_x264_bluray.response new file mode 100644 index 0000000..e69de29 diff --git a/tests/scene_responses/api_details_walk the.line.extended.cut.2005.1080p.bluray.x264-hd1080.pickle b/tests/scene_responses/api_details_walk the.line.extended.cut.2005.1080p.bluray.x264-hd1080.pickle deleted file mode 100644 index 7840adf98adb5405312931b45d972aa1ae091234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3367 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 diff --git a/tests/scene_responses/api_search_12_rounds_reloaded_group:rovers_1080p_2013.response b/tests/scene_responses/api_search_12_rounds_reloaded_group:rovers_1080p_2013.response new file mode 100644 index 0000000..6103bb8 --- /dev/null +++ b/tests/scene_responses/api_search_12_rounds_reloaded_group:rovers_1080p_2013.response @@ -0,0 +1 @@ +{"results":[{"release":"12.Rounds.Reloaded.2013.1080p.BluRay.x264-ROVERS","date":"2013-05-24 13:52:33","hasNFO":"yes","hasSRS":"yes"}],"resultsCount":"1","warnings":[],"query":["%12%","%rounds%","%reloaded%","rovers","%1080p%","%2013%"]} \ No newline at end of file diff --git a/tests/scene_responses/api_search_Bored_to_Death_group:iNGOT_720p_S01.pickle b/tests/scene_responses/api_search_Bored_to_Death_group:iNGOT_720p_S01.pickle deleted file mode 100644 index f7f87bad759883cf8c8eae6e03a3a6a8852e9b55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3650 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 Q_@W7afIq^Y;@m3!3ug=}uK)l5 diff --git a/tests/scene_responses/api_search_Damnation_group:AJP69_720p_S01.response b/tests/scene_responses/api_search_Damnation_group:AJP69_720p_S01.response new file mode 100644 index 0000000..9ca2d9f --- /dev/null +++ b/tests/scene_responses/api_search_Damnation_group:AJP69_720p_S01.response @@ -0,0 +1 @@ +{"results":[],"resultsCount":"0","warnings":[],"query":["%Damnation%","AJP69","%720p%","%S01%"]} \ No newline at end of file diff --git a/tests/scene_responses/api_search_La_Bamba_group:Grym_1080p_1987.pickle b/tests/scene_responses/api_search_La_Bamba_group:Grym_1080p_1987.pickle deleted file mode 100644 index e5836d13cd16978b684eaf9f73e8a0c22abe7e77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3499 zcmcguTW=f36{c-UR2WN^6VynM7}&BfUUk};>t~*m_Ut6ajsacY1f;yYZG@y3Fqh| z-;T`9t);80Z3t$y@}k!Aj_^|}Yo*%Kd}XOrO0SqSl|EfXfO$?RCmYeek?w!wdV2J} zSq)c_@T}GgxX>9rB90xsNSW$0a?m5V*hv->sk}1o6=Ir{^Yk8_IF5I$d(1wtUF6=3 zxyh~i&4|05aL>J_G~_uIc-%X*(S!M2+%%F+z!|f;9gh0Z^(!LiSpoHL1Pj5OZ9aIw zZxF9qd03k}G|7?hkCwH>Q7ei6b@aa;`+t7q|7C59JkoC-(3OQsskE&5M8Jx%tlbg9 z-*%n8vMGB+SRX$>jXsyuD}14^xtLd&qDo>qNo}2`L^-WqiP=7qli7o}Y+s2_rQ!~C z4+J0~72Zq;=ND^A@M0<``ab&OVk*{-wl4|#NEje`&a!3#Vd%P*`|a2D=;+Is*_gk& zV8q2zWJ2fE445tOB`@#By!Mc{JLJvw&>sZ-Q7z9`ZG?2uC-q` zjApwTb1KD>VXUO z_bxW!cqUOT6i3D8aQVy`^gq?sh3eeGw-?vdrxcgXJ-t?&U)0O${Qt4Spdpvjj2g!F zJ5&~|?V+Pb%_)ECC32im!c`A1Wua~~|+J$M((2;*I%mfFm21<`W4j0xh=aE|4!&$4UpUKG(*&v0QR}50pLxPV_<-IVi^3Vo3&)(RWSZ`D zu_O+ul~~Th8Kgz?^AxQmvmMtv4%a^&eEnw7jWCsZIY)#A@2Aupb%@WYg&|jSTi89E z9nYx`f-^xdMjM%p%=$+^$!6XU?_rFS$cB)Smv$KS2?ClVw4;EI_ox65m0q~L)()Wo z^vRx)4-m?z>47Lu=I^Twj#jm~;`i~ii*O=FiU@5g)nZ9K{gMI=I8aCF`NW8olWKI% zY8Ksh6sW>eX diff --git a/tests/scene_responses/api_search_La_Bamba_group:Grym_1080p_1987.response b/tests/scene_responses/api_search_La_Bamba_group:Grym_1080p_1987.response new file mode 100644 index 0000000..0f11e1b --- /dev/null +++ b/tests/scene_responses/api_search_La_Bamba_group:Grym_1080p_1987.response @@ -0,0 +1 @@ +{"results":[],"resultsCount":"0","warnings":[],"query":["%La%","%Bamba%","Grym","%1080p%","%1987%"]} \ No newline at end of file diff --git a/tests/scene_responses/api_search_Rampart_group:DON_1080p_2011.pickle b/tests/scene_responses/api_search_Rampart_group:DON_1080p_2011.pickle deleted file mode 100644 index ff9cdbc6057c040fc5732b7e126d7068c9afe7f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3483 zcmcgu-ESMm5vOfRR2WN^6ToPY8o06$UpfYI`Sw>vvK zJKyvBF#p-7v$^;uuQ2)~q+Iawz_+Q(BRR82dEk4TM!$#_KZ>43H{?vu@;yO45w#wE zP-2vauHdEB?;k8>o0cDXqO@8vOG~8_!aT=2N*Pc(8zOIMVUG*~!o&iyw0AoAzfdvj zW}x;9RkKoAC>=bD-Dl2`xecZItO~@Iu`#p~G(e-P=@y+F9yS4&@I4`Op9%xSz`dO9S)=L4VXLE47=Z@`>YFZfMi}u;2Cv#PK+~iBZ=l zHa-;czPuDN%&9d%pYc`0I5{~f$H6LF{=guCV{l5C1x8x7#u4+wU==IZh|AVcC5xF2 zj!MB{bP&PCq+P(&+wWb-<(l7W@3gw_?QUpyyW97*-3M>qzt_@Ax?$Yg=)PkZ?QT0c zsg_N{*yxnji%sR0^`@$L+z3awbiHO)v~B;G+S)E<1L9$H++ov54vS4AW^VRUUA1LFR8`I6c5wW{h;ZF%LZ%j)_I%F5xsUazk-^veIawxA^&SvHL$`?YHdHV)9q zlcrQWV~3n(lyDV=tIs7m7Gu(bal*}yXXTi5buXRtNpIdHEE|(IWT6-Mu47@BnNxaW z3sAlM5wghF+w>6Ivq*03CTtUA;8DRXf_?5(7TBRxZQNXmMmVZ*Suqwd-;ZHtY%3?fIU!<~ z?KvI-1mfaru8Wq9%R^O1DOF(P3^wcp z{vJeJ&h-=nR)+$YSazMTANC0x$*E*!gCj5QY(?<+M#h`}`u&#=Wx;l^oiOz# zHnV{m)u<4n_juV;kfoC}8tg8}G}Xg!i8yX|Gw|2pVV`r35l`LvQ}`Ly&@0>8cT@$z zr||PMc|L<*VrjJhduhPu@aq>PKKurLdnUEvckl&ni)Zo~{s4b`K6C$+W?<44;LjcS M3;Y%S7H3xZKO#LPQUCw| diff --git a/tests/scene_responses/api_search_Rampart_group:DON_1080p_2011.response b/tests/scene_responses/api_search_Rampart_group:DON_1080p_2011.response new file mode 100644 index 0000000..c2bfe04 --- /dev/null +++ b/tests/scene_responses/api_search_Rampart_group:DON_1080p_2011.response @@ -0,0 +1 @@ +{"results":[],"resultsCount":"0","warnings":[],"query":["%Rampart%","DON","%1080p%","%2011%"]} \ No newline at end of file diff --git a/tests/scene_responses/api_search_bored_to_death_group:ingot_720p_S01.pickle b/tests/scene_responses/api_search_bored_to_death_group:ingot_720p_S01.pickle deleted file mode 100644 index e4c18bac28c7a3c5d09cf7bf1a6e9d92fa68272b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3650 zcmcgu?QbJT8PD~c7u-uO*GeaO3iq8lG$dx zySFoQJ{1Z|843CflafCLgC_<#gRd_oBEk^iFK_&fN`?%GatC)$dNDDu2K&&)pa zd)|KU<~~}O8cF`-^^iV|C>Olg@onnzSWfIw9{3)o@lWHK_u^;q9XZjmd{0nM#I=9F zQwS-KT)_*=-%@jz5>5-tg?oNT?V|9DbxH&)?wh6J#y6UK>-)upvKbWbxzQf!7SGCe z=X9s>V5eD_E!ae;lV!71(o3dpE@-B?ocu$`2yfiqfw)U~y4>H}&z8>)X8Tsu{Kym7 zE_;=8kXlXSbRxn$=26TEjoVuvpT} z#pU@j9MS*8q^0iDRSbl_8_UUBvaa>lU-5iBdEcytS)x3vbs{eGke(3NNnWH(4MK9% zA(-rDlZn2*GVXO^S(NkscXZ;q{;BSV&XMCmx}Hk2uj=cGbSINuc|+Zh=TzXhf9wFk z{5}@7Y!UG=wA(F?`vLuGsq8d<4qvs8|}pggzWnPrcyXc5V8?U2%BI{23A-4+o($L3D*~Z!c!(=R zpVFAll1r!kO*ySziF_OC$=uP~PN3AM`syzAjs(L-U-@yiakaEmQkvKLnxY#3kZXOt zX0rUEpl8BhqT{Y;79%0BTYb{JuP>^juOYM%z`6*DhiVWCol`3c9f7C3wx7zH1KIvS zHroLp1b|dZ^Od`%0>$wxH?rw|)UNv-;&>c5p=|iX#)l%_mRF+?K~-k}jV~L<>FH@P z@mA6DI|d0HgHsY(%t+GM5WbP5uW=OmQLvn3u%Xh|K-|njOrL`C6VmDt6)|!lJwr@op zT%n=dX`STSD$!U-4_6DH2Oxzth5}PH$Xc;#1j?ciKg70C1o+yE3x$>z5{(FL;0J9N zF`&)ORd7{y7;jBpi6<+R@-Z9V)~~P$_HqI{n_@R+K7BzeFZHXx+x?OL~&4|Hp)5HTkuEYz-XzSrd(I902lR#mZlJ zjvNa?3Y1T7JQw}Q(6m6K{Y?)V>0s-|UPedK!o5ktehlrkUXK^6M9 zpdw$b(?bGMlAhX4)rR!Nqk>xmHSk=Hhlf^q>F#{oLm$VqWG=M`Zw)jW@)~n&ingyV zFGFoIErl&Rsb1K4J=@4`YDFIUuXE^-wyVByGZTCKvZN=chm!2Ftr7X9;U+3@%kjV- zh>NeeE?(A?uUwX^7K7dCq#V;$5cXLv{8!lJPTsR%{lP{Y%Gil%z{b;TsmWryMUT;G+Gs-MnkHa&C|)558-^b{s( zlZIVy7%8tnBlS|&1|!f$hl^uM127d3K3sur#?G0SwVkI-WV6$AcGhFv279~5-s!RL zoU>;=_T8-!_Pri^x5wUN-)BFVVedBvfV1<9=;u_OjT`VVf>Jp~PN00J9Q`2Xa;l{i zkR6J7BJCPcJ8BblBuCSJ&K&vD&Q{Eh|2NZqoCBDN0S_4KV~0h;qwvu z8Iq&^-;;y=g8lMEq0fHBetjXh*>BiyvCLnHX!d*dhv#GWkC$SQ{i(tJ%>Kgun#5M| EKl5Q(umAu6 diff --git a/tests/scene_responses/api_search_bored_to_death_group:ingot_720p_S01.response b/tests/scene_responses/api_search_bored_to_death_group:ingot_720p_S01.response new file mode 100644 index 0000000..b9d3714 --- /dev/null +++ b/tests/scene_responses/api_search_bored_to_death_group:ingot_720p_S01.response @@ -0,0 +1 @@ +{"results":[{"release":"Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT","date":"2011-10-07 00:00:00","hasNFO":"yes","hasSRS":"yes"}],"resultsCount":"1","warnings":[],"query":["%bored%","%to%","%death%","ingot","%720p%","%S01%"]} \ No newline at end of file diff --git a/tests/scene_responses/api_search_bored_to_death_group:ingot_Extras_720p_S01.pickle b/tests/scene_responses/api_search_bored_to_death_group:ingot_Extras_720p_S01.pickle deleted file mode 100644 index 9d338296c1fe3f0d86a42bfea080c3d3745bbca5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3689 zcmcguYilFd8TQ8VrOMjtO<-wA7p5u;>)_Go;=5&oSMpx$wQMYHX(?WDG;{1T-OA8ZsBC7uL ztz1BP=m?%${ehZ0lyI6`&E4?=YUPEOuTdgczELRVx4zdr*lgsNN(DcE#|aNeH-A=I zoY(F8y}f2`E@u&;PL>MAqFyZMg(a;}SdIT7WQ5o6?m^t8JXtml8tL-c;auN}su#Kf z+ePS{lEAgyV`Ui>@T{PVY3^2AnRW{bw}clDmNHSzpzR4I*g6vd;jvJe8&B|rTe-t$ zk$jm8B0>%jEE?_nLrySCEE)i-R|n{E5rn1)fem)6faC!Xbh$0;6I!!P(FaqGx43{k zxYhI=hnm6$)>!QYxRP3Z-2=d$Q2<3UQ;Ub2&5+J%g%xc(bhT2URM3j$)xy$hsi@uC zZAR}#a-7rPga(*2(#efYpO}mqrTl!pysX`>(Y8(8S*1Kd&wM*JcVeqQyV+#noK{@X z>fQ;4<)T(tUR@}`C;d-Mnd&}Wg+t&uk({c=>uP`f9oN(2_swaT#maM9C*(p8=m~M` z_(jT8KOn~)g2{e5ne6K;<6bAGNjdL-M<`pOT}jnU%DiqgE= z*A!hJfL!hCHRI(s1w9i66CGzwGZ_hh-TI^EU42;{eGQ?F0M?NpE(${+bWY7Mumzs- zS|gD)2eQUMHrD|l1b~!_3+2Uv0>ySsC$wlIY}dRFv0V$$HHm)r(Jxv3arBVRFmWmte8Vp%8&eB;Gs zLrcnvMuax-info4(B|jMxGFu2C&!P)%N1DJh)wM3SJ)(bIYysNv+J{8p}Y-h&sQpM zla6N+Ra?=}9uB5oYh-=71S~Ini3Gg)f&{d=r!Oxrtmwu6a~86yyw{JkfuH}&>|ysRf*xhz-h2fH(IsirMI@Pr4x0W`;A*G6*mlyenWGp#mKhTk1l0K-ir?4+_Vy|>kjSe4P|Ye_Z) z_fg#j993o?sReqmTHNrvIPHReBs>>fs8r4u)YGpimVpjD4A19!vYb-Ac22YCk)v1` zPK_t0Fi9FX?0UmUI0u@nn=m>UffhSlJfYMFivbzL73g&AoVjT)ddfsPJ3VJ-J=U$W zH+$@@9{bTbd)8w=-Wg#(>9Mza>>c(~_On^`ZhZhaJHLp2MpfOY4i6(Jm1E>2ig`li z4t{%3-HettdEa~;kmM`t?MC{4`X4=HMY14_4en#|KhQnuxyl*Kz$R% ztfQJb3PewNb%D}Y3+@uJ-|qKWW1WX>&N)1u!uoUe3*^w`w)>aSIEUCT z*{{>^d7piN# diff --git a/tests/scene_responses/api_search_bored_to_death_group:ingot_Extras_720p_S01.response b/tests/scene_responses/api_search_bored_to_death_group:ingot_Extras_720p_S01.response new file mode 100644 index 0000000..01bd19a --- /dev/null +++ b/tests/scene_responses/api_search_bored_to_death_group:ingot_Extras_720p_S01.response @@ -0,0 +1 @@ +{"results":[{"release":"Bored.to.Death.S01.EXTRAS.720p.BluRay.x264-iNGOT","date":"2011-10-07 00:00:00","hasNFO":"yes","hasSRS":"yes"}],"resultsCount":"1","warnings":[],"query":["%bored%","%to%","%death%","ingot","%Extras%","%720p%","%S01%"]} \ No newline at end of file diff --git a/tests/scene_responses/api_search_fawlty_towers_group:shortbrehd_1080p_S01.pickle b/tests/scene_responses/api_search_fawlty_towers_group:shortbrehd_1080p_S01.pickle deleted file mode 100644 index fef3d081858a6ed36059d3a5d5ec2191226ee830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4290 zcmcgv|7#n`6<1>UOO@Dh?jZEI2DU1J_|R%s-yB(%4Y8!0W5=?wltL*!G1?t_wqEUS zW@atxa%u12dS{g>lyHTof7FtT7l>XTN;{KJs*Id!2yf@$8 zd!P3{^I`I{zb+=ipSVHs6CX3qvOU+tHVeeuK4zZlFdY0MSo$b<7Tgtc9m91vc6hL{ zJC#U0O;gN#o3nJ~`?76g#BjQjet`NmA7tBZA5)fX>A8lU%jWd5?qxS@e;*C9r}^cg z+S=URZ*S~3HtXq3+C*GV&Fi@pHJ4NKx{@nY^n4{(1R+7J`Cu2s1I(gsYrhqDpJiUM zb^cOY=Zck*{;FFSF1PhPxcIAXUA)}Z#n)i)(&e_!Rf?}{@a4;GU8?BIFEjW-W)$r; z*LOHXpPbT1)Uli+i2zUl1knLB({~O-2;2dUJ3NGeY%=0f-ldqBay$e?r~wGMlRkJB zh--`^?lVA{iG%HbiCKb?2^b2*n`3w~PJM&>fIJwj0pK12L>*>v>jc*=gOAWEW;%?! z6vL{9Yuni17JwOgyA+nh=16xRaGjLs3q-OWer~sYoKf@@Wy^PzydFalg0if?Lf@e!hUVk|BmCT;r%iSv_j>K((@TtDLz5A72Zf5 z)uZUBhoG?+H|9qA@^Eh>!@!J<_EC{-yM5KA){*6a^nN6bcUA9)(%o2k~ieV1Z z-D3+Zm})_%7I%C`soCu?SRYKkW_B&UvV2IE4XgabGbt)L%*ijaW2=0~4o$qO#D-dn z?XQCUArVUZLx7I#zpCt@Q}zB4Ub~mq^;N|~oUCc9$|mRDu4516nUW`n4&d|M@N+}n z!sBYgfw+QTl^Tn2B3JQfP%O$@LT;bviR97ymM7I0M(Q?pjyQpVk@BN>U@BiMNzLmc zO+N6zAlFBF?Xdezj!(Hpc+Xx{41y@wZtZdVfm)VR--6JF09H9g4pbh>RfY|pS{$zO zRx6UV$FkN~mg#{(5E!J8D;1V?X%x#bY~RE!zgu^E$Z{Ci3F?!JOxVb0T`}cT2&#t! zjK(UO*6;VTp|`Sz+tZL|X$&K35G}&77GYRBqOR{%CNS1Q3~PX22y<2z83twRfSZMnm(SnRNilA&0fNaDq|6XIKwLCDG-%K=7#Y}n1V z;buee#zna-J21K!rfA&psLNg88DP!n(6ND->N6(8YO&J=m>gp>J~<1PU@R=O=f;{M z*>T){u=T<4>-YR__|%X$XYlYKpN>Xnv5h>2O>ns^@Z9P_jroTBz?+35@X>Z+JF)eb zbTaX2un#_tJsXgOxUomEhk*ISuAMk^riVFkVbQ5~8|{G92!1|~qKk5KvktonwqWU@t%dVF{>kBwi9C8E9t2D* zbff~HL$XnTUDNOST||z=bX4PsC9dvn2juwGj`neQ8hJD^f1z;86J62d|NI5&6%Z;y2>43Bou`N``vR} diff --git a/tests/scene_responses/api_search_fawlty_towers_group:shortbrehd_1080p_S01.response b/tests/scene_responses/api_search_fawlty_towers_group:shortbrehd_1080p_S01.response new file mode 100644 index 0000000..6c72b4e --- /dev/null +++ b/tests/scene_responses/api_search_fawlty_towers_group:shortbrehd_1080p_S01.response @@ -0,0 +1 @@ +{"results":[{"release":"Fawlty.Towers.S01E01.1080p.BluRay.x264-SHORTBREHD","date":"2019-11-20 13:02:14","hasNFO":"yes","hasSRS":"yes"},{"release":"Fawlty.Towers.S01E02.1080p.BluRay.x264-SHORTBREHD","date":"2019-11-20 13:14:50","hasNFO":"yes","hasSRS":"yes"},{"release":"Fawlty.Towers.S01E03.1080p.BluRay.x264-SHORTBREHD","date":"2019-11-20 13:17:02","hasNFO":"yes","hasSRS":"yes"},{"release":"Fawlty.Towers.S01E04.1080p.BluRay.x264-SHORTBREHD","date":"2019-11-20 13:14:14","hasNFO":"yes","hasSRS":"yes"},{"release":"Fawlty.Towers.S01E05.1080p.BluRay.x264-SHORTBREHD","date":"2019-11-20 13:11:40","hasNFO":"yes","hasSRS":"yes"},{"release":"Fawlty.Towers.S01E06.1080p.BluRay.x264-SHORTBREHD","date":"2019-11-20 13:15:06","hasNFO":"yes","hasSRS":"yes"}],"resultsCount":"6","warnings":[],"query":["%fawlty%","%towers%","shortbrehd","%1080p%","%S01%"]} \ No newline at end of file diff --git a/tests/scene_responses/api_search_side_effects_group:sparks_720p_2013.pickle b/tests/scene_responses/api_search_side_effects_group:sparks_720p_2013.pickle deleted file mode 100644 index 23226bda68b379166006bcdd21b0aeae53e9056c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3639 zcmcgu?QbJT8Bco7OWjK@*ON|E<)p>vq)V0cuI(h}I8H>)&b=fTCyISY2&HDcJIO3r z@9yo)Ch?VnR)RK0i-cg?4}e6ag31RZK;k1peB^)NL;n?iv%9tv-HCFd!XLad^E@;2 z%eyFu12xKmn^YJpK`|a=0a|6I!qOT}hfuj`lqOKH56@9s~R8}7Bw4x8AaFSF1g!&jX z)4|ORj~I+<#r$HvR95cPX~!bYyi}f|XPy#4fh0}azW9{m8D`u z*9TY381g(-I^K8fD4eOq^V(qkO~+N^_bn(G#mWmxH{e3`=?Sr|_(jrG&nHJ+g27%o zm>%d$s&2&6-BddMjyxgDslayk*aCvtCMLCX z5^&!)J8h2h0sUIwtgywEL*g8-+zlL;2Zps6aI$=IvRu&JPI*;Hfm%!PSAoBp;J-A& ze^uEbXX?fgT|)rrtBOYiThmsRheCL}j@^?sWlo6S!{^)a=bC(lC)7;`afLXQ8gpqz zsdTUy&dFCI$wqo%=IEK_N%h%*x=o!U!LTq;ew;2`DU|O@&8q`V(enVv)q!3so_wG= zNU5+?TGk~fmSfm~Nt;2Z?skdgaNvYm;Sv)U1-uhp348=qodGmn(X`Xk(|qi$yy12= z;#nG}#5b5GQ&>yWS3C0Ez^fz~tjYA%Wa=WqnI%K97ac_GwWMaTiF@B09~-NFqrO{f zeP?e|dDz-{tn59x_xMpw$*G$5XtQ-+)9S5yA}Qu|P1|hb*0WWK&U#g5J|@BvHeE02 z1!c!Qp{BA&{Vs9fCA(ME5@EKg#md!=Yxd;+!um^ev6`)V>n%nV(=~!Fj!;nQlx}=% zl_<=ohikd70+8G~LxHJkWIbQiJZX`SKVq6F0(|}Dg+fURi9&=j^no8bnr8G^@wM;a3w&|6Q(? zmWp4VYqwsKYZiCaa(QV*E&QJoj@80%4PtBP;8#sFws`=^M-?l3;W^=?4<;aea{Yzq zM}{T^8trdx*hq&<*Y{Hnk`(SO;tzW0op7q{xwd7X0?kVEQ66NW|2|a08+Cd}z(kT= zdx_eJvp7_6gP;bUhg1HcQCwMGiu&l|7#8%EHsS4|MkBn+P-oEg<>5uB%_OC;ZN}9L z3vZ_j=}GOtLI1T5Ez+^&4L4JaKR~n=0xn%D7X8k=Z)8US;|#M;~_F064na7Q!M3m`Sfd&NubM)!t;f`8_vjnx}cc!(3VUKyC#!e7$i*^cD$T}M};9&%%bWAvn@|_U#gNTQ-ZK;6lkjxWl*9ba6 zhp?k?BI)PM3SZmZj@a@4X4^eH5Zmn!#Rh?Q&@k>euf-+ee1!E@i>Rr&)F~1@cEd1g5;?G=j33& wX1{q^=(FFlPcH;F`;7e#)9i(aW}mY^ycoNGycC1%PYw2G_80coIJWZt1}S(})Bpeg diff --git a/tests/scene_responses/api_search_side_effects_group:sparks_720p_2013.response b/tests/scene_responses/api_search_side_effects_group:sparks_720p_2013.response new file mode 100644 index 0000000..28d2de3 --- /dev/null +++ b/tests/scene_responses/api_search_side_effects_group:sparks_720p_2013.response @@ -0,0 +1 @@ +{"results":[{"release":"Side.Effects.2013.720p.BluRay.x264-SPARKS","date":"2013-05-08 03:56:18","hasNFO":"yes","hasSRS":"yes"}],"resultsCount":"1","warnings":[],"query":["%side%","%effects%","sparks","%720p%","%2013%"]} \ No newline at end of file diff --git a/tests/scene_responses/api_search_the_omega_man_group:voa.pickle b/tests/scene_responses/api_search_the_omega_man_group:voa.pickle deleted file mode 100644 index 269732da5f9345336415b03fdaed7b9968973333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3574 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 E0T!29LjV8( diff --git a/tests/scene_responses/api_search_walk_the_line_group:hd1080_1080p_2005.response b/tests/scene_responses/api_search_walk_the_line_group:hd1080_1080p_2005.response new file mode 100644 index 0000000..3705970 --- /dev/null +++ b/tests/scene_responses/api_search_walk_the_line_group:hd1080_1080p_2005.response @@ -0,0 +1 @@ +{"results":[{"release":"Walk.the.Line.Extended.Cut.2005.1080p.BluRay.x264-HD1080","date":"2012-05-28 00:00:00","hasNFO":"yes","hasSRS":"yes"}],"resultsCount":"1","warnings":[],"query":["%walk%","%the%","%line%","hd1080","%1080p%","%2005%"]} \ No newline at end of file diff --git a/tests/test_scene.py b/tests/test_scene.py index a488079..95bf732 100644 --- a/tests/test_scene.py +++ b/tests/test_scene.py @@ -4,7 +4,6 @@ import json import os -import pickle import contextlib # Silence guessit @@ -478,16 +477,16 @@ def test_yield_file_info_for_episode_release_of_original_season_release_with_eno capture_dir = os.path.join(os.path.dirname(__file__), 'scene_responses') def capture_request(path): - filepath = os.path.join(capture_dir, path.replace('/', '_') + '.pickle') + filepath = os.path.join(capture_dir, path.replace('/', '_') + '.response') if not capture_requests and os.path.exists(filepath): - with open(filepath, 'rb') as f: - return pickle.loads(f.read()) + with open(filepath, 'r') as f: + return mock_response(f.read()) else: response = real_scene_get(path) if not os.path.exists(capture_dir): os.mkdir(capture_dir) - with open(filepath, 'wb') as f: - f.write(pickle.dumps(response)) + with open(filepath, 'w') as f: + f.write(response.text) return response @contextlib.contextmanager From 6f6c0de0a522b7e28c10cbdd9941fe6bfaebe6f9 Mon Sep 17 00:00:00 2001 From: plotski Date: Sun, 14 Jun 2020 18:48:12 +0200 Subject: [PATCH 09/10] Properly compare value to True --- tests/test_scene.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_scene.py b/tests/test_scene.py index 95bf732..dad144b 100644 --- a/tests/test_scene.py +++ b/tests/test_scene.py @@ -633,6 +633,6 @@ def test_renaming_is_ok_if_file_name_is_release_name(mock_prompt_yesno, mock_exi acceptable_release_name = 'Walk.the.Line.Extended.Cut.2005.1080p.BluRay.x264-HD1080.mkv' content = (acceptable_release_name, 11743374939) with mock_files(content, path_prefix='path/to'): - assert bb.VideoSubmission(path='path/to/' + acceptable_release_name)['scene'] == True + assert bb.VideoSubmission(path='path/to/' + acceptable_release_name)['scene'] is True assert mock_prompt_yesno.call_args_list == [] assert mock_exit.call_args_list == [] From 6d0542a1329703791beb23b31d1ef672d54e78a2 Mon Sep 17 00:00:00 2001 From: plotski Date: Sun, 21 Jun 2020 15:06:16 +0200 Subject: [PATCH 10/10] Fix scene._check_file() docstring --- pythonbits/scene.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pythonbits/scene.py b/pythonbits/scene.py index 36c63f4..6f6618c 100644 --- a/pythonbits/scene.py +++ b/pythonbits/scene.py @@ -117,12 +117,11 @@ def _check_dir(path): def _check_file(relpath, fspath, info): """ - Return True if `path` is unmodified or None if not sure + Return True if file was not renamed and has the correct size relpath: Relative path that starts with the release name fspath: Path that exists in the file system - - It is important that `path` is relative and starts with the release/torrent name. + info: Dictionary from _yield_file_info() Raise SceneError if `path` does not match `info` """