From bb1be1b843dbcd438b29b3a6c55c653b27db8a3c Mon Sep 17 00:00:00 2001 From: newt-sc <47229722+newt-sc@users.noreply.github.com> Date: Wed, 27 May 2020 23:51:33 +0300 Subject: [PATCH] release: v1.3.0 --- CHANGELOG.md | 3 ++ a4kSubtitles/lib/video.py | 5 +++ addon.xml | 5 ++- packages/addons.xml | 5 ++- packages/addons.xml.crc | 2 +- tests/test_suite.py | 91 +++++++++++++++++++++++++++++++++++++++ tests/utils.py | 8 +++- 7 files changed, 114 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47b3aad..fb394b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +* [v1.3.0](https://github.com/newt-sc/a4kSubtitles/releases/tag/service.subtitles.a4ksubtitles%2Fservice.subtitles.a4ksubtitles-1.3.0): + * Improve tvshow year scraping + * [v1.2.0](https://github.com/newt-sc/a4kSubtitles/releases/tag/service.subtitles.a4ksubtitles%2Fservice.subtitles.a4ksubtitles-1.2.0): * Use internal ZipFile for extraction with a fallback to vfs.libarchive diff --git a/a4kSubtitles/lib/video.py b/a4kSubtitles/lib/video.py index 3fa476e..e0f7ed2 100644 --- a/a4kSubtitles/lib/video.py +++ b/a4kSubtitles/lib/video.py @@ -96,6 +96,11 @@ def __scrape_tvshow_year(core, meta): return show_year_match = re.search(r' %s \((.*?)\)"' % meta.tvshow, imdb_response.text) + if not show_year_match: + show_year_match = re.search(r'.*?\(TV (?:Mini-)?Series (\d\d\d\d).*?', imdb_response.text) + if not show_year_match: + show_year_match = re.search(r'\((\d\d\d\d).*?\)', imdb_response.text) + if show_year_match: meta.tvshow_year = show_year_match.group(1).strip() diff --git a/addon.xml b/addon.xml index f825b9a..b94c967 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@ @@ -27,6 +27,9 @@ Supports: OpenSubtitles, BSPlayer, Podnadpisi.NET, SubDB, Subscene, Addic7ed screenshot-03.png +[v1.3.0]: + * Improve tvshow year scraping + [v1.2.0]: * Use internal ZipFile for extraction with a fallback to vfs.libarchive diff --git a/packages/addons.xml b/packages/addons.xml index b49fd1f..f725fb7 100644 --- a/packages/addons.xml +++ b/packages/addons.xml @@ -4,7 +4,7 @@ @@ -30,6 +30,9 @@ Supports: OpenSubtitles, BSPlayer, Podnadpisi.NET, SubDB, Subscene, Addic7ed screenshot-03.png +[v1.3.0]: + * Improve tvshow year scraping + [v1.2.0]: * Use internal ZipFile for extraction with a fallback to vfs.libarchive diff --git a/packages/addons.xml.crc b/packages/addons.xml.crc index ec180ac..9afbcb1 100644 --- a/packages/addons.xml.crc +++ b/packages/addons.xml.crc @@ -1 +1 @@ -d114c77b06cd3bc4c8e557687867387d148363d4 \ No newline at end of file +61ee54c24b8a4b1ee015abe153168a80843b7fc8 \ No newline at end of file diff --git a/tests/test_suite.py b/tests/test_suite.py index a0af36f..b28ed99 100644 --- a/tests/test_suite.py +++ b/tests/test_suite.py @@ -44,6 +44,7 @@ "filehash": "d603a5b0e73d4b6b", "subdb_hash": "2aec1b70afe702e67ab39a0af776ba5a", } +__tvshow_expected_year = '2016' __tvshow_unicode_video_meta = { "year": "2019", @@ -58,6 +59,28 @@ "subdb_hash": "b35c5f8e4afffd8ee09442e98f943410", } +__tvshow_with_show_imdb_id_video_meta = __tvshow_video_meta.copy() +__tvshow_with_show_imdb_id_video_meta['imdb_id'] = 'tt0475784' +__tvshow_with_show_imdb_id_expected_year = '2016' + +__tvshow_alt_title_video_meta = { + "year": "2016", + "title": "Episode 1", + "tvshow": "Midnight Diner: Tokyo Stories", + "imdb_id": "tt6190484", + "season": "1", + "episode": "1", + "filename": "Midnight.Diner.Tokyo.Stories.S01E01.1080p.NF.WEB-DL.DDP2.0.x264-Monkee.mkv", + "filesize": "808387637", + "filehash": "b3b923134834beee", + "subdb_hash": "8e2970e553d0b7b662b29b24ecbf1a10", +} +__tvshow_alt_title_expected_year = '2016' + +__tvshow_with_show_imdb_id_alt_title_video_meta = __tvshow_alt_title_video_meta.copy() +__tvshow_with_show_imdb_id_alt_title_video_meta['imdb_id'] = 'tt6150576' +__tvshow_with_show_imdb_id_alt_title_expected_year = '2016' + def __remove_meta_cache(a4ksubtitles_api): try: os.remove(a4ksubtitles_api.core.cache.__meta_cache_filepath) @@ -122,11 +145,26 @@ def __search_tvshow(a4ksubtitles_api, settings={}, video_meta={}): tvshow_video_meta.update(video_meta) return __search(a4ksubtitles_api, settings, tvshow_video_meta) +def __search_tvshow_alt_title(a4ksubtitles_api, settings={}, video_meta={}): + tvshow_video_meta = __tvshow_alt_title_video_meta.copy() + tvshow_video_meta.update(video_meta) + return __search(a4ksubtitles_api, settings, tvshow_video_meta) + def __search_unicode_tvshow(a4ksubtitles_api, settings={}, video_meta={}): tvshow_video_meta = __tvshow_unicode_video_meta.copy() tvshow_video_meta.update(video_meta) return __search(a4ksubtitles_api, settings, tvshow_video_meta) +def __search_tvshow_with_show_imdb_id(a4ksubtitles_api, settings={}, video_meta={}): + tvshow_video_meta = __tvshow_with_show_imdb_id_video_meta.copy() + tvshow_video_meta.update(video_meta) + return __search(a4ksubtitles_api, settings, tvshow_video_meta) + +def __search_tvshow_with_show_imdb_id_alt_title(a4ksubtitles_api, settings={}, video_meta={}): + tvshow_video_meta = __tvshow_with_show_imdb_id_alt_title_video_meta.copy() + tvshow_video_meta.update(video_meta) + return __search(a4ksubtitles_api, settings, tvshow_video_meta) + def test_api(): def get_error_msg(e): return str(e.value).replace('\'', '') @@ -166,8 +204,61 @@ def test_search_missing_imdb_id(): } a4ksubtitles_api.search(params) + log_error_spy.restore() log_error_spy.called_with('missing imdb id!') +def test_tvshow_year_scraping_with_episode_imdb_id(): + a4ksubtitles_api = api.A4kSubtitlesApi({'kodi': True}) + __remove_all_cache(a4ksubtitles_api) + + get_meta_spy = utils.spy_fn(a4ksubtitles_api.core.video, 'get_meta', return_result=False) + + try: __search_tvshow(a4ksubtitles_api, {'podnadpisi.enabled': 'true'}) + except: pass + + get_meta_spy.restore() + get_meta_spy.result[0].tvshow_year_thread.join() + assert get_meta_spy.result[0].tvshow_year == __tvshow_expected_year + +def test_tvshow_year_scraping_with_episode_imdb_id_alt_title(): + a4ksubtitles_api = api.A4kSubtitlesApi({'kodi': True}) + __remove_all_cache(a4ksubtitles_api) + + get_meta_spy = utils.spy_fn(a4ksubtitles_api.core.video, 'get_meta', return_result=False) + + try: __search_tvshow_alt_title(a4ksubtitles_api, {'podnadpisi.enabled': 'true'}) + except: pass + + get_meta_spy.restore() + get_meta_spy.result[0].tvshow_year_thread.join() + assert get_meta_spy.result[0].tvshow_year == __tvshow_alt_title_expected_year + +def test_tvshow_year_scraping_with_show_imdb_id(): + a4ksubtitles_api = api.A4kSubtitlesApi({'kodi': True}) + __remove_all_cache(a4ksubtitles_api) + + get_meta_spy = utils.spy_fn(a4ksubtitles_api.core.video, 'get_meta', return_result=False) + + try: __search_tvshow_with_show_imdb_id(a4ksubtitles_api, {'podnadpisi.enabled': 'true'}) + except: pass + + get_meta_spy.restore() + get_meta_spy.result[0].tvshow_year_thread.join() + assert get_meta_spy.result[0].tvshow_year == __tvshow_with_show_imdb_id_expected_year + +def test_tvshow_year_scraping_with_show_imdb_id_alt_title(): + a4ksubtitles_api = api.A4kSubtitlesApi({'kodi': True}) + __remove_all_cache(a4ksubtitles_api) + + get_meta_spy = utils.spy_fn(a4ksubtitles_api.core.video, 'get_meta', return_result=False) + + try: __search_tvshow_with_show_imdb_id_alt_title(a4ksubtitles_api, {'podnadpisi.enabled': 'true'}) + except: pass + + get_meta_spy.restore() + get_meta_spy.result[0].tvshow_year_thread.join() + assert get_meta_spy.result[0].tvshow_year == __tvshow_with_show_imdb_id_alt_title_expected_year + def test_opensubtitles(): a4ksubtitles_api = api.A4kSubtitlesApi({'kodi': True}) __remove_all_cache(a4ksubtitles_api) diff --git a/tests/utils.py b/tests/utils.py index a0e4c10..6da0425 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -11,16 +11,20 @@ def called_with(self, *args, **kwargs): assert self.args[0] == args assert self.kwargs[0] == kwargs -def spy_fn(target, fn_name): +def spy_fn(target, fn_name, return_result=True): spy = Spy() fn = getattr(target, fn_name) def fn_wrap(*args, **kwargs): spy.args.append(args) spy.kwargs.append(kwargs) - spy.result.append(fn(*args, **kwargs)) + result = fn(*args, **kwargs) + spy.result.append(result) spy.call_count += 1 + if return_result: + return result + setattr(target, fn_name, fn_wrap) spy.restore = lambda: setattr(target, fn_name, fn)