diff --git a/resources/lib/api.py b/resources/lib/api.py index b5b93f3c..ad5c4633 100644 --- a/resources/lib/api.py +++ b/resources/lib/api.py @@ -35,6 +35,22 @@ 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) + + @staticmethod + def reset_queue(): + 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 diff --git a/tests/xbmc.py b/tests/xbmc.py index b96144be..a7e8cb25 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