diff --git a/resources/lib/itemtypes.py b/resources/lib/itemtypes.py index 598974ec..0016941f 100644 --- a/resources/lib/itemtypes.py +++ b/resources/lib/itemtypes.py @@ -63,76 +63,14 @@ class Items(object): self.kodiconn.close() return self - @utils.catch_exceptions(warnuser=True) - def getfanart(self, plex_id, refresh=False): + def set_fanart(self, artworks, kodi_id, kodi_type): """ - Tries to get additional fanart for movies (+sets) and TV shows. - - Returns True if successful, False otherwise + Writes artworks [dict containing only set artworks] to the Kodi art DB """ - with plexdb.Get_Plex_DB() as plex_db: - db_item = plex_db.getItem_byId(plex_id) - try: - kodi_id = db_item[0] - kodi_type = db_item[4] - except TypeError: - LOG.error('Could not get Kodi id for plex id %s, abort getfanart', - plex_id) - return False - if refresh is True: - # Leave the Plex art untouched - allartworks = None - else: - with kodidb.GetKodiDB('video') as kodi_db: - allartworks = kodi_db.get_art(kodi_id, kodi_type) - # Check if we even need to get additional art - needsupdate = False - for key in v.ALL_KODI_ARTWORK: - if key not in allartworks: - needsupdate = True - break - if needsupdate is False: - LOG.debug('Already got all fanart for Plex id %s', plex_id) - return True - - xml = PF.GetPlexMetadata(plex_id) - if xml is None: - # Did not receive a valid XML - skip that item for now - LOG.error("Could not get metadata for %s. Skipping that item " - "for now", plex_id) - return False - elif xml == 401: - LOG.error('HTTP 401 returned by PMS. Too much strain? ' - 'Cancelling sync for now') - # Kill remaining items in queue (for main thread to cont.) - return False - api = API(xml[0]) - if allartworks is None: - allartworks = api.artwork() - self.artwork.modify_artwork(api.fanart_artwork(allartworks), + self.artwork.modify_artwork(artworks, kodi_id, kodi_type, self.kodicursor) - # Also get artwork for collections/movie sets - if kodi_type == v.KODI_TYPE_MOVIE: - for _, setname in api.collection_list(): - LOG.debug('Getting artwork for movie set %s', setname) - setid = self.kodi_db.create_collection(setname) - external_set_artwork = api.set_artwork() - if (external_set_artwork and - utils.settings('PreferKodiCollectionArt') == 'true'): - # Need to make sure we are not overwriting existing Plex - # collection artwork - plex_artwork = api.artwork(kodi_id=setid, - kodi_type=v.KODI_TYPE_SET) - for art in plex_artwork: - if art in external_set_artwork: - del external_set_artwork[art] - self.artwork.modify_artwork(external_set_artwork, - setid, - v.KODI_TYPE_SET, - self.kodicursor) - return True def updateUserdata(self, xml): """ diff --git a/resources/lib/library_sync/fanart.py b/resources/lib/library_sync/fanart.py index 1b26eca5..87b9eefd 100644 --- a/resources/lib/library_sync/fanart.py +++ b/resources/lib/library_sync/fanart.py @@ -5,12 +5,9 @@ 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 +from ..plex_api import API +from .. import utils, plexdb_functions as plexdb, kodidb_functions as kodidb +from .. import itemtypes, artwork, plex_functions as PF, variables as v, state ############################################################################### @@ -46,24 +43,22 @@ class ThreadedProcessFanart(Thread): Do the work """ LOG.debug("---===### Starting FanartSync ###===---") - stopped = self.stopped - suspended = self.suspended - queue = self.queue - while not stopped(): + while not self.stopped(): # In the event the server goes offline - while suspended(): + while self.suspended(): # Set in service.py - if stopped(): + if self.stopped(): # Abort was requested while waiting. We should exit - LOG.info("---===### Stopped FanartSync ###===---") + LOG.debug("---===### Stopped FanartSync ###===---") return xbmc.sleep(1000) # grabs Plex item from queue try: - item = queue.get(block=False) + item = self.queue.get(block=False) except Empty: xbmc.sleep(200) continue + self.queue.task_done() if isinstance(item, artwork.ArtworkSyncMessage): if state.IMAGE_SYNC_NOTIFICATIONS: utils.dialog('notification', @@ -71,17 +66,76 @@ class ThreadedProcessFanart(Thread): 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']) - queue.task_done() + _process(item) LOG.debug("---===### Stopped FanartSync ###===---") + + +def _process(item): + done = False + try: + artworks = None + with plexdb.Get_Plex_DB() as plex_db: + db_item = plex_db.getItem_byId(item['plex_id']) + try: + kodi_id = db_item[0] + kodi_type = db_item[4] + except TypeError: + LOG.error('Could not get Kodi id for plex id %s, abort getfanart', + item['plex_id']) + return + if item['refresh'] is False: + with kodidb.GetKodiDB('video') as kodi_db: + artworks = kodi_db.get_art(kodi_id, kodi_type) + # Check if we even need to get additional art + for key in v.ALL_KODI_ARTWORK: + if key not in artworks: + break + else: + LOG.debug('Already got all fanart for Plex id %s', + item['plex_id']) + done = True + return + xml = PF.GetPlexMetadata(item['plex_id']) + if xml is None: + LOG.error('Could not get metadata for %s. Skipping that item ' + 'for now', item['plex_id']) + return + elif xml == 401: + LOG.error('HTTP 401 returned by PMS. Too much strain? ' + 'Cancelling sync for now') + return + api = API(xml[0]) + if artworks is None: + artworks = api.artwork() + # Get additional missing artwork from fanart artwork sites + artworks = api.fanart_artwork(artworks) + with getattr(itemtypes, + v.ITEMTYPE_FROM_PLEXTYPE[item['plex_type']])() as itm: + itm.set_fanart(artworks, kodi_id, kodi_type) + # Additional fanart for sets/collections + if api.plex_type() == v.PLEX_TYPE_MOVIE: + for _, setname in api.collection_list(): + LOG.debug('Getting artwork for movie set %s', setname) + with kodidb.GetKodiDB('video') as kodi_db: + setid = kodi_db.create_collection(setname) + external_set_artwork = api.set_artwork() + if (external_set_artwork and + utils.settings('PreferKodiCollectionArt') == 'false'): + kodi_artwork = api.artwork(kodi_id=setid, + kodi_type=v.KODI_TYPE_SET) + for art in kodi_artwork: + if art in external_set_artwork: + del external_set_artwork[art] + with itemtypes.Movies() as movie_db: + movie_db.artwork.modify_artwork(external_set_artwork, + setid, + v.KODI_TYPE_SET, + movie_db.kodicursor) + done = True + finally: + if done 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']) diff --git a/resources/settings.xml b/resources/settings.xml index ad276023..76cdef9c 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -131,9 +131,9 @@ - - + +