From 87b22f1588f02d10f0698bf2dfa949d13b1da840 Mon Sep 17 00:00:00 2001 From: croneter Date: Sat, 2 Jun 2018 17:31:57 +0200 Subject: [PATCH] Revert "Make sure that LOCK is released after adding one element" This reverts commit c05b772e902183b8ed50ecf9180cfe3f30e9eb58. - Should fix a racing condition if the playlist is cleared (picked up by both kodimonitor and playqueue monitor) --- resources/lib/playqueue.py | 73 ++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 39 deletions(-) diff --git a/resources/lib/playqueue.py b/resources/lib/playqueue.py index fd188bb3..551d89b0 100644 --- a/resources/lib/playqueue.py +++ b/resources/lib/playqueue.py @@ -179,42 +179,39 @@ class PlayqueueMonitor(Thread): elif identical: LOG.debug('Detected playqueue item %s moved to position %s', i + j, i) - with LOCK: - PL.move_playlist_item(playqueue, i + j, i) + PL.move_playlist_item(playqueue, i + j, i) del old[j], index[j] break else: LOG.debug('Detected new Kodi element at position %s: %s ', i, new_item) - with LOCK: - try: - if playqueue.id is None: - PL.init_Plex_playlist(playqueue, kodi_item=new_item) - else: - PL.add_item_to_PMS_playlist(playqueue, - i, - kodi_item=new_item) - except PL.PlaylistError: - # Could not add the element - pass - except IndexError: - # This is really a hack - happens when using Addon Paths - # and repeatedly starting the same element. Kodi will - # then not pass kodi id nor file path AND will also not - # start-up playback. Hence kodimonitor kicks off - # playback. Also see kodimonitor.py - _playlist_onadd() - pass + try: + if playqueue.id is None: + PL.init_Plex_playlist(playqueue, kodi_item=new_item) else: - for j in range(i, len(index)): - index[j] += 1 + PL.add_item_to_PMS_playlist(playqueue, + i, + kodi_item=new_item) + except PL.PlaylistError: + # Could not add the element + pass + except IndexError: + # This is really a hack - happens when using Addon Paths + # and repeatedly starting the same element. Kodi will then + # not pass kodi id nor file path AND will also not + # start-up playback. Hence kodimonitor kicks off playback. + # Also see kodimonitor.py - _playlist_onadd() + pass + else: + for j in range(i, len(index)): + index[j] += 1 for i in reversed(index): if self.stopped(): # Chances are that we got an empty Kodi playlist due to # Kodi exit return LOG.debug('Detected deletion of playqueue element at pos %s', i) - with LOCK: - PL.delete_playlist_item_from_PMS(playqueue, i) + PL.delete_playlist_item_from_PMS(playqueue, i) LOG.debug('Done comparing playqueues') def run(self): @@ -226,20 +223,18 @@ class PlayqueueMonitor(Thread): if stopped(): break sleep(1000) - for playqueue in PLAYQUEUES: - kodi_pl = js.playlist_get_items(playqueue.playlistid) - if playqueue.old_kodi_pl != kodi_pl: - if playqueue.id is None and (not state.DIRECT_PATHS or - state.CONTEXT_MENU_PLAY): - # Only initialize if directly fired up using direct - # paths. Otherwise let default.py do its magic - LOG.debug('Not yet initiating playback') - elif playqueue.pkc_edit: - playqueue.pkc_edit = False - LOG.debug('PKC just edited the playqueue - skipping') - else: - # compare old and new playqueue - self._compare_playqueues(playqueue, kodi_pl) - playqueue.old_kodi_pl = list(kodi_pl) + with LOCK: + for playqueue in PLAYQUEUES: + kodi_pl = js.playlist_get_items(playqueue.playlistid) + if playqueue.old_kodi_pl != kodi_pl: + if playqueue.id is None and (not state.DIRECT_PATHS or + state.CONTEXT_MENU_PLAY): + # Only initialize if directly fired up using direct + # paths. Otherwise let default.py do its magic + LOG.debug('Not yet initiating playback') + else: + # compare old and new playqueue + self._compare_playqueues(playqueue, kodi_pl) + playqueue.old_kodi_pl = list(kodi_pl) sleep(200) LOG.info("----===## PlayqueueMonitor stopped ##===----")