示例#1
0
	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)
示例#2
0
 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)
示例#3
0
 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)
示例#4
0
	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])