def update_movie_set(percent, movieset, art_type, filename): log("Selected %s: %s" % (art_type, filename), xbmc.LOGDEBUG) dialog_msg( "update", percent = percent, line1 = __language__( 32006 ), \ line2 = " %s %s" % ( __language__( 32007 ), movieset[ "label" ] ), \ line3 = filename ) return DB.updateDatabase(movieset["setid"], filename, art_type, enable_force_update)
def update_movie_sets(overwrite=False): log("Updating artwork for Movie Sets", xbmc.LOGNOTICE) dialog_msg("create") found_artwork_count = 0 db_update_count = 0 # Map of artwork types and their corresponding possible filenames artwork_type_filenames = {} artwork_type_filenames[ARTWORK_TYPE_THUMB] = setting_thumb_filenames artwork_type_filenames[ARTWORK_TYPE_POSTER] = setting_poster_filenames artwork_type_filenames[ARTWORK_TYPE_FANART] = setting_fanart_filenames artwork_type_filenames[ARTWORK_TYPE_LOGO] = setting_logo_filenames artwork_type_filenames[ARTWORK_TYPE_CLEARART] = setting_clearart_filenames artwork_type_filenames[ARTWORK_TYPE_BANNER] = setting_banner_filenames # Get movie sets movie_sets = DB.getMovieSets() if len(movie_sets) == 0: dialog_msg("okdialog", line1=__language__(32011)) return found_artwork_count, db_update_count # Find all images in the artwork folder, mapped by lenient filenames used for matching file_map = {} if (enable_artwork_folder and artwork_folder_path != ""): find_images_lenient(file_map, artwork_folder_path, recurse_artwork_folder) log("Artwork folder image map: %s" % file_map) for countset, movieset in enumerate(movie_sets): try: if dialog_msg("iscanceled"): break movieset_name = movieset["label"] percent = int((countset / float(len(movie_sets))) * 100) dialog_msg( "update", percent = percent, line1 = __language__( 32006 ), \ line2 = " %s %s" % ( __language__( 32007 ), movieset_name ) ) # This sleep isn't needed, just makes UI nicer xbmc.sleep(100) log("------------------------------------------------------------", xbmc.LOGDEBUG) log("Processing movie set: %s" % movieset_name, xbmc.LOGDEBUG) log("------------------------------------------------------------", xbmc.LOGDEBUG) # The cache path is no longer correct in Gotham. Need fix or to lookup textures.db # videodb://1/7/ -> videodb://movies/sets/ #set_thumb = TBN.get_cached_saga_thumb( movieset[ "setid" ], False ) #log( "Cached thumb filename: %s" % set_thumb, xbmc.LOGDEBUG ) #set_fanart = TBN.get_cached_saga_thumb( movieset[ "setid" ], True ) #log( "Cached fanart filename: %s" % set_fanart, xbmc.LOGDEBUG ) # If exiting artwork and not overwrite, move on #if (not overwrite and (file_exists( set_thumb ) or file_exists( set_fanart )) ): # continue artwork_types_copied = [] artwork_found = {} for artwork_type in artwork_type_filenames: artwork_found[artwork_type] = [] if (enable_artwork_folder and artwork_folder_path != ""): # Check if there is artwork in the search folder matching all the supported artwork types log("== Checking single artwork folder ==", xbmc.LOGDEBUG) for artwork_type in artwork_type_filenames: for artwork_filename in artwork_type_filenames[ artwork_type]: artwork_filename = get_lenient_name( "%s-%s" % (movieset_name, artwork_filename)) # log( "Checking for: %s" % artwork_filename ) if (artwork_filename in file_map): artwork_filename = file_map[artwork_filename] artwork_found[artwork_type].append( artwork_filename) db_update_count += update_movie_set( percent, movieset, artwork_type, artwork_filename) artwork_types_copied.append(artwork_type) break # If we found all artwork types, we can move on log("Found artwork for %s types" % len(artwork_types_copied)) if (len(artwork_types_copied) == len(artwork_type_filenames)): continue if (enable_search_folders): movie_folders = [] movie_folder_names = [] # Scan the movies in the set and their folders log( "== Scanning movies in set for folder names and artwork ==", xbmc.LOGDEBUG) movies = DB.getMoviesInSet(movieset["setid"]) for movie in movies: try: dialog_msg( "update", percent = percent, line1 = __language__( 32006 ), \ line2 = " %s %s" % ( __language__( 32007 ), movieset_name ), \ line3 = " %s %s" % ( __language__( 32010 ), movie[ "title" ] ) ) log("Processing movie: %s" % movie["title"], xbmc.LOGDEBUG) movie_folder = os.path.dirname(movie["file"]) movie_folders.append(movie_folder) movie_folder_names.append( os.path.basename(movie_folder)) # Check for artwork in the parent folder of the movie folder parent_folder = os.path.dirname(movie_folder) # Remember all artwork found during scan of movies in the set for artwork_type in artwork_type_filenames: if (not artwork_type in artwork_types_copied): for artwork_filename in artwork_type_filenames[ artwork_type]: artwork_filename = find_image_lenient( artwork_filename, parent_folder, movieset_name) if file_exists(artwork_filename): artwork_found[artwork_type].append( artwork_filename) break except: xbmc.log("enumerate( movies ): %s" % repr(movie), xbmc.LOGERROR) print_exc() # Check if all movies are actually under one folder name (may be different paths) log("Movie folders found: %s" % movie_folder_names) if (len(set(movie_folder_names)) == 1): log( "== All movies in the set have the same folder name ==", xbmc.LOGDEBUG) for movie_folder in ordered_set(movie_folders): log("Checking folder for artwork: %s" % movie_folder, xbmc.LOGDEBUG) # Ignore artwork found during scan and look in the single folder for artwork_type in artwork_type_filenames: if (not artwork_type in artwork_types_copied): for artwork_filename in artwork_type_filenames[ artwork_type]: artwork_filename = find_image_lenient( artwork_filename, movie_folder, movieset_name) if file_exists(artwork_filename): artwork_found[artwork_type].append( artwork_filename) db_update_count += update_movie_set( percent, movieset, artwork_type, artwork_filename) artwork_types_copied.append( artwork_type) break # Else movies are in different folders else: # Use the most popular artwork amongst movies in the set log("== Selecting artwork found during scan ==", xbmc.LOGDEBUG) for artwork_type in artwork_type_filenames: if (not artwork_type in artwork_types_copied): artwork = artwork_found[artwork_type] if (len(artwork) > 0): log( "Possible artwork: %s" % list(set(artwork)), xbmc.LOGDEBUG) artwork_filename = max(set(artwork), key=artwork.count) db_update_count += update_movie_set( percent, movieset, artwork_type, artwork_filename) artwork_types_copied.append(artwork_type) except: xbmc.log("enumerate( movie_sets ): %s" % repr(movieset), xbmc.LOGERROR) print_exc() finally: log("------------------------------------------------------------", xbmc.LOGDEBUG) log("All artwork found for set:\n%s" % artwork_found, xbmc.LOGDEBUG) artwork_found_no_empty = dict( (k, v) for k, v in artwork_found.iteritems() if v) if (len(artwork_found_no_empty) > 0): found_artwork_count += 1 # dialog_msg( "update", percent = 100, line1 = __language__( 32009 ) ) # xbmc.sleep( 1000 ) dialog_msg("close") return found_artwork_count, db_update_count
xbmc.sleep(1000) # Check the XBMC version to determine DB or JSON xbmcVersion = xbmc.getInfoLabel("system.buildversion") log("XBMC build version: %s" % xbmcVersion) if xbmcVersion.startswith("12"): log("Using Frodo SQL database") useSQL = True else: log("Using Gotham JSON") useSQL = False # Before accessing database, check that HTTP server is running if (not useSQL and not xbmc.getCondVisibility( "System.GetBool(services.esenabled)")): dialog_msg("okdialog", line1=__language__(32014)) xbmc.executebuiltin("ActivateWindow(servicesettings)") elif (not (enable_artwork_folder or enable_search_folders)): dialog_msg("okdialog", line1=__language__(32012)) else: # In Frodo, there is always artwork for movie sets, so no overwrite means no point running overwrite = dialog_msg("yesno", line1=__language__(32008)) if (overwrite): DB.initialise(useSQL) found_artwork_count, db_update_count = update_movie_sets( overwrite) dialog_msg("okdialog", line1=__language__(32013) % (found_artwork_count, db_update_count))
def update_movie_sets(overwrite = False): log( "Updating artwork for Movie Sets", xbmc.LOGNOTICE ) dialog_msg( "create" ) found_artwork_count = 0 db_update_count = 0 # Map of artwork types and their corresponding possible filenames artwork_type_filenames = {} artwork_type_filenames[ARTWORK_TYPE_THUMB] = setting_thumb_filenames artwork_type_filenames[ARTWORK_TYPE_POSTER] = setting_poster_filenames artwork_type_filenames[ARTWORK_TYPE_FANART] = setting_fanart_filenames artwork_type_filenames[ARTWORK_TYPE_LOGO] = setting_logo_filenames artwork_type_filenames[ARTWORK_TYPE_CLEARART] = setting_clearart_filenames artwork_type_filenames[ARTWORK_TYPE_BANNER] = setting_banner_filenames artwork_type_filenames[ARTWORK_TYPE_EXTRAFANART1] = setting_extrafanart1_filenames # Get movie sets movie_sets = DB.getMovieSets() if len( movie_sets ) == 0: dialog_msg( "okdialog", line1 = __language__(32011) ) return found_artwork_count, db_update_count # Find all images in the artwork folder, mapped by lenient filenames used for matching file_map = {} if ( enable_artwork_folder and artwork_folder_path != ""): find_images_lenient(file_map, artwork_folder_path, recurse_artwork_folder) log( "Artwork folder image map: %s" % file_map ) for countset, movieset in enumerate( movie_sets ): try: if dialog_msg( "iscanceled" ): break movieset_name = movieset[ "label" ] percent = int( ( countset/float( len( movie_sets ) ) ) * 100 ) dialog_msg( "update", percent = percent, line1 = __language__( 32006 ), \ line2 = " %s %s" % ( __language__( 32007 ), movieset_name ) ) # This sleep isn't needed, just makes UI nicer xbmc.sleep( 100 ) log( "------------------------------------------------------------", xbmc.LOGDEBUG ) log( "Processing movie set: %s" % movieset_name, xbmc.LOGDEBUG) log( "------------------------------------------------------------", xbmc.LOGDEBUG ) # The cache path is no longer correct in Gotham. Need fix or to lookup textures.db # videodb://1/7/ -> videodb://movies/sets/ #set_thumb = TBN.get_cached_saga_thumb( movieset[ "setid" ], False ) #log( "Cached thumb filename: %s" % set_thumb, xbmc.LOGDEBUG ) #set_fanart = TBN.get_cached_saga_thumb( movieset[ "setid" ], True ) #log( "Cached fanart filename: %s" % set_fanart, xbmc.LOGDEBUG ) # If exiting artwork and not overwrite, move on #if (not overwrite and (file_exists( set_thumb ) or file_exists( set_fanart )) ): # continue artwork_types_copied = [] artwork_found = {} for artwork_type in artwork_type_filenames: artwork_found[artwork_type] = [] if ( enable_artwork_folder and artwork_folder_path != ""): # Check if there is artwork in the search folder matching all the supported artwork types log( "== Checking single artwork folder ==", xbmc.LOGDEBUG ) for artwork_type in artwork_type_filenames: for artwork_filename in artwork_type_filenames[artwork_type]: artwork_filename = get_lenient_name("%s-%s" % (movieset_name, artwork_filename) ) # log( "Checking for: %s" % artwork_filename ) if (artwork_filename in file_map): artwork_filename = file_map[ artwork_filename ] artwork_found[artwork_type].append(artwork_filename) db_update_count += update_movie_set(percent, movieset, artwork_type, artwork_filename) artwork_types_copied.append(artwork_type) break # If we found all artwork types, we can move on log( "Found artwork for %s types" % len(artwork_types_copied) ) if ( len(artwork_types_copied) == len(artwork_type_filenames) ): continue if ( enable_search_folders ): movie_folders = [] movie_folder_names = [] # Scan the movies in the set and their folders log( "== Scanning movies in set for folder names and artwork ==", xbmc.LOGDEBUG ) movies = DB.getMoviesInSet( movieset[ "setid" ]) for movie in movies: try: dialog_msg( "update", percent = percent, line1 = __language__( 32006 ), \ line2 = " %s %s" % ( __language__( 32007 ), movieset_name ), \ line3 = " %s %s" % ( __language__( 32010 ), movie[ "title" ] ) ) log( "Processing movie: %s" % movie[ "title" ], xbmc.LOGDEBUG ) movie_folder = os.path.dirname( movie[ "file" ] ) movie_folders.append(movie_folder) movie_folder_names.append(os.path.basename(movie_folder)) # Check for artwork in the parent folder of the movie folder parent_folder = os.path.dirname( movie_folder ) # Remember all artwork found during scan of movies in the set for artwork_type in artwork_type_filenames: if (not artwork_type in artwork_types_copied): for artwork_filename in artwork_type_filenames[artwork_type]: artwork_filename = find_image_lenient(artwork_filename, parent_folder, movieset_name) if file_exists( artwork_filename ): artwork_found[artwork_type].append(artwork_filename) break except: xbmc.log( "enumerate( movies ): %s" % repr( movie ), xbmc.LOGERROR ) print_exc() # Check if all movies are actually under one folder name (may be different paths) log( "Movie folders found: %s" % movie_folder_names) if ( len( set(movie_folder_names) ) == 1 ): log( "== All movies in the set have the same folder name ==", xbmc.LOGDEBUG) for movie_folder in ordered_set(movie_folders): log( "Checking folder for artwork: %s" % movie_folder, xbmc.LOGDEBUG) # Ignore artwork found during scan and look in the single folder for artwork_type in artwork_type_filenames: if (not artwork_type in artwork_types_copied): for artwork_filename in artwork_type_filenames[artwork_type]: artwork_filename = find_image_lenient(artwork_filename, movie_folder, movieset_name) if file_exists( artwork_filename ): artwork_found[artwork_type].append(artwork_filename) db_update_count += update_movie_set(percent, movieset, artwork_type, artwork_filename) artwork_types_copied.append(artwork_type) break # Else movies are in different folders else: # Use the most popular artwork amongst movies in the set log( "== Selecting artwork found during scan ==", xbmc.LOGDEBUG ) for artwork_type in artwork_type_filenames: if (not artwork_type in artwork_types_copied): artwork = artwork_found[artwork_type] if ( len(artwork) > 0): log( "Possible artwork: %s" % list(set(artwork)), xbmc.LOGDEBUG) artwork_filename = max( set(artwork), key=artwork.count ) db_update_count += update_movie_set(percent, movieset, artwork_type, artwork_filename) artwork_types_copied.append(artwork_type) except: xbmc.log( "enumerate( movie_sets ): %s" % repr( movieset ), xbmc.LOGERROR ) print_exc() finally: log( "------------------------------------------------------------", xbmc.LOGDEBUG ) log( "All artwork found for set:\n%s" % artwork_found, xbmc.LOGDEBUG) artwork_found_no_empty = dict((k, v) for k, v in artwork_found.iteritems() if v) if ( len(artwork_found_no_empty) > 0 ): found_artwork_count += 1 # dialog_msg( "update", percent = 100, line1 = __language__( 32009 ) ) # xbmc.sleep( 1000 ) dialog_msg( "close" ) return found_artwork_count, db_update_count
def update_movie_set(percent, movieset, art_type, filename): log( "Selected %s: %s" % (art_type, filename), xbmc.LOGDEBUG) dialog_msg( "update", percent = percent, line1 = __language__( 32006 ), \ line2 = " %s %s" % ( __language__( 32007 ), movieset[ "label" ] ), \ line3 = filename ) return DB.updateDatabase(movieset[ "setid" ], filename, art_type, enable_force_update)
xbmc.executebuiltin('Dialog.Close(all, true)') xbmc.sleep( 1000 ) # Check the XBMC version to determine DB or JSON xbmcVersion = xbmc.getInfoLabel( "system.buildversion" ) log( "XBMC build version: %s" % xbmcVersion ) if xbmcVersion.startswith("12"): log( "Using Frodo SQL database" ) useSQL = True else: log( "Using Gotham JSON" ) useSQL = False # Before accessing database, check that HTTP server is running if ( not useSQL and not xbmc.getCondVisibility( "System.GetBool(services.esenabled)" ) ): dialog_msg( "okdialog", line1 = __language__(32014) ) xbmc.executebuiltin( "ActivateWindow(servicesettings)" ) elif (not (enable_artwork_folder or enable_search_folders) ): dialog_msg( "okdialog", line1 = __language__(32012) ) else: # In Frodo, there is always artwork for movie sets, so no overwrite means no point running overwrite = dialog_msg( "yesno", line1 = __language__(32008) ) if (overwrite): DB.initialise(useSQL) found_artwork_count, db_update_count = update_movie_sets(overwrite) dialog_msg( "okdialog", line1 = __language__(32013) % (found_artwork_count, db_update_count) ) except: print "Unexpected error: ", sys.exc_info() dialog_msg( "okdialog", line1 = str(sys.exc_info()[0]), \