From 32b219409483869923b424d046a20bee870350ce Mon Sep 17 00:00:00 2001 From: MoojMidge <56883549+MoojMidge@users.noreply.github.com> Date: Mon, 13 Jul 2020 06:12:29 +1000 Subject: [PATCH 1/6] Fix for #139 Will enqueue the next episode to the playlist in launch_popup() and, by default, will play media as per normal playlist handling method. Note that call to self.player.seekTime() in launch_popup() never seemed to work properly and I'm not sure why this method was used rather than simply skipping to the next playlist item using self.player.playnext(). In any case both methods are now utilised, without any apparent problems on my end, but this may be device/timing dependent. Queue state is reset (previous playlist item is removed) in the player monitor. --- resources/lib/api.py | 15 +++++++++++++++ resources/lib/playbackmanager.py | 11 ++++++++--- resources/lib/player.py | 10 +++++++++- resources/lib/state.py | 1 + 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/resources/lib/api.py b/resources/lib/api.py index b5b93f3c..c1312da1 100644 --- a/resources/lib/api.py +++ b/resources/lib/api.py @@ -35,6 +35,21 @@ def addon_data_received(self, data, encoding='base64'): def play_kodi_item(episode): jsonrpc(method='Player.Open', id=0, params=dict(item=dict(episodeid=episode.get('episodeid')))) + def queue_next_item(self, episode): + next_item = {} + if not self.data: + next_item.update(episodeid=episode.get('episodeid')) + elif self.data.get('play_url'): + next_item.update(file=self.data.get('play_url')) + + if next_item: + jsonrpc(method='Playlist.Add', id=0, params=dict(playlistid=1, item=next_item)) + + return bool(next_item) + + def reset_queue(self): + jsonrpc(method='Playlist.Remove', id=0, params=dict(playlistid=1, position=0)) + def get_next_in_playlist(self, position): result = jsonrpc(method='Playlist.GetItems', params=dict( playlistid=1, diff --git a/resources/lib/playbackmanager.py b/resources/lib/playbackmanager.py index 64490113..269f1ada 100644 --- a/resources/lib/playbackmanager.py +++ b/resources/lib/playbackmanager.py @@ -50,6 +50,9 @@ def launch_popup(self, episode, playlist_item): if not include_play_count or self.state.current_episode_id == episode_id: return + if not playlist_item: + self.state.queued = self.api.queue_next_item(episode) + # We have a next up episode choose mode if get_setting_int('simpleMode') == 0: next_up_page = UpNext('script-upnext-upnext-simple.xml', addon_path(), 'default', '1080i') @@ -76,10 +79,12 @@ def launch_popup(self, episode, playlist_item): self.log('playing media episode', 2) # Signal to trakt previous episode watched event(message='NEXTUPWATCHEDSIGNAL', data=dict(episodeid=self.state.current_episode_id), encoding='base64') - if playlist_item: + if playlist_item or self.state.queued: try: - # Play playlist media - self.player.seekTime(self.player.getTotalTime()) + # Play playlist media, only seek/skip if media has not already played through + if should_play_non_default: + self.player.seekTime(self.player.getTotalTime()) + self.player.playnext() except RuntimeError: pass elif self.api.has_addon_data(): diff --git a/resources/lib/player.py b/resources/lib/player.py index 39c25741..f28a89ec 100644 --- a/resources/lib/player.py +++ b/resources/lib/player.py @@ -30,13 +30,18 @@ def is_tracking(self): def disable_tracking(self): self.state.track = False + def reset_queue(self): + if self.state.queued: + self.api.reset_queue() + self.state.queued = False + def onPlayBackStarted(self): # pylint: disable=invalid-name """Will be called when kodi starts playing a file""" self.monitor.waitForAbort(5) if not getCondVisibility('videoplayer.content(episodes)'): return self.state.track = True - + self.reset_queue() def onPlayBackPaused(self): # pylint: disable=invalid-name self.state.pause = True @@ -46,15 +51,18 @@ def onPlayBackResumed(self): # pylint: disable=invalid-name def onPlayBackStopped(self): # pylint: disable=invalid-name """Will be called when user stops playing a file""" + self.reset_queue() self.api.reset_addon_data() self.state = State() # Reset state def onPlayBackEnded(self): # pylint: disable=invalid-name """Will be called when Kodi has ended playing a file""" + self.reset_queue() self.api.reset_addon_data() self.state = State() # Reset state def onPlayBackError(self): # pylint: disable=invalid-name """Will be called when when playback stops due to an error""" + self.reset_queue() self.api.reset_addon_data() self.state = State() # Reset state diff --git a/resources/lib/state.py b/resources/lib/state.py index db86dffd..8984d409 100644 --- a/resources/lib/state.py +++ b/resources/lib/state.py @@ -20,3 +20,4 @@ def __init__(self): self.last_file = None self.track = False self.pause = False + self.queued = False From 046731cee4b5290f28f48c8b0305d5d1095d1d93 Mon Sep 17 00:00:00 2001 From: MoojMidge <56883549+MoojMidge@users.noreply.github.com> Date: Mon, 13 Jul 2020 06:32:21 +1000 Subject: [PATCH 2/6] Update api.py --- resources/lib/api.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/lib/api.py b/resources/lib/api.py index c1312da1..ad5c4633 100644 --- a/resources/lib/api.py +++ b/resources/lib/api.py @@ -41,13 +41,14 @@ def queue_next_item(self, episode): next_item.update(episodeid=episode.get('episodeid')) elif self.data.get('play_url'): next_item.update(file=self.data.get('play_url')) - + if next_item: jsonrpc(method='Playlist.Add', id=0, params=dict(playlistid=1, item=next_item)) return bool(next_item) - def reset_queue(self): + @staticmethod + def reset_queue(): jsonrpc(method='Playlist.Remove', id=0, params=dict(playlistid=1, position=0)) def get_next_in_playlist(self, position): From ee892e914739e3fb451001193f808bceee892802 Mon Sep 17 00:00:00 2001 From: MoojMidge <56883549+MoojMidge@users.noreply.github.com> Date: Mon, 13 Jul 2020 07:16:15 +1000 Subject: [PATCH 3/6] Update player.py --- resources/lib/player.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lib/player.py b/resources/lib/player.py index f28a89ec..60b01e38 100644 --- a/resources/lib/player.py +++ b/resources/lib/player.py @@ -16,7 +16,7 @@ def __init__(self): self.api = Api() self.state = State() self.monitor = Monitor() - Player.__init__(self) + Player.__init__(self, Player()) def set_last_file(self, filename): self.state.last_file = filename From 7648af13afa12bf46c27c5bec76f44efd9533dfc Mon Sep 17 00:00:00 2001 From: MoojMidge <56883549+MoojMidge@users.noreply.github.com> Date: Mon, 13 Jul 2020 07:36:08 +1000 Subject: [PATCH 4/6] Revert "Update player.py" This reverts commit ee892e914739e3fb451001193f808bceee892802. --- resources/lib/player.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lib/player.py b/resources/lib/player.py index 60b01e38..f28a89ec 100644 --- a/resources/lib/player.py +++ b/resources/lib/player.py @@ -16,7 +16,7 @@ def __init__(self): self.api = Api() self.state = State() self.monitor = Monitor() - Player.__init__(self, Player()) + Player.__init__(self) def set_last_file(self, filename): self.state.last_file = filename From 84eff2113c258d57f096d15ef1c25495834cb67b Mon Sep 17 00:00:00 2001 From: MoojMidge <56883549+MoojMidge@users.noreply.github.com> Date: Mon, 13 Jul 2020 07:38:36 +1000 Subject: [PATCH 5/6] Update xbmc.py --- tests/xbmc.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/xbmc.py b/tests/xbmc.py index b96144be..60f86b01 100644 --- a/tests/xbmc.py +++ b/tests/xbmc.py @@ -86,6 +86,10 @@ def play(self, item='', listitem=None, windowed=False, startpos=-1): # pylint: ''' A stub implementation for the xbmc Player class play() method ''' return + def playnext(self): + ''' A stub implementation for the xbmc Player class playnext() method ''' + return + def stop(self): ''' A stub implementation for the xbmc Player class stop() method ''' return From 65493a868879cd3df6f4e0b0558e12f78a1c474a Mon Sep 17 00:00:00 2001 From: MoojMidge <56883549+MoojMidge@users.noreply.github.com> Date: Mon, 13 Jul 2020 07:42:54 +1000 Subject: [PATCH 6/6] Update xbmc.py --- tests/xbmc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/xbmc.py b/tests/xbmc.py index 60f86b01..a7e8cb25 100644 --- a/tests/xbmc.py +++ b/tests/xbmc.py @@ -87,7 +87,7 @@ def play(self, item='', listitem=None, windowed=False, startpos=-1): # pylint: return def playnext(self): - ''' A stub implementation for the xbmc Player class playnext() method ''' + ''' A stub implementation for the xbmc Player class playnext() method ''' return def stop(self):