diff --git a/resources/lib/kodimonitor.py b/resources/lib/kodimonitor.py index 0123cded..17014f18 100644 --- a/resources/lib/kodimonitor.py +++ b/resources/lib/kodimonitor.py @@ -216,6 +216,18 @@ class KodiMonitor(xbmc.Monitor): } Will NOT be called if playback initiated by Kodi widgets """ + if data['item'] == {'type': 'unknown'}: + # Kodi will return something like this if user started a PLAYLIST + # from add-on paths: + # {u'item': {u'type': u'unknown'}, + # u'playlistid': 0, + # u'position': 4} + if not state.PLAYLIST_PLAY: + LOG.debug('Detected playback from a playlist') + state.PLAYLIST_PLAY = True + return + else: + state.PLAYLIST_PLAY = False if 'id' not in data['item']: return old = state.OLD_PLAYER_STATES[data['playlistid']] diff --git a/resources/lib/playback.py b/resources/lib/playback.py index 9943d514..8c41abc4 100644 --- a/resources/lib/playback.py +++ b/resources/lib/playback.py @@ -60,29 +60,36 @@ def playback_triage(plex_id=None, plex_type=None, path=None, resolve=True): dialog('notification', lang(29999), lang(30017)) _ensure_resolve(abort=True) return + if state.PLAYLIST_PLAY: + LOG.debug('Kodi playlist play detected') + state.PLAYLIST_PLAY = False + _playlist_playback(plex_id, plex_type) + return playqueue = PQ.get_playqueue_from_type( v.KODI_PLAYLIST_TYPE_FROM_PLEX_TYPE[plex_type]) try: pos = js.get_position(playqueue.playlistid) except KeyError: - LOG.info('No position returned from Kodi player! Assuming playlist') - _playlist_playback(plex_id, plex_type) + LOG.error('No position returned from Kodi player!') + # "Play error" + dialog('notification', lang(29999), lang(30128), icon='{error}') + _ensure_resolve(abort=True) + return + # Can return -1 (as in "no playlist") + pos = pos if pos != -1 else 0 + LOG.debug('playQueue position %s for %s', pos, playqueue) + # Have we already initiated playback? + try: + item = playqueue.items[pos] + except IndexError: + initiate = True else: - # Can return -1 (as in "no playlist") - pos = pos if pos != -1 else 0 - LOG.debug('playQueue position %s for %s', pos, playqueue) - # Have we already initiated playback? - try: - item = playqueue.items[pos] - except IndexError: - initiate = True - else: - initiate = True if item.plex_id != plex_id else False - if initiate: - _playback_init(plex_id, plex_type, playqueue, pos) - else: - # kick off playback on second pass - _conclude_playback(playqueue, pos) + initiate = True if item.plex_id != plex_id else False + if initiate: + _playback_init(plex_id, plex_type, playqueue, pos) + else: + # kick off playback on second pass + _conclude_playback(playqueue, pos) def _playlist_playback(plex_id, plex_type): @@ -102,9 +109,6 @@ def _playlist_playback(plex_id, plex_type): for the next item in line :-) (by the way: trying to get active Kodi player id will return []) """ - # Kodi bug: playqueue will ALWAYS be audio playqueue - playqueue = PQ.get_playqueue_from_type(v.KODI_PLAYLIST_TYPE_AUDIO) - playqueue.clear(kodi=False) xml = GetPlexMetadata(plex_id) try: xml[0].attrib @@ -114,9 +118,15 @@ def _playlist_playback(plex_id, plex_type): dialog('notification', lang(29999), lang(30128), icon='{error}') _ensure_resolve(abort=True) return + # Kodi bug: playqueue will ALWAYS be audio playqueue UNTIL playback + # has actually started. Need to tell Kodimonitor + playqueue = PQ.get_playqueue_from_type(v.KODI_PLAYLIST_TYPE_AUDIO) + playqueue.clear(kodi=False) + # Set the flag for the potentially WRONG audio playlist so Kodimonitor + # can pick up on it + playqueue.kodi_playlist_playback = True playlist_item = PL.playlist_item_from_xml(xml[0]) playqueue.items.append(playlist_item) - playqueue.kodi_playlist_playback = True _conclude_playback(playqueue, pos=0) diff --git a/resources/lib/state.py b/resources/lib/state.py index ce27325f..73e21c2e 100644 --- a/resources/lib/state.py +++ b/resources/lib/state.py @@ -160,6 +160,8 @@ RESUME_PLAYBACK = False CONTEXT_MENU_PLAY = False # Set by context menu - shall we force-transcode the next playing item? FORCE_TRANSCODE = False +# Flag if user started playback of a PLAYLIST (not playqueue) for add-on paths +PLAYLIST_PLAY = False # Kodi webserver details WEBSERVER_PORT = 8080