diff --git a/resources/lib/kodiwrapper.py b/resources/lib/kodiwrapper.py index 54e5a9a1..29ab63d8 100644 --- a/resources/lib/kodiwrapper.py +++ b/resources/lib/kodiwrapper.py @@ -529,9 +529,9 @@ def end_of_directory(self): def log(self, message, log_level=LOG_INFO, **kwargs): """ Log info messages to Kodi """ - if not self._global_debug_logging and self._debug_logging and log_level in [LOG_DEBUG, LOG_INFO]: - # If Debug Logging is not enabled, Kodi filters everything up to NOTICE out - log_level = LOG_NOTICE + if not self._debug_logging and log_level in [LOG_DEBUG]: + # Don't log when debug_logging is false + return if kwargs: import string message = string.Formatter().vformat(message, (), SafeDict(**kwargs)) diff --git a/resources/lib/vtmgo/vtmgoepg.py b/resources/lib/vtmgo/vtmgoepg.py index 5d80dac5..5d915e6e 100644 --- a/resources/lib/vtmgo/vtmgoepg.py +++ b/resources/lib/vtmgo/vtmgoepg.py @@ -152,7 +152,8 @@ def get_details(self, channel, program_type, epg_id): elif program_type == 'oneoffs': url = self.DETAILS_URL.format(channel=channel, type='oneoff', uuid=epg_id) else: - raise Exception('Unknown broadcast type %s.' % program_type) + self._kodi.log('Unknown broadcast type {type}.', LOG_ERROR, type=program_type) + return None # Fetch data response = self._get_url(url) @@ -161,7 +162,8 @@ def get_details(self, channel, program_type, epg_id): matches = re.search(r'EPG_REDUX_DATA=([^;]+);', response) if not matches: self._kodi.log('Got response: {response}', LOG_ERROR, response=response) - raise Exception('Could not parse EPG details.') + self._kodi.log('Could not parse EPG details.', LOG_ERROR) + return None data = json.loads(matches.group(1)) diff --git a/test/test_routing.py b/test/test_routing.py index d85d061a..3d203bc8 100644 --- a/test/test_routing.py +++ b/test/test_routing.py @@ -65,6 +65,9 @@ def test_catalog_recommendations_menu(self): def test_catalog_mylist_menu(self): plugin.run([routing.url_for(plugin.show_mylist), '0', '']) + def test_catalog_continuewatching_menu(self): + plugin.run([routing.url_for(plugin.show_continuewatching), '0', '']) + def test_search_menu(self): plugin.run([routing.url_for(plugin.show_search), '0', '']) plugin.run([routing.url_for(plugin.show_search, query='nieuws'), '0', '']) diff --git a/test/test_vtmgo.py b/test/test_vtmgo.py index b38cef38..0c7bf904 100644 --- a/test/test_vtmgo.py +++ b/test/test_vtmgo.py @@ -11,7 +11,9 @@ from urllib3.exceptions import InsecureRequestWarning from resources.lib.kodiwrapper import KodiWrapper +from resources.lib.modules.player import Player from resources.lib.vtmgo import vtmgo, vtmgostream, vtmgoauth +from resources.lib.vtmgo.vtmgo import Movie, Program from resources.lib.vtmgo.vtmgostream import StreamGeoblockedException kodi = KodiWrapper() @@ -26,6 +28,7 @@ def __init__(self, *args, **kwargs): self._vtmgoauth = vtmgoauth.VtmGoAuth(kodi) self._vtmgo = vtmgo.VtmGo(kodi) self._vtmgostream = vtmgostream.VtmGoStream(kodi) + self._player = Player(kodi) def setUp(self): # Don't warn that we don't close our HTTPS connections, this is on purpose. @@ -43,54 +46,55 @@ def test_get_config(self): self.assertTrue(config) # print(config) - def test_get_recommendations(self): - recommendations = self._vtmgo.get_recommendations() - self.assertTrue(recommendations) - # print(main) - - def test_get_mylist(self): - mylist = self._vtmgo.get_swimlane('my-list') - self.assertIsInstance(mylist, list) - # print(mylist) - - def test_get_categories(self): + def test_catalog(self): categories = self._vtmgo.get_categories() self.assertTrue(categories) # print(categories) - items = self._vtmgo.get_items('films') - self.assertTrue(items) - # print(items) - - def test_get_live(self): - items = self._vtmgo.get_live_channels() + items = self._vtmgo.get_items('all') self.assertTrue(items) # print(items) - def test_get_program(self): - info = self._vtmgo.get_program('e892cf10-5100-42ce-8d59-6b5c03cc2b96') + # Movies + movie = next(a for a in items if isinstance(a, Movie) and not a.geoblocked) + info = self._vtmgo.get_movie(movie.movie_id) self.assertTrue(info) - # print(info) + try: + self._player.play('movies', info.movie_id) + except StreamGeoblockedException: + pass - def test_get_episode(self): - info = self._vtmgo.get_episode('ae0fa98d-6ed5-4f4a-8581-a051ed3bb755') + # Programs + program = next(a for a in items if isinstance(a, Program) and not a.geoblocked) + info = self._vtmgo.get_program(program.program_id) self.assertTrue(info) - # print(info) - def test_get_live_stream(self): + season = list(info.seasons.values())[0] + episode = list(season.episodes.values())[0] + info = self._vtmgo.get_episode(episode.episode_id) + self.assertTrue(info) try: - info = self._vtmgostream.get_stream('channels', 'd8659669-b964-414c-aa9c-e31d8d15696b') - self.assertTrue(info) - # print(info) + self._player.play('episodes', info.episode_id) except StreamGeoblockedException: pass - def test_get_vod_stream(self): + def test_recommendations(self): + recommendations = self._vtmgo.get_recommendations() + self.assertTrue(recommendations) + # print(main) + + def test_mylist(self): + mylist = self._vtmgo.get_swimlane('my-list') + self.assertIsInstance(mylist, list) + # print(mylist) + + def test_live(self): + channel = self._vtmgo.get_live_channel('vtm') + self.assertTrue(channel) + # print(items) + try: - # 13 Geboden - Episode 2 - info = self._vtmgostream.get_stream('episodes', '2fafb247-0368-46d4-bdcf-fb209420e715') - self.assertTrue(info) - # print(info) + self._player.play('channels', channel.channel_id) except StreamGeoblockedException: pass diff --git a/test/test_vtmgoepg.py b/test/test_vtmgoepg.py index bdf1b71c..d93f4807 100644 --- a/test/test_vtmgoepg.py +++ b/test/test_vtmgoepg.py @@ -10,10 +10,12 @@ from urllib3.exceptions import InsecureRequestWarning +from resources.lib import plugin from resources.lib.kodiwrapper import KodiWrapper from resources.lib.vtmgo import vtmgoepg kodi = KodiWrapper() +routing = plugin.routing class TestVtmGoEpg(unittest.TestCase): @@ -35,27 +37,44 @@ def test_get_epg(self): from datetime import date # Get list of EPG for today - epg = self._vtmgoepg.get_epg(channel='vtm', date='today') + epg = self._vtmgoepg.get_epg(channel='vitaya') self.assertTrue(epg) - # Get list of EPG for tomorrow - epg = self._vtmgoepg.get_epg(channel='vtm', date='tomorrow') + epg = self._vtmgoepg.get_epg(channel='vtm', date=date.today().strftime('%Y-%m-%d')) self.assertTrue(epg) + # Get list of EPG for tomorrow + epg_tomorrow = self._vtmgoepg.get_epg(channel='vtm', date='tomorrow') + self.assertTrue(epg_tomorrow) + # Get list of EPG for yesterday - epg = self._vtmgoepg.get_epg(channel='vtm', date='yesterday') - self.assertTrue(epg) + epg_yesterday = self._vtmgoepg.get_epg(channel='vtm', date='yesterday') + self.assertTrue(epg_yesterday) # Get list of EPG for today - epg = self._vtmgoepg.get_epg(channel='vtm', date=date.today().strftime('%Y-%m-%d')) - self.assertTrue(epg) + epg_today = self._vtmgoepg.get_epg(channel='vtm', date='today') + self.assertTrue(epg_today) + + combined_broadcasts = epg_today.broadcasts + epg_tomorrow.broadcasts + epg_yesterday.broadcasts + + broadcast = next(b for b in combined_broadcasts if b.playable_type == 'episodes') + if broadcast: + details = self._vtmgoepg.get_details(channel='vtm', program_type=broadcast.playable_type, epg_id=broadcast.uuid) + self.assertTrue(details) + plugin.run([routing.url_for(plugin.show_program_from_epg, channel='vtm', program=broadcast.uuid), '0', '']) + + broadcast = next(b for b in combined_broadcasts if b.playable_type == 'movies') + if broadcast: + details = self._vtmgoepg.get_details(channel='vtm', program_type=broadcast.playable_type, epg_id=broadcast.uuid) + self.assertTrue(details) + plugin.run([routing.url_for(plugin.play_epg_program, channel='vtm', program_type=broadcast.playable_type, epg_id=broadcast.uuid, aired='123'), '0', '']) - # Take first broadcast of vtm channel - first = epg.broadcasts[0] + broadcast = next(b for b in combined_broadcasts if b.playable_type == 'oneoffs') + if broadcast: + details = self._vtmgoepg.get_details(channel='vtm', program_type=broadcast.playable_type, epg_id=broadcast.uuid) + self.assertTrue(details) - # Fetch details - details = self._vtmgoepg.get_details(channel='vtm', program_type=first.playable_type, epg_id=first.uuid) - self.assertTrue(details) + plugin.run([routing.url_for(plugin.show_program_from_epg, channel='vtm', program='error'), '0', '']) if __name__ == '__main__': diff --git a/test/userdata/addon_settings.json b/test/userdata/addon_settings.json index 2c0c3384..460fc6f4 100644 --- a/test/userdata/addon_settings.json +++ b/test/userdata/addon_settings.json @@ -6,15 +6,14 @@ "plugin.video.vtm.go": { "_comment": "do-not-add-email-and-password-here", "debug_logging": "false", - "max_bandwidth": 4096, - "username": "", - "password": "", - "show_subtitles": "true" + "interface_show_recommendations": "true", + "interface_show_mylist": "true", + "interface_show_continuewatching": "true", + "interface_show_kids_zone": "true", + "show_subtitles": "true", + "max_bandwidth": "0" }, "script.module.inputstreamhelper": { - "disabled": "false", - "last_update": "", - "update_frequency": "14", - "version": "" + "disabled": "true" } } \ No newline at end of file