diff --git a/CHANGELOG.md b/CHANGELOG.md index 747c2eb..d58abc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +* [v0.0.14](https://github.com/newt-sc/a4kSubtitles/releases/tag/service.subtitles.a4ksubtitles%2Fservice.subtitles.a4ksubtitles-0.0.14): + * Fix API and normal usage at the same time + * [v0.0.13](https://github.com/newt-sc/a4kSubtitles/releases/tag/service.subtitles.a4ksubtitles%2Fservice.subtitles.a4ksubtitles-0.0.13): * Exclude development files from release diff --git a/a4kSubtitles/api.py b/a4kSubtitles/api.py index 7b7d3c9..2eb252b 100644 --- a/a4kSubtitles/api.py +++ b/a4kSubtitles/api.py @@ -4,6 +4,8 @@ import json import importlib +api_mode_env_name = 'A4KSUBTITLES_API_MODE' + class A4kSubtitlesApi(object): def __init__(self, mocks=None): if mocks is None: @@ -19,13 +21,9 @@ def __init__(self, mocks=None): } api_mode.update(mocks) - os.environ['A4KSUBTITLES_API_MODE'] = json.dumps(api_mode) - + os.environ[api_mode_env_name] = json.dumps(api_mode) self.core = importlib.import_module('a4kSubtitles.core') - def __del__(self): - os.environ.pop('A4KSUBTITLES_API_MODE') - def __mock_video_meta(self, meta): def get_info_label(label): if label == 'VideoPlayer.Year': diff --git a/a4kSubtitles/core.py b/a4kSubtitles/core.py index 5bfc5d6..29b59fb 100644 --- a/a4kSubtitles/core.py +++ b/a4kSubtitles/core.py @@ -22,13 +22,13 @@ from .download import download core = sys.modules[__name__] -api_mode_enabled = os.getenv('A4KSUBTITLES_API_MODE') is not None - +api_mode_enabled = True handle = None -if not api_mode_enabled: - handle = int(sys.argv[1]) -def main(paramstring): +def main(handle, paramstring): + core.api_mode_enabled = False + core.handle = handle + params = dict(utils.parse_qsl(paramstring)) if params['action'] in ('search', 'manualsearch'): search(core, params) diff --git a/a4kSubtitles/lib/kodi.py b/a4kSubtitles/lib/kodi.py index 15636ea..e9e6409 100644 --- a/a4kSubtitles/lib/kodi.py +++ b/a4kSubtitles/lib/kodi.py @@ -18,10 +18,10 @@ else: from . import kodi_mock - for target in api_mode.keys(): + for target in ['xbmc', 'xbmcaddon', 'xbmcplugin', 'xbmcgui', 'xbmcvfs']: if target == 'kodi': continue - elif api_mode[target]: + elif api_mode.get(target, False): mod = getattr(kodi_mock, target) else: mod = importlib.import_module(target) diff --git a/a4kSubtitles/lib/kodi_mock.py b/a4kSubtitles/lib/kodi_mock.py index 5dc76b6..da92563 100644 --- a/a4kSubtitles/lib/kodi_mock.py +++ b/a4kSubtitles/lib/kodi_mock.py @@ -75,5 +75,7 @@ def __copy(src_uri, dest): archive_path = unquote(src_uri[:src_uri.find('.zip') + 4]).replace(__archive_proto, '') member = unquote(src_uri[src_uri.find('.zip') + 5:]).replace(__archive_proto, '') with ZipFile(archive_path, 'r') as zip_obj: - zip_obj.extract(member, os.path.dirname(dest)) + dest_dir = os.path.dirname(dest) + zip_obj.extract(member, dest_dir) + os.rename(os.path.join(dest_dir, member), dest) xbmcvfs.copy = __copy diff --git a/addon.xml b/addon.xml index d183687..40204ca 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@ @@ -24,6 +24,9 @@ Supports: OpenSubtitles icon.png +[v0.0.14]: + * Fix API and normal usage at the same time + [v0.0.13]: * Exclude development files from release diff --git a/main.py b/main.py index 6e36339..46acb22 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,11 @@ # -*- coding: utf-8 -*- import sys -from a4kSubtitles import core +import os +import importlib +from a4kSubtitles import api if __name__ == '__main__': - core.main(sys.argv[2][1:]) + os.environ.pop(api.api_mode_env_name, '') + core = importlib.import_module('a4kSubtitles.core') + core.main(int(sys.argv[1]), sys.argv[2][1:]) diff --git a/packages/addons.xml b/packages/addons.xml index 47ce7b6..af09d72 100644 --- a/packages/addons.xml +++ b/packages/addons.xml @@ -4,7 +4,7 @@ @@ -27,6 +27,9 @@ Supports: OpenSubtitles icon.png +[v0.0.14]: + * Fix API and normal usage at the same time + [v0.0.13]: * Exclude development files from release diff --git a/packages/addons.xml.crc b/packages/addons.xml.crc index ea06fe6..304ae36 100644 --- a/packages/addons.xml.crc +++ b/packages/addons.xml.crc @@ -1 +1 @@ -5dcf3bacbb37f4f778c448436388f4d4cb2ded44 \ No newline at end of file +0e400f04fed7e1ce5a14695acd56ea293f04af07 \ No newline at end of file diff --git a/tests/test_suite.py b/tests/test_suite.py index a749271..d106a85 100644 --- a/tests/test_suite.py +++ b/tests/test_suite.py @@ -3,6 +3,8 @@ import sys import os import json +import re +import pytest dir_name = os.path.dirname(__file__) main = os.path.join(dir_name, '..') @@ -28,6 +30,7 @@ def __search(a4ksubtitles_api, creds=None): search.settings = { 'general.timeout': '15', 'general.results_limit': '20', + 'general.remove_ads': 'false', 'opensubtitles.enabled': 'true', 'opensubtitles.username': creds.username, 'opensubtitles.password': creds.password, @@ -43,6 +46,33 @@ def __search(a4ksubtitles_api, creds=None): return search +def test_api(): + def get_error_msg(e): + return str(e.value).replace('\'', '') + + with pytest.raises(ImportError) as e: + api.A4kSubtitlesApi() + assert get_error_msg(e) == "No module named xbmc" + + with pytest.raises(ImportError) as e: + api.A4kSubtitlesApi({'xbmc': True}) + assert get_error_msg(e) == "No module named xbmcaddon" + + with pytest.raises(ImportError) as e: + api.A4kSubtitlesApi({'xbmc': True, 'xbmcaddon': True}) + assert get_error_msg(e) == "No module named xbmcplugin" + + with pytest.raises(ImportError) as e: + api.A4kSubtitlesApi({'xbmc': True, 'xbmcaddon': True, 'xbmcplugin': True}) + assert get_error_msg(e) == "No module named xbmcgui" + + with pytest.raises(ImportError) as e: + api.A4kSubtitlesApi({'xbmc': True, 'xbmcaddon': True, 'xbmcplugin': True, 'xbmcgui': True}) + assert get_error_msg(e) == "No module named xbmcvfs" + + api.A4kSubtitlesApi({'xbmc': True, 'xbmcaddon': True, 'xbmcplugin': True, 'xbmcgui': True, 'xbmcvfs': True}) + api.A4kSubtitlesApi({'kodi': True}) + def test_search_missing_imdb_id(): a4ksubtitles_api = api.A4kSubtitlesApi({'kodi': True}) log_error_spy = utils.spy_fn(a4ksubtitles_api.core.logger, 'error') @@ -58,6 +88,7 @@ def test_search_missing_imdb_id(): def test_opensubtitles(): a4ksubtitles_api = api.A4kSubtitlesApi({'kodi': True}) + # search creds = lambda: None creds.username = os.getenv('A4KSUBTITLES_OPENSUBTITLES_USERNAME', '') creds.password = os.getenv('A4KSUBTITLES_OPENSUBTITLES_PASSWORD', '') @@ -66,6 +97,7 @@ def test_opensubtitles(): assert len(search.results) == 20 assert search.results[0]['name'] == search.video_meta['filename'] + # download item = search.results[0] item['action_args']['filename'] = item['name'] @@ -75,6 +107,22 @@ def test_opensubtitles(): 'action_args': item['action_args'] } - result = a4ksubtitles_api.download(params, search.settings) + filepath = a4ksubtitles_api.download(params, search.settings) + + assert filepath != '' + + # remove_ads + with open(filepath, 'r') as f: + sub_contents = f.read() + + assert re.match(r'.*OpenSubtitles.*', sub_contents, re.DOTALL) is not None + + search.settings['general.remove_ads'] = 'true' + filepath = a4ksubtitles_api.download(params, search.settings) + + assert filepath != '' + + with open(filepath, 'r') as f: + sub_contents = f.read() - assert result != '' + assert re.match(r'.*OpenSubtitles.*', sub_contents, re.DOTALL) is None