From 84c07b3f5649e0374047e95d9cc462005aeb7b47 Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Sun, 12 Dec 2010 18:15:24 +0000 Subject: [PATCH] Added batch media tool to sync directories of images with Gramps media database files svn: r16273 --- src/plugins/tool/MediaManager.py | 68 ++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/plugins/tool/MediaManager.py b/src/plugins/tool/MediaManager.py index b672f8ed7..9a1bc57f3 100644 --- a/src/plugins/tool/MediaManager.py +++ b/src/plugins/tool/MediaManager.py @@ -57,6 +57,7 @@ from gen.updatecallback import UpdateCallback from gui.plug import tool from Utils import media_path_full, relative_path, media_path from gen.ggettext import sgettext as _ +import gen.mime #------------------------------------------------------------------------- # @@ -170,6 +171,7 @@ class MediaMan(tool.Tool): PathChange, Convert2Abs, Convert2Rel, + ImagesNotIncluded, ] for batch_class in batches_to_use: @@ -556,6 +558,72 @@ class Convert2Rel(BatchOp): self.update() return True +#------------------------------------------------------------------------ +#An op to look for images that may have been forgotten. +#------------------------------------------------------------------------ +class ImagesNotIncluded(BatchOp): + title = _('Add images not included in database') + description = _("Check directories for images not included in database") + description = _("This tool adds images in directories that are " + "referenced by existing images in the database.") + + def _prepare(self): + """ + Get all of the fullpaths, and the directories of media + objects in the database. + """ + self.dir_list = set() + self.set_total(self.db.get_number_of_media_objects()) + with self.db.get_media_cursor() as cursor: + for handle, data in cursor: + obj = MediaObject() + obj.unserialize(data) + self.handle_list.append(handle) + full_path = media_path_full(self.db, obj.path) + self.path_list.append(full_path) + directory, filename = os.path.split(full_path) + if directory not in self.dir_list: + self.dir_list.add(directory) + self.update() + self.reset() + + def build_path_list(self): + """ + This method returns a list of the path names that would be + affected by the batch op. Typically it would rely on prepare() + to do the actual job, but it does not have to be that way. + """ + self.prepare() + return self.dir_list + + def _run(self): + """ + Go through directories that are mentioned in the database via + media files, and include all images that are not all ready + included. + """ + if not self.prepared: + self.prepare() + self.set_total(len(self.dir_list)) + for directory in self.dir_list: + for (dirpath, dirnames, filenames) in os.walk(directory): + if ".svn" in dirnames: + dirnames.remove('.svn') # don't visit .svn directories + for filename in filenames: + media_full_path = os.path.join(dirpath, filename) + if media_full_path not in self.path_list: + self.path_list.append(media_full_path) + mime_type = gen.mime.get_type(media_full_path) + if gen.mime.is_image_type(mime_type): + obj = MediaObject() + obj.set_path(media_full_path) + obj.set_mime_type(mime_type) + (root, ext) = os.path.splitext(filename) + obj.set_description(root) + self.db.add_object(obj, self.trans) + self.update() + return True + #------------------------------------------------------------------------ # #