def list_missing_arttypes(mediatype, seasons, existingarttypes): fullartinfo = mediatypes.artinfo[mediatype] for arttype, artinfo in fullartinfo.iteritems(): if not artinfo['autolimit']: continue elif artinfo['autolimit'] == 1: if arttype not in existingarttypes: yield arttype else: artcount = sum(1 for art in existingarttypes if arttype_matches_base(art, arttype)) if artcount < artinfo['autolimit']: yield arttype if mediatype == mediatypes.TVSHOW: seasonartinfo = mediatypes.artinfo.get(mediatypes.SEASON) for season in seasons.iteritems(): for arttype, artinfo in seasonartinfo.iteritems(): arttype = '%s.%s.%s' % (mediatypes.SEASON, season[0], arttype) if not artinfo['autolimit']: continue elif artinfo['autolimit'] == 1: if arttype not in existingarttypes: yield arttype else: artcount = sum(1 for art in existingarttypes if arttype_matches_base(art, arttype)) if artcount < artinfo['autolimit']: yield arttype
def _arrange_multiart(art, basetype, remove_duplicates=False, limit=sys.maxsize): ''' Patches holes in multiple art (if fanart1 and fanart3 are missing, 2 and 4 are moved up). ''' new_art = {} art_urls = list(iter_urls_for_arttype(art, basetype)) art_set = set(art_urls) for i, url in enumerate((u for u in art_urls if u in art_set) if remove_duplicates else art_urls): if i >= limit: break new_art['{0}{1}'.format(basetype, i if i else '')] = url art_set.discard(url) new_art.update((arttype, None) for arttype in art.keys() if arttype_matches_base(arttype, basetype) and arttype not in new_art) return new_art
def getopentypes(existingtypes, arttype): keys = [exact for exact in sorted(existingtypes, key=natural_sort) if arttype_matches_base(arttype, exact)] missing = [] nextstart = 0 for count in xrange(100): if not keys: nextstart = count break exact = format_arttype(arttype, count) if exact in keys: keys.remove(exact) else: missing.append(exact) return missing, nextstart
def get_top_missing_art(self, mediatype, existingart, availableart, seasons): if not availableart: return {} newartwork = {} existingkeys = [key for key, url in existingart.iteritems() if url] for missingart in list_missing_arttypes(mediatype, seasons, existingkeys): if missingart.startswith('season.'): itemtype = mediatypes.SEASON artkey = missingart.rsplit('.', 1)[1] else: itemtype = mediatype artkey = missingart if missingart not in availableart: continue if mediatypes.artinfo[itemtype][artkey]['multiselect']: existingurls = [] existingartnames = [] for art, url in existingart.iteritems(): if mediainfo.arttype_matches_base(art, missingart) and url: existingurls.append(url) existingartnames.append(art) newart = [art for art in availableart[missingart] if self._auto_filter(missingart, art, existingurls)] if not newart: continue newartcount = 0 for i in range(0, mediatypes.artinfo[itemtype][artkey]['autolimit']): exacttype = '%s%s' % (artkey, i if i else '') if exacttype not in existingartnames: if newartcount >= len(newart): break if exacttype not in newartwork: newartwork[exacttype] = [] newartwork[exacttype] = newart[newartcount]['url'] newartcount += 1 else: newart = next((art for art in availableart[missingart] if self._auto_filter(missingart, art)), None) if newart: newartwork[missingart] = newart['url'] return newartwork
def process_item(self, mediatype, dbid, mode): if self.processor_busy: return if mode == MODE_GUI: xbmc.executebuiltin('ActivateWindow(busydialog)') if mediatype == mediatypes.TVSHOW: mediaitem = quickjson.get_tvshow_details(dbid, tvshow_properties) elif mediatype == mediatypes.MOVIE: mediaitem = quickjson.get_movie_details(dbid, movie_properties) elif mediatype == mediatypes.EPISODE: mediaitem = quickjson.get_episode_details(dbid, episode_properties) else: xbmc.executebuiltin('Dialog.Close(busydialog)') xbmcgui.Dialog().notification("Artwork Beef", L(NOT_SUPPORTED_MESSAGE).format(mediatype), '-', 6500) return if mode == MODE_GUI: self.init_run() self.add_additional_iteminfo(mediaitem) gatherer = Gatherer(self.monitor, self.only_filesystem) forcedart, availableart, _, error = gatherer.getartwork(mediaitem, False) if error: header = L(PROVIDER_ERROR_MESSAGE).format(error['providername']) xbmcgui.Dialog().notification(header, error['message'], xbmcgui.NOTIFICATION_WARNING) log('{0}\n{1}'.format(header, error['message'])) for arttype, imagelist in availableart.iteritems(): self.sort_images(arttype, imagelist, mediaitem['file']) xbmc.executebuiltin('Dialog.Close(busydialog)') if availableart: if 'seasons' in mediaitem and 'fanart' in availableart: for season in mediaitem['seasons'].keys(): unseasoned_backdrops = [dict(art) for art in availableart['fanart'] if not art.get('hasseason')] key = 'season.{0}.fanart'.format(season) if key in availableart: availableart[key].extend(unseasoned_backdrops) else: availableart[key] = unseasoned_backdrops tag_forcedandexisting_art(availableart, forcedart, mediaitem['art']) selectedarttype, selectedart = prompt_for_artwork(mediaitem['mediatype'], mediaitem['label'], availableart, self.monitor) if selectedarttype: if selectedarttype.startswith('season.'): gentype = selectedarttype.rsplit('.', 1)[1] multiselect = mediatypes.artinfo[mediatypes.SEASON].get(gentype, {}).get('multiselect', False) else: multiselect = mediatypes.artinfo[mediaitem['mediatype']][selectedarttype]['multiselect'] if multiselect: existingurls = [url for exacttype, url in mediaitem['art'].iteritems() \ if mediainfo.arttype_matches_base(exacttype, selectedarttype)] urls_toset = [url for url in existingurls if url not in selectedart[1]] urls_toset.extend([url for url in selectedart[0] if url not in urls_toset]) selectedart = dict(mediainfo.iter_renumbered_artlist(selectedart, selectedarttype, mediaitem['art'].keys())) else: selectedart = {selectedarttype: selectedart} selectedart = mediainfo.get_artwork_updates(mediaitem['art'], selectedart) if selectedart: add_art_to_library(mediaitem['mediatype'], mediaitem.get('seasons'), mediaitem['dbid'], selectedart) notifycount(len(selectedart)) else: xbmcgui.Dialog().notification(L(NOT_AVAILABLE_MESSAGE), L(SOMETHING_MISSING) + ' ' + L(FINAL_MESSAGE), '-', 8000) self.finish_run() else: medialist = [mediaitem] autoaddepisodes = addon.get_setting('autoaddepisodes_list') if addon.get_setting('episode.fanart') else () if mediatype == mediatypes.TVSHOW and mediaitem['imdbnumber'] in autoaddepisodes: medialist.extend(quickjson.get_episodes(dbid, properties=episode_properties)) self.process_medialist(medialist, True)