| 
									
										
										
										
											2012-03-10 19:16:07 +04:00
										 |  |  | #======================================================================= | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __version__ = '''0.0.01''' | 
					
						
							| 
									
										
										
										
											2012-03-20 01:39:22 +04:00
										 |  |  | __sub_version__ = '''20120317005456''' | 
					
						
							| 
									
										
										
										
											2012-03-10 19:16:07 +04:00
										 |  |  | __copyright__ = '''(c) Alex A. Naanou 2011''' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #----------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							| 
									
										
										
										
											2012-03-13 18:36:53 +04:00
										 |  |  | import sha | 
					
						
							|  |  |  | import md5 | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | import time | 
					
						
							| 
									
										
										
										
											2012-03-10 19:16:07 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | import pyexiv2 as metadata | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #----------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # XXX need a strategy to check if two files that have the same GID are | 
					
						
							|  |  |  | # 	  identical, and if so, need to destinguish them in the GID... | 
					
						
							|  |  |  | # 	  might be a good idea to add a file hash | 
					
						
							|  |  |  | # XXX not yet sure if this is unique enough to avoid conflicts if one | 
					
						
							|  |  |  | # 	  photographer has enough cameras... | 
					
						
							|  |  |  | # XXX also might be wise to add a photographer ID into here... | 
					
						
							| 
									
										
										
										
											2012-03-20 01:39:22 +04:00
										 |  |  | ##!!! add gid info section to identify the options used to greate a gid, e.g. EXIF date vs. ctime, etc. | 
					
						
							|  |  |  | ##!!! do a general revision and remove leacy... | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | def image_gid(path, date=None,  | 
					
						
							|  |  |  | 		format='%(artist)s-%(date)s-%(name)s',  | 
					
						
							| 
									
										
										
										
											2012-03-13 22:48:46 +04:00
										 |  |  | 		date_format='%Y%m%d-%H%M%S',  | 
					
						
							|  |  |  | 		default_artist='Unknown', | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | 		use_ctime=False, | 
					
						
							| 
									
										
										
										
											2012-03-13 22:48:46 +04:00
										 |  |  | 		hash_func=sha.sha): | 
					
						
							| 
									
										
										
										
											2012-03-10 19:16:07 +04:00
										 |  |  | 	'''
 | 
					
						
							|  |  |  | 	Calgulate image GID. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Main gid criteria: | 
					
						
							|  |  |  | 	 	- unique | 
					
						
							|  |  |  | 	 	- calculable from the item (preferably any sub-item) | 
					
						
							|  |  |  | 	 	- human-readable | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Default format: | 
					
						
							|  |  |  | 		<artist>-<datetime>-<filename> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Example: | 
					
						
							|  |  |  | 		Alex_A.Naanou-20110627-195706-DSC_1234	 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-13 18:36:53 +04:00
										 |  |  | 	If hash_func is not None, then the function will be used to henerate  | 
					
						
							|  |  |  | 	a hex hash from the above string. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-10 19:16:07 +04:00
										 |  |  | 	Supported fields: | 
					
						
							| 
									
										
										
										
											2012-03-13 18:36:53 +04:00
										 |  |  | 		%(artist)s	- Exif.Image.Artist field, stripped and spaces replaced | 
					
						
							|  |  |  | 					  with underscores. | 
					
						
							| 
									
										
										
										
											2012-03-10 19:16:07 +04:00
										 |  |  | 		%(date)s	- Exif.Image.DateTime formated to date_format argument. | 
					
						
							|  |  |  | 		%(name)s	- file name. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	NOTE: date and time are the date and time the image was made ('Exif.Image.DateTime') | 
					
						
							|  |  |  | 	NOTE: need EXIF data to generate a GID | 
					
						
							|  |  |  | 	'''
 | 
					
						
							|  |  |  | 	# get the filename... | 
					
						
							|  |  |  | 	data = { | 
					
						
							|  |  |  | 		'name': os.path.splitext(os.path.split(path)[-1])[0], | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-03-13 22:48:46 +04:00
										 |  |  | 	##!!! this might fail... | 
					
						
							|  |  |  | 	i = metadata.ImageMetadata('%s' % path) | 
					
						
							| 
									
										
										
										
											2012-03-17 00:44:04 +04:00
										 |  |  | 	try: | 
					
						
							|  |  |  | 		i.read() | 
					
						
							|  |  |  | 	except IOError: | 
					
						
							|  |  |  | 		# can't read exif... | 
					
						
							|  |  |  | 		i = None | 
					
						
							| 
									
										
										
										
											2012-03-10 19:16:07 +04:00
										 |  |  | 	# check if we need a date in the id... | 
					
						
							|  |  |  | 	if '%(date)s' in format: | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | 		if date is not None: | 
					
						
							|  |  |  | 			data['date'] = time.strftime(date_format, time.gmtime(date)) | 
					
						
							| 
									
										
										
										
											2012-03-17 00:44:04 +04:00
										 |  |  | 		elif use_ctime or i is None: | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | 			date = os.path.getctime(path) | 
					
						
							|  |  |  | 			data['date'] = time.strftime(date_format, time.gmtime(date)) | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			date = i['Exif.Image.DateTime'].value | 
					
						
							|  |  |  | 			data['date'] = date.strftime(date_format) | 
					
						
							| 
									
										
										
										
											2012-03-10 19:16:07 +04:00
										 |  |  | 	# check if we need an artist... | 
					
						
							|  |  |  | 	if '%(artist)s' in format: | 
					
						
							| 
									
										
										
										
											2012-03-17 00:44:04 +04:00
										 |  |  | 		data['artist'] = default_artist | 
					
						
							|  |  |  | 		if i is not None: | 
					
						
							|  |  |  | 			try: | 
					
						
							|  |  |  | 				data['artist'] = i['Exif.Image.Artist'].value.strip().replace(' ', '_') | 
					
						
							|  |  |  | 			except KeyError: | 
					
						
							|  |  |  | 				pass | 
					
						
							| 
									
										
										
										
											2012-03-10 19:16:07 +04:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-13 18:36:53 +04:00
										 |  |  | 	if hash_func is not None: | 
					
						
							|  |  |  | 		return hash_func(format % data).hexdigest() | 
					
						
							| 
									
										
										
										
											2012-03-10 19:16:07 +04:00
										 |  |  | 	return format % data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-13 18:36:53 +04:00
										 |  |  | #----------------------------------------------------------------------- | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  | 	pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-10 19:16:07 +04:00
										 |  |  | #======================================================================= | 
					
						
							|  |  |  | #                                            vim:set ts=4 sw=4 nowrap : |