Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions resources/lib/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
11 changes: 8 additions & 3 deletions resources/lib/playbackmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand All @@ -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():
Expand Down
10 changes: 9 additions & 1 deletion resources/lib/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
1 change: 1 addition & 0 deletions resources/lib/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ def __init__(self):
self.last_file = None
self.track = False
self.pause = False
self.queued = False
4 changes: 4 additions & 0 deletions tests/xbmc.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down