def apply_exif(self, item_id, key_value_dict): result = self.controllers[Database].db[Item.COLLECTION].find_one( {'_id': item_id} ) file_id = result[Item.FILE_ID] file_obj = self.controllers[Database].fs.get(file_id) temp_file_obj = tempfile.NamedTemporaryFile(delete=False) shutil.copyfileobj(file_obj, temp_file_obj) temp_file_obj.close() metadata = pyexiv2.metadata.ImageMetadata(temp_file_obj.name) metadata.read() for k, v in key_value_dict.iteritems(): metadata[k] = v metadata.write() dest_file_obj = self.controllers[Database].fs.new_file() dest_file_obj.filename = file_obj.filename dest_file_obj.content_type = file_obj.content_type shutil.copyfileobj(open(temp_file_obj.name, 'rb'), dest_file_obj) dest_file_obj.close() self.controllers[Database].db[Item.COLLECTION].update( {'_id': item_id}, {'$set': {Item.FILE_ID: dest_file_obj._id}} ) self.controllers[Database].fs.delete(file_id) os.remove(temp_file_obj.name)
def test_write_dont_preserve_timestamps(self): stat = os.stat(self.pathname) atime = round(stat.st_atime) mtime = round(stat.st_mtime) metadata = ImageMetadata(self.pathname) metadata.read() metadata.comment = 'Yellow Submarine' time.sleep(1.1) metadata.write() stat2 = os.stat(self.pathname) atime2 = round(stat2.st_atime) mtime2 = round(stat2.st_mtime) # It is not safe to assume that atime will have been modified when the # file has been read, as it may depend on mount options (e.g. noatime, # relatime). # See discussion at http://bugs.launchpad.net/pyexiv2/+bug/624999. #self.failIfEqual(atime2, atime) self.failIfEqual(mtime2, mtime) metadata.comment = 'Yesterday' time.sleep(1.1) metadata.write(preserve_timestamps=True) stat3 = os.stat(self.pathname) atime3 = round(stat3.st_atime) mtime3 = round(stat3.st_mtime) self.failUnlessEqual(atime3, atime2) self.failUnlessEqual(mtime3, mtime2)
def test_write_preserve_timestamps(self): stat = os.stat(self.pathname) atime = round(stat.st_atime) mtime = round(stat.st_mtime) metadata = ImageMetadata(self.pathname) metadata.read() metadata.comment = 'Yellow Submarine' time.sleep(1.1) metadata.write(preserve_timestamps=True) stat2 = os.stat(self.pathname) atime2 = round(stat2.st_atime) mtime2 = round(stat2.st_mtime) self.failUnlessEqual(atime2, atime) self.failUnlessEqual(mtime2, mtime)
def get(self, str_id): obj_id = bson.objectid.ObjectId(str_id) result = self.controllers[Database].db[Item.COLLECTION].find_one( {'_id': obj_id}) file_obj = self.controllers[Database].fs.get(result[Item.FILE_ID]) temp_file = tempfile.NamedTemporaryFile(delete=False) shutil.copyfileobj(file_obj, temp_file) temp_file.close() metadata = pyexiv2.metadata.ImageMetadata(temp_file.name) metadata.read() details = [] for k in sorted(metadata.exif_keys + metadata.iptc_keys + metadata.xmp_keys): try: v = unicode(metadata[k].value) except Exception, e: v = unicode(e) details.append([k, v])