Try to skip new PMS items we've already processed

This commit is contained in:
tomkat83 2017-02-26 18:04:54 +01:00
parent 39d3e8acc9
commit 84f7aba5d1

View file

@ -321,6 +321,11 @@ class LibrarySync(Thread):
def __init__(self, callback=None): def __init__(self, callback=None):
self.mgr = callback self.mgr = callback
# Dict of items we just processed in order to prevent a reprocessing
# caused by websocket
self.just_processed = {}
# How long do we wait until we start re-processing? (in seconds)
self.ignore_just_processed = 10*60
self.itemsToProcess = [] self.itemsToProcess = []
self.sessionKeys = [] self.sessionKeys = []
self.fanartqueue = Queue.Queue() self.fanartqueue = Queue.Queue()
@ -532,6 +537,9 @@ class LibrarySync(Thread):
# True: we're syncing only the delta, e.g. different checksum # True: we're syncing only the delta, e.g. different checksum
self.compare = not repair self.compare = not repair
# Empty our list of item's we've just processed in the past
self.just_processed = {}
self.new_items_only = True self.new_items_only = True
# This will also update playstates and userratings! # This will also update playstates and userratings!
log.info('Running fullsync for NEW PMS items with repair=%s' % repair) log.info('Running fullsync for NEW PMS items with repair=%s' % repair)
@ -884,6 +892,7 @@ class LibrarySync(Thread):
self.allPlexElementsId APPENDED(!!) dict self.allPlexElementsId APPENDED(!!) dict
= {itemid: checksum} = {itemid: checksum}
""" """
now = getUnixTimestamp()
if self.new_items_only is True: if self.new_items_only is True:
# Only process Plex items that Kodi does not already have in lib # Only process Plex items that Kodi does not already have in lib
for item in xml: for item in xml:
@ -903,6 +912,7 @@ class LibrarySync(Thread):
'title': item.attrib.get('title', 'Missing Title'), 'title': item.attrib.get('title', 'Missing Title'),
'mediaType': item.attrib.get('type') 'mediaType': item.attrib.get('type')
}) })
self.just_processed[itemId] = now
return return
if self.compare: if self.compare:
@ -928,6 +938,7 @@ class LibrarySync(Thread):
'title': item.attrib.get('title', 'Missing Title'), 'title': item.attrib.get('title', 'Missing Title'),
'mediaType': item.attrib.get('type') 'mediaType': item.attrib.get('type')
}) })
self.just_processed[itemId] = now
else: else:
# Initial or repair sync: get all Plex movies # Initial or repair sync: get all Plex movies
for item in xml: for item in xml:
@ -946,6 +957,7 @@ class LibrarySync(Thread):
'title': item.attrib.get('title', 'Missing Title'), 'title': item.attrib.get('title', 'Missing Title'),
'mediaType': item.attrib.get('type') 'mediaType': item.attrib.get('type')
}) })
self.just_processed[itemId] = now
def GetAndProcessXMLs(self, itemType): def GetAndProcessXMLs(self, itemType):
""" """
@ -1450,6 +1462,8 @@ class LibrarySync(Thread):
continue continue
else: else:
successful = self.process_newitems(item) successful = self.process_newitems(item)
if successful:
self.just_processed[str(item['ratingKey'])] = now
if successful and settings('FanartTV') == 'true': if successful and settings('FanartTV') == 'true':
plex_type = v.PLEX_TYPE_FROM_WEBSOCKET[item['type']] plex_type = v.PLEX_TYPE_FROM_WEBSOCKET[item['type']]
if plex_type in (v.PLEX_TYPE_MOVIE, v.PLEX_TYPE_SHOW): if plex_type in (v.PLEX_TYPE_MOVIE, v.PLEX_TYPE_SHOW):
@ -1534,6 +1548,7 @@ class LibrarySync(Thread):
PMS is messing with the library items, e.g. new or changed. Put in our PMS is messing with the library items, e.g. new or changed. Put in our
"processing queue" for later "processing queue" for later
""" """
now = getUnixTimestamp()
for item in data: for item in data:
if 'tv.plex' in item.get('identifier', ''): if 'tv.plex' in item.get('identifier', ''):
# Ommit Plex DVR messages - the Plex IDs are not corresponding # Ommit Plex DVR messages - the Plex IDs are not corresponding
@ -1548,6 +1563,14 @@ class LibrarySync(Thread):
if plex_id == '0': if plex_id == '0':
log.error('Received malformed PMS message: %s' % item) log.error('Received malformed PMS message: %s' % item)
continue continue
try:
if (now - self.just_processed[plex_id] <
self.ignore_just_processed and state != 9):
log.debug('We just processed %s: ignoring' % plex_id)
continue
except KeyError:
# Item has NOT just been processed
pass
# Have we already added this element? # Have we already added this element?
for existingItem in self.itemsToProcess: for existingItem in self.itemsToProcess:
if existingItem['ratingKey'] == plex_id: if existingItem['ratingKey'] == plex_id: