def get_metas(dirname, picfile): picentry = {} ### chemin de la miniature extension = splitext(picfile)[1].upper() # si le fichier est une vidéo, if extension in vidsext: picentry.update( {"EXIF DateTimeOriginal": strftime("%Y-%m-%d %H:%M:%S", gmtime(stat(join(dirname, picfile)).st_mtime))} ) # si le fichier est une image elif extension in picsext: thumbnails = Thumbnails() # picentry["Thumb"]=thumbnails.get_cached_picture_thumb( join(dirname,picfile) ).decode("utf8") ############################### # getting EXIF infos # ############################### # reading EXIF infos # (file fields are creating if needed) try: exif = MPDB.get_exif(join(dirname, picfile)) # EXIF infos are added to a dictionnary picentry.update(exif) except: print "Exception thrown from MPDB.get_exif" ############################### # getting IPTC infos # ############################### try: iptc = MPDB.get_iptc(dirname, picfile) # IPTC infos are added to a dictionnary picentry.update(iptc) except: print "Exception thrown from MPDB.get_iptc" ############################### # getting XMP infos # ############################### try: xmp = MPDB.get_xmp(dirname, picfile) picentry.update(xmp) except: print "Exception thrown from MPDB.get_xmp" else: picentry = {} # this should never happen MPDB.log("file was neither of video type, nor picture type... Check the extensions in settings", LOGNOTICE) return picentry
def browse_folder(dirname,parentfolderID=None,recursive=True,updatepics=False,addpics=True,delpics=True,rescan=False,updatefunc=None,dateadded = strftime("%Y-%m-%d %H:%M:%S")): """Browse the root folder 'dirname' - 'recursive' : the scan is recursive. all the subfolders of 'dirname' are traversed for pics - 'updatepics' : enable to modify a picture entry if metas changed - 'rescan' : force the scan wheter pictures are already inside DB or not - 'addpics' : - 'delpics' : - 'dateadded' : the date when the pictures are scanned (useful for subfolders calls to keep the same date as the main root folder) - 'updatefunc' is a function called to show the progress of the scan. The parameters are : pourcentage(int),[ line1(str),line2(str),line3(str) ] ) """ global compte,comptenew,cptscanned,cptdelete,cptchanged,cptroots,iroots cpt=0 #on liste les fichiers jpg du dossier listfolderfiles=[] sys_enc = sys.getfilesystemencoding() dirname = smart_unicode(dirname) #print "In browse_folder" ####### # Pre STEP: cleanup keywords in database ####### MPDB.DB_cleanup_keywords() ####### # STEP 0 : dirname should not be one of those which are excluded from scan ! ####### # TODO : if the path was already scanned before, we need to remove previously added pictures AND subfolders if dirname in Exclude_folders: #print "dirname in Exclude_folders" cptdelete = cptdelete + MPDB.RemovePath(dirname) return ####### # STEP 1 : list all files in directory ####### # This conversion is important for windows to get filenames in utf-8 encoding! if type(dirname).__name__ == "str": dirname = unicode(dirname, 'utf-8') try: dirname = smart_unicode(dirname) try: listdir = oslistdir(dirname) except: listdir = oslistdir(dirname.encode('utf-8')) # pretty stupid, but is a must. for index in range(len(listdir)): listdir[index] = smart_unicode(listdir[index]) except: print_exc() MPDB.log( "Error while trying to get directory content" ) listdir=[] ####### # STEP 2 : Keep only the files with extension... ####### for f in listdir: if splitext(f)[1].upper() in listext: listfolderfiles.append(f) #on récupère la liste des fichiers entrées en BDD pour le dossier en cours listDBdir = MPDB.DB_listdir(dirname)# --> une requête pour tout le dossier ####### # STEP 3 : If folder contains pictures, create folder in database ####### #on ajoute dans la table des chemins le chemin en cours PFid = MPDB.DB_folder_insert(basename(dirname) or osdirname(dirname).split(separator)[-1], dirname, parentfolderID, listfolderfiles and "1" or "0"#i ) if listfolderfiles:#si le dossier contient des fichiers jpg... ####### # STEP 4 : browse all pictures ####### #puis on parcours toutes les images du dossier en cours for picfile in listfolderfiles:#... on parcours tous les jpg du dossier extension = splitext(picfile)[1].upper() if extension in vidsext and Addon.getSetting("usevids") == "false":#si une video mais qu'on ne prend pas les vidéos if picfile in listDBdir: listDBdir.pop(listDBdir.index(picfile)) continue #alors on ne fait rien et on reprend la boucle if file_is_accessible(dirname, picfile): cptscanned = cptscanned+1 cpt = cpt + 1 else: MPDB.DB_del_pic(dirname,picfile) cptdelete=cptdelete+1 ###if updatefunc and updatefunc.iscanceled(): return#dialog progress has been canceled #on enlève l'image traitée de listdir if len(listdir) > 0: listdir.pop(listdir.index(picfile)) #print "Pop " #print smart_unicode(picfile).encode('utf-8') if not rescan: #si pas de rescan #les images ne sont pas à scanner de force if picfile in listDBdir: #si l'image est déjà en base #l'image est déjà en base de donnée if updatepics: #si le paramètre est configuré pour mettre à jour les metas d'une photo #Il faut mettre à jour les images... if extension in vidsext: print "Video" DoScan = True update = True straction = __language__(30242)#Updating if file_is_accessible(dirname, picfile): cptchanged = cptchanged + 1 elif not (MPDB.fileSHA(join(dirname,picfile))==MPDB.getFileSha(dirname,picfile)): #si l'image a changé depuis qu'elle est en base print "No Video" #Scan les metas et ajoute l'image avec un paramètre de mise à jour = true DoScan = True update = True straction = __language__(30242)#Updating if file_is_accessible(dirname, picfile): cptchanged = cptchanged + 1 else: DoScan = False straction = __language__(30243)#"Passing" #mais l'image n'a pas changée. Donc on passe else: DoScan = False straction = __language__(30243)#"Passing" #mais on ne met pas à jour les photos. Donc on passe else: DoScan = True update = False straction = __language__(30244)#"Adding" if file_is_accessible(dirname, picfile): comptenew = comptenew + 1 #l'image n'est pas dans la base. On l'ajoute maintenant avec paramètre de mise à jour = false else: DoScan = True update = True straction = __language__(30245)#"Rescan" #on rescan les photos donc on ajoute l'image avec paramètre de mise à jour = true if updatefunc and totalfiles!=0 and cptroots!=0: updatefunc.update(int(100*float(cptscanned)/float(totalfiles)),#cptscanned-(cptscanned/100)*100, #cptscanned/100, int(100*float(iroots)/float(cptroots)), __language__(30000)+"[%s] (%0.2f%%)"%(straction,100*float(cptscanned)/float(totalfiles)),#"MyPicture Database [%s] (%0.2f%%)" picfile) if DoScan and file_is_accessible(dirname, picfile): try: modifiedtime = str(stat(join(dirname,picfile)).st_mtime) except: modifiedtime = str(stat(join(dirname.encode('utf-8'),picfile.encode('utf-8'))).st_mtime) picentry = { "idFolder":PFid, "strPath":dirname, "strFilename":picfile, "UseIt":1, "sha": extension in picsext and str(MPDB.fileSHA(join(dirname,picfile))) or extension in vidsext and "1" , #"DateAdded":dateadded, "DateAdded":strftime("%Y-%m-%d %H:%M:%S"), "mtime":modifiedtime, "ftype": extension in picsext and "picture" or extension in vidsext and "video" or ""} # get the meta tags try: if not extension in vidsext: picentry.update(get_metas(dirname,picfile)) # insert picture into table files try: MPDB.DB_file_insert(dirname,picfile,picentry,update) except MPDB.MyPictureDB: pass except: print_exc() if picfile in listDBdir: listDBdir.pop(listDBdir.index(picfile)) #Now if the database contain some more pictures assign for this folder, we need to delete them if 'update' setting is true if listDBdir :#and updatepics: #à l'issu si listdir contient encore des fichiers, c'est qu'ils sont en base mais que le fichier n'existe plus physiquement. for f in listDBdir: #on parcours les images en DB orphelines cptdelete=cptdelete+1 if updatefunc and totalfiles!=0 and cptroots!=0: updatefunc.update(int(100*float(cptscanned)/float(totalfiles)),#cptscanned-(cptscanned/100)*100, #cptscanned/100, int(100*float(iroots)/float(cptroots)), __language__(30000)+"["+__language__(30246)+"]",#MyPicture Database [Removing] f) MPDB.DB_del_pic(dirname,f) MPDB.log( "\t%s has been deleted from database because the file does not exists in this folder. "%f)#f.decode(sys_enc)) MPDB.log("") else: MPDB.log( "This folder does not contain any picture :") MPDB.log( dirname ) MPDB.log( "" ) if cpt: MPDB.log( "%s new pictures found in %s"%(str(cpt),dirname) ) #unicode(info.data[k].encode("utf8").__str__(),"utf8") compte=compte+cpt cpt=0 if recursive: #gestion de la recursivité. On rappel cette même fonction pour chaque dossier rencontré MPDB.log( "scan the subfolders of :") MPDB.log( dirname ) for item in listdir: try: joineddir = join(dirname,item) except: joineddir = join(dirname.encode('utf-8'),item.encode('utf-8')) joineddir = smart_unicode(joineddir) try: isjoineddir = isdir(joineddir) except: isjoineddir = isdir(joineddir.encode('utf-8')) if isjoineddir :#un directory #browse_folder(dirname,parentfolderID=None,recursive=True,updatepics=False,rescan=False,updatefunc=None) browse_folder(joineddir,PFid,recursive,updatepics,addpics,delpics,rescan,updatefunc,dateadded) else: #listdir contenait un fichier mais pas un dossier # inutilisé... on passe pour le moment pass