# -*- coding: utf-8 -*- from logging import getLogger from threading import Thread from Queue import Empty import xbmc from .. import utils from .. import plexdb_functions as plexdb from .. import itemtypes from .. import artwork from .. import variables as v from .. import state ############################################################################### LOG = getLogger("PLEX." + __name__) ############################################################################### @utils.thread_methods(add_suspends=['SUSPEND_LIBRARY_THREAD', 'DB_SCAN', 'STOP_SYNC', 'SUSPEND_SYNC']) class ThreadedProcessFanart(Thread): """ Threaded download of additional fanart in the background Input: queue Queue.Queue() object that you will need to fill with dicts of the following form: { 'plex_id': the Plex id as a string 'plex_type': the Plex media type, e.g. 'movie' 'refresh': True/False if True, will overwrite any 3rd party fanart. If False, will only get missing } """ def __init__(self, queue): self.queue = queue Thread.__init__(self) def run(self): """ Do the work """ LOG.debug("---===### Starting FanartSync ###===---") stopped = self.stopped suspended = self.suspended queue = self.queue counter = 0 set_zero = False while not stopped(): # In the event the server goes offline while suspended(): # Set in service.py if stopped(): # Abort was requested while waiting. We should exit LOG.info("---===### Stopped FanartSync ###===---") return xbmc.sleep(1000) # grabs Plex item from queue try: item = queue.get(block=False) except Empty: if not set_zero and not xbmc.getCondVisibility( 'Window.IsVisible(DialogAddonSettings.xml)'): # Avoid saving '0' all the time set_zero = True utils.settings('fanarttv_lookups', value='0') xbmc.sleep(200) continue set_zero = False if isinstance(item, artwork.ArtworkSyncMessage): if state.IMAGE_SYNC_NOTIFICATIONS: utils.dialog('notification', heading=utils.lang(29999), message=item.message, icon='{plex}', sound=False) queue.task_done() continue LOG.debug('Get additional fanart for Plex id %s', item['plex_id']) with getattr(itemtypes, v.ITEMTYPE_FROM_PLEXTYPE[item['plex_type']])() as item_type: result = item_type.getfanart(item['plex_id'], refresh=item['refresh']) if result is True: LOG.debug('Done getting fanart for Plex id %s', item['plex_id']) with plexdb.Get_Plex_DB() as plex_db: plex_db.set_fanart_synched(item['plex_id']) # Update the caching state in the PKC settings. Avoid saving '0' counter += 1 if (counter > 20 and not xbmc.getCondVisibility( 'Window.IsVisible(DialogAddonSettings.xml)')): counter = 0 utils.settings('fanarttv_lookups', value=str(queue.qsize())) queue.task_done() LOG.debug("---===### Stopped FanartSync ###===---")