diff --git a/CHANGELOG.md b/CHANGELOG.md index 0027f08..07c88cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +* [v1.6.0](https://github.com/newt-sc/a4kSubtitles/releases/tag/service.subtitles.a4ksubtitles%2Fservice.subtitles.a4ksubtitles-1.6.0): + * Add option to auto download first subtitle result silently + * [v1.5.0](https://github.com/newt-sc/a4kSubtitles/releases/tag/service.subtitles.a4ksubtitles%2Fservice.subtitles.a4ksubtitles-1.5.0): * Auto open search dialog only on movie and tvshow videos diff --git a/a4kSubtitles/lib/kodi_mock.py b/a4kSubtitles/lib/kodi_mock.py index 9e19c1f..b91a453 100644 --- a/a4kSubtitles/lib/kodi_mock.py +++ b/a4kSubtitles/lib/kodi_mock.py @@ -16,7 +16,7 @@ xbmc = lambda: None xbmc.translatePath = lambda p: p xbmc.getInfoLabel = lambda t: '' -xbmc.executeJSONRPC = lambda _: '{ "result": { "value": true } }' +xbmc.executeJSONRPC = lambda _: '{ "result": { "value": [] } }' xbmc.executebuiltin = lambda _: None xbmc.getCleanMovieTitle = lambda t: t xbmc.getCondVisibility = lambda _: False @@ -27,6 +27,7 @@ __player = lambda: None __player.getPlayingFile = lambda: '' +__player.setSubtitles = lambda s: None xbmc.Player = lambda: __player __monitor = lambda: None diff --git a/a4kSubtitles/service.py b/a4kSubtitles/service.py index cbf0e8d..8e2ad23 100644 --- a/a4kSubtitles/service.py +++ b/a4kSubtitles/service.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- -def start(core): +def start(api): + core = api.core monitor = core.kodi.xbmc.Monitor() has_done_subs_check = False @@ -26,6 +27,25 @@ def start(core): has_subtitles_enabled = core.kodi.xbmc.getCondVisibility('VideoPlayer.SubtitlesEnabled') has_subtitles = core.kodi.xbmc.getCondVisibility('VideoPlayer.HasSubtitles') and has_subtitles_enabled - if not has_subtitles: + if has_subtitles: + continue + + if not core.kodi.get_bool_setting('general', 'auto_download'): core.kodi.xbmc.executebuiltin('ActivateWindow(SubtitleSearch)') continue + + languages = core.kodi.get_kodi_setting('subtitles.languages') + preferredlang = core.kodi.get_kodi_setting('locale.subtitlelanguage') + params = { + 'action': 'search', + 'languages': ','.join(languages), + 'preferredlanguage': preferredlang + } + + results = api.search(params) + for result in results: + try: + subfile = api.download(result) + core.kodi.xbmc.Player().setSubtitles(subfile) + break + except: pass diff --git a/addon.xml b/addon.xml index f552cc4..54f2b61 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@ @@ -28,6 +28,9 @@ Supports: OpenSubtitles, BSPlayer, Podnadpisi.NET, SubDB, Subscene, Addic7ed screenshot-03.png +[v1.6.0]: + * Add option to auto download first subtitle result silently + [v1.5.0]: * Auto open search dialog only on movie and tvshow videos diff --git a/main_service.py b/main_service.py index 9ecedb9..7e4127c 100644 --- a/main_service.py +++ b/main_service.py @@ -5,6 +5,4 @@ from a4kSubtitles import api, service if __name__ == '__main__': - os.environ.pop(api.api_mode_env_name, '') - core = importlib.import_module('a4kSubtitles.core') - service.start(core) + service.start(api.A4kSubtitlesApi()) diff --git a/packages/addons.xml b/packages/addons.xml index b82e89a..3bf51a9 100644 --- a/packages/addons.xml +++ b/packages/addons.xml @@ -4,7 +4,7 @@ @@ -31,6 +31,9 @@ Supports: OpenSubtitles, BSPlayer, Podnadpisi.NET, SubDB, Subscene, Addic7ed screenshot-03.png +[v1.6.0]: + * Add option to auto download first subtitle result silently + [v1.5.0]: * Auto open search dialog only on movie and tvshow videos diff --git a/packages/addons.xml.crc b/packages/addons.xml.crc index 423ee9a..9572621 100644 --- a/packages/addons.xml.crc +++ b/packages/addons.xml.crc @@ -1 +1 @@ -da66c1a421c613825773c5f2066a4366d0d7cb2a \ No newline at end of file +46edf7974229f26ca41fe6ce2e6fdd7378a6fbb0 \ No newline at end of file diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po index 89b138a..1037315 100644 --- a/resources/language/resource.language.en_gb/strings.po +++ b/resources/language/resource.language.en_gb/strings.po @@ -21,15 +21,19 @@ msgstr "" # General msgctxt "#33101" -msgid "Request Timeout" +msgid "Request timeout" msgstr "" msgctxt "#33102" -msgid "Results Limit" +msgid "Results limit" msgstr "" msgctxt "#33103" -msgid "Auto Search (Will not trigger if subs are available)" +msgid "Auto search" +msgstr "" + +msgctxt "#33104" +msgid "Auto download first subtitle silently" msgstr "" # Services diff --git a/resources/settings.xml b/resources/settings.xml index ff5cad2..5b45979 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -5,6 +5,7 @@ + diff --git a/tests/test_service.py b/tests/test_service.py index c92ef50..7534593 100644 --- a/tests/test_service.py +++ b/tests/test_service.py @@ -26,6 +26,20 @@ def restore(): api.core.kodi.xbmc.getCondVisibility = default return restore +def __mock_api_search(api): + default = api.search + api.search = lambda p: [{}] + def restore(): + api.search = default + return restore + +def __mock_api_download(api, result=None): + default = api.download + api.download = lambda p: result + def restore(): + api.download = default + return restore + def __mock(api, settings): restore_monitor = __mock_monitor(api) restore_settings = api.mock_settings(settings) @@ -43,7 +57,7 @@ def test_service_start_when_disabled(): }) get_cond_visibility_spy = utils.spy_fn(a4ksubtitles_api.core.kodi.xbmc, 'getCondVisibility') - service.start(a4ksubtitles_api.core) + service.start(a4ksubtitles_api) restore() get_cond_visibility_spy.restore() @@ -58,7 +72,7 @@ def test_service_start_when_enabled(): }) get_cond_visibility_spy = utils.spy_fn(a4ksubtitles_api.core.kodi.xbmc, 'getCondVisibility') - service.start(a4ksubtitles_api.core) + service.start(a4ksubtitles_api) restore() get_cond_visibility_spy.restore() @@ -80,7 +94,7 @@ def test_service_when_video_has_subtitles(): executebuiltin_spy = utils.spy_fn(a4ksubtitles_api.core.kodi.xbmc, 'executebuiltin') - service.start(a4ksubtitles_api.core) + service.start(a4ksubtitles_api) restore() restore_get_cond_visibility() @@ -103,7 +117,7 @@ def test_service_when_video_does_not_have_subtitles(): executebuiltin_spy = utils.spy_fn(a4ksubtitles_api.core.kodi.xbmc, 'executebuiltin') - service.start(a4ksubtitles_api.core) + service.start(a4ksubtitles_api) restore() restore_get_cond_visibility() @@ -126,7 +140,7 @@ def test_service_when_video_has_disabled_subtitles(): executebuiltin_spy = utils.spy_fn(a4ksubtitles_api.core.kodi.xbmc, 'executebuiltin') - service.start(a4ksubtitles_api.core) + service.start(a4ksubtitles_api) restore() restore_get_cond_visibility() @@ -149,7 +163,7 @@ def test_service_when_subs_check_done(): executebuiltin_spy = utils.spy_fn(a4ksubtitles_api.core.kodi.xbmc, 'executebuiltin') - service.start(a4ksubtitles_api.core) + service.start(a4ksubtitles_api) restore() restore_get_cond_visibility() @@ -172,10 +186,42 @@ def test_service_when_does_not_have_video_duration(): executebuiltin_spy = utils.spy_fn(a4ksubtitles_api.core.kodi.xbmc, 'executebuiltin') - service.start(a4ksubtitles_api.core) + service.start(a4ksubtitles_api) + + restore() + restore_get_cond_visibility() + executebuiltin_spy.restore() + + assert executebuiltin_spy.call_count == 0 + +def test_service_auto_download(): + a4ksubtitles_api = api.A4kSubtitlesApi({'kodi': True}) + + restore = __mock(a4ksubtitles_api, { + 'general.auto_search': 'true', + 'general.auto_download': 'true', + }) + restore_get_cond_visibility = __mock_get_cond_visibility(a4ksubtitles_api, { + 'VideoPlayer.Content(movies)': True, + 'Player.HasDuration': True, + 'VideoPlayer.HasSubtitles': False, + 'VideoPlayer.SubtitlesEnabled': False, + }) + restore_api_search = __mock_api_search(a4ksubtitles_api) + expected_download_result = 'test_download_result' + restore_api_download = __mock_api_download(a4ksubtitles_api, expected_download_result) + + executebuiltin_spy = utils.spy_fn(a4ksubtitles_api.core.kodi.xbmc, 'executebuiltin') + setsubtitles_spy = utils.spy_fn(a4ksubtitles_api.core.kodi.xbmc.Player(), 'setSubtitles') + + service.start(a4ksubtitles_api) restore() restore_get_cond_visibility() + restore_api_search() + restore_api_download() executebuiltin_spy.restore() assert executebuiltin_spy.call_count == 0 + assert setsubtitles_spy.call_count == 1 + setsubtitles_spy.called_with(expected_download_result)