Added batch media tool to sync directories of images with Gramps media database files

svn: r16273
This commit is contained in:
Doug Blank 2010-12-12 18:15:24 +00:00
parent 40cdf569e6
commit 84c07b3f56

View File

@ -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
#------------------------------------------------------------------------
#
#