From 3fbbde1dc1542641e2241e7c020c65ed67b83e96 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)