| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | #======================================================================= | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __version__ = '''0.0.01''' | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | __sub_version__ = '''20120315151711''' | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | __copyright__ = '''(c) Alex A. Naanou 2011''' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #----------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import json | 
					
						
							| 
									
										
										
										
											2011-12-06 22:03:01 +04:00
										 |  |  | import zipfile | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | import uuid | 
					
						
							| 
									
										
										
										
											2012-03-13 18:36:53 +04:00
										 |  |  | from pprint import pprint | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | from itertools import izip, izip_longest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from pli.logictypes import ANY, OR | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-13 18:36:53 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | import store | 
					
						
							| 
									
										
										
										
											2011-11-10 19:17:38 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | #----------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | CONFIG_NAME = 'test_config.json' | 
					
						
							| 
									
										
										
										
											2011-11-11 01:41:56 +04:00
										 |  |  | ##CONFIG_NAME = 'tmp_config.json' | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | config = json.load(open(CONFIG_NAME)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | RAW = OR( | 
					
						
							|  |  |  | 	'NEF', 'nef',  | 
					
						
							|  |  |  | 	'CRW', 'crw', | 
					
						
							|  |  |  | 	'CR2', 'cr2', | 
					
						
							|  |  |  | 	'X3F', 'x3f' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | JPEG = OR( | 
					
						
							|  |  |  | 	'JPG', 'jpg',  | 
					
						
							|  |  |  | 	'JPEG', 'jpeg' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PSD = OR( | 
					
						
							|  |  |  | 	'PSD', 'psd' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TIFF = OR( | 
					
						
							|  |  |  | 	'TIFF', 'tiff',  | 
					
						
							|  |  |  | 	'TIF', 'tif' | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | XMP = OR( | 
					
						
							|  |  |  | 	'XMP', 'xmp' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ITEM = OR(RAW, JPEG, PSD, TIFF, XMP) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TYPES = { | 
					
						
							|  |  |  | 	'raw': RAW, | 
					
						
							|  |  |  | 	'jpeg': JPEG, | 
					
						
							|  |  |  | 	'psd': PSD, | 
					
						
							|  |  |  | 	'tiff': TIFF, | 
					
						
							|  |  |  | 	'xmp': XMP, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | SUBTREE_CLASSES = { | 
					
						
							|  |  |  | 	'preview': 'preview',  | 
					
						
							|  |  |  | 	'preview (RAW)': 'RAW preview',  | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #----------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | ##!!! we will need to normalize the paths to one single scheme (either relative or absolute)... | 
					
						
							|  |  |  | def list_files(root, sub_trees=SUBTREE_CLASSES, type=ITEM): | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | 	'''
 | 
					
						
							|  |  |  | 	'''
 | 
					
						
							|  |  |  | 	for path, dirs, files in os.walk(root): | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 		path = path.split(os.path.sep) | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | 		# process files... | 
					
						
							|  |  |  | 		for f in files: | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 			name, ext = os.path.splitext(f) | 
					
						
							|  |  |  | 			# we need the extension wothout the dot... | 
					
						
							|  |  |  | 			ext = ext[1:] | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | 			# filter by ext... | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 			if ext == type: | 
					
						
							|  |  |  | 				yield path, name, ext | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # XXX need to split duplicate named raw files and corresponding | 
					
						
							|  |  |  | # 	  previews... | 
					
						
							|  |  |  | def index_by_name(file_list, types=TYPES.items()): | 
					
						
							|  |  |  | 	'''
 | 
					
						
							|  |  |  | 	format: | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			<name>: { | 
					
						
							| 
									
										
										
										
											2011-11-10 19:38:43 +04:00
										 |  |  | 				<type>: [ | 
					
						
							| 
									
										
										
										
											2011-11-10 20:04:34 +04:00
										 |  |  | 					(<path>, <orig-ext>), | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 					... | 
					
						
							|  |  |  | 				], | 
					
						
							|  |  |  | 				... | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			... | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	'''
 | 
					
						
							|  |  |  | 	res = {} | 
					
						
							|  |  |  | 	for path, name, ext in file_list: | 
					
						
							|  |  |  | 		# normalize extension... | 
					
						
							| 
									
										
										
										
											2011-11-10 19:38:43 +04:00
										 |  |  | 		orig_ext, ext = ext, types[types.index((ANY, ext))][0] | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 		if name not in res: | 
					
						
							|  |  |  | 			# create a name... | 
					
						
							|  |  |  | 			res[name] = {} | 
					
						
							|  |  |  | 		if ext not in res[name]: | 
					
						
							|  |  |  | 			# create an extension... | 
					
						
							|  |  |  | 			res[name][ext] = [] | 
					
						
							|  |  |  | 		# general case... | 
					
						
							| 
									
										
										
										
											2011-11-10 19:38:43 +04:00
										 |  |  | 		res[name][ext] += [(path, orig_ext)] | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 	return res | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # for this to work correctly it must: | 
					
						
							|  |  |  | # 	- return unique paths | 
					
						
							|  |  |  | # 	- non of the returnd paths can be a strict subset of any other... | 
					
						
							|  |  |  | ##!!! | 
					
						
							|  |  |  | def split_common(paths): | 
					
						
							|  |  |  | 	'''
 | 
					
						
							| 
									
										
										
										
											2011-11-10 19:52:34 +04:00
										 |  |  | 	build a common path tree... | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 	'''
 | 
					
						
							|  |  |  | 	# pass 1: build list of common paths (None for all differences) | 
					
						
							|  |  |  | 	# NOTE: we may have stray common path elements but we do | 
					
						
							|  |  |  | 	# 		not care abut anything after a None... | 
					
						
							|  |  |  | 	index = izip_longest(*paths) | 
					
						
							|  |  |  | 	common = [] | 
					
						
							|  |  |  | 	for s in index: | 
					
						
							|  |  |  | 		next = [] | 
					
						
							|  |  |  | 		for i in s: | 
					
						
							|  |  |  | 			if s.count(i) > 1: | 
					
						
							|  |  |  | 				next += [i] | 
					
						
							|  |  |  | 			else: | 
					
						
							|  |  |  | 				next += [None] | 
					
						
							|  |  |  | 		common += [next] | 
					
						
							|  |  |  | 	# pass 2: cap each common section with a unique element... | 
					
						
							|  |  |  | 	common = [ list(e) for e in izip(*common)] | 
					
						
							|  |  |  | 	for c, p in izip(common, paths): | 
					
						
							|  |  |  | 		if None in c: | 
					
						
							|  |  |  | 			i = c.index(None) | 
					
						
							|  |  |  | 			if len(p) <= i: | 
					
						
							|  |  |  | 				# NOTE: this is the case when we have a None  | 
					
						
							|  |  |  | 				# 		because a path just ended... i.e. there  | 
					
						
							|  |  |  | 				# 		was no different element to split at... | 
					
						
							|  |  |  | 				# XXX do we need to break here? | 
					
						
							|  |  |  | 				# XXX one way to go here is to simply ignore | 
					
						
							|  |  |  | 				# 	  such paths... | 
					
						
							| 
									
										
										
										
											2011-11-10 19:02:26 +04:00
										 |  |  | 				del c[i] | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 				continue | 
					
						
							|  |  |  | 			# in-place update and truncate the common path... | 
					
						
							|  |  |  | 			c[i] = p[i] | 
					
						
							|  |  |  | 			del c[i+1:] | 
					
						
							|  |  |  | 	return common | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # in essance this need to replace image name with a GID and split up | 
					
						
							|  |  |  | # images that are identically named into seporate GIDs... | 
					
						
							|  |  |  | def split_images(index): | 
					
						
							|  |  |  | 	'''
 | 
					
						
							| 
									
										
										
										
											2011-11-10 19:47:45 +04:00
										 |  |  | 	This will split groups that contain multiple raw files. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Groups are split to contain one raw each. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-04 21:40:13 +04:00
										 |  |  | 	Each image will be grouped to the raw that contains the largest  | 
					
						
							| 
									
										
										
										
											2011-11-10 19:47:45 +04:00
										 |  |  | 	matching sub-path, starting from root. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Resulting groups will have a gid as it's key | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	This will fail for any files that live in a common sub-path of any | 
					
						
							|  |  |  | 	two or more raw files. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	NOTE: in the case there are two raw files in one path, then we will  | 
					
						
							|  |  |  | 		  favor the deeper / longer mathch. | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 	'''
 | 
					
						
							|  |  |  | 	for name, data in index.items(): | 
					
						
							|  |  |  | 		# this will not let us lose the name of the image... | 
					
						
							|  |  |  | 		data['name'] = name | 
					
						
							| 
									
										
										
										
											2011-11-11 01:41:56 +04:00
										 |  |  | 		raw = data.get('raw', []) | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 		if len(raw) > 1: | 
					
						
							| 
									
										
										
										
											2011-11-10 19:38:43 +04:00
										 |  |  | 			common = split_common([r for r, e in raw]) | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 			# prepare the return structure... | 
					
						
							|  |  |  | 			res = [] | 
					
						
							|  |  |  | 			for path in raw: | 
					
						
							|  |  |  | 				res += [{ | 
					
						
							| 
									
										
										
										
											2011-11-10 19:50:58 +04:00
										 |  |  | 					'gid': str(uuid.uuid4()), | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 					'name': name, | 
					
						
							| 
									
										
										
										
											2011-11-10 19:17:38 +04:00
										 |  |  | 					'raw': [path], | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 				}] | 
					
						
							|  |  |  | 			# start splitting the data... | 
					
						
							| 
									
										
										
										
											2011-11-10 19:38:43 +04:00
										 |  |  | 			for t, paths in data.items(): | 
					
						
							| 
									
										
										
										
											2011-11-10 19:02:26 +04:00
										 |  |  | 				# skip non-type fields... | 
					
						
							| 
									
										
										
										
											2011-11-10 19:38:43 +04:00
										 |  |  | 				if t not in TYPES: | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 					continue | 
					
						
							| 
									
										
										
										
											2011-11-10 19:38:43 +04:00
										 |  |  | 				if t == 'raw': | 
					
						
							| 
									
										
										
										
											2011-11-10 19:17:38 +04:00
										 |  |  | 					continue | 
					
						
							|  |  |  | 				# start the work... | 
					
						
							| 
									
										
										
										
											2011-11-10 19:38:43 +04:00
										 |  |  | 				for path, ext in paths: | 
					
						
							| 
									
										
										
										
											2011-11-10 19:02:26 +04:00
										 |  |  | 					matches = [] | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 					for i, c in enumerate(common): | 
					
						
							| 
									
										
										
										
											2011-11-10 19:17:38 +04:00
										 |  |  | 						# use matching path head to match targets... | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 						if path[:len(c)] == c: | 
					
						
							| 
									
										
										
										
											2011-11-10 19:02:26 +04:00
										 |  |  | 							matches += [(len(c), i)] | 
					
						
							|  |  |  | 					# multiple matches... | 
					
						
							|  |  |  | 					if len(matches) > 1: | 
					
						
							| 
									
										
										
										
											2011-11-10 19:38:43 +04:00
										 |  |  | 						# longest match wins... | 
					
						
							| 
									
										
										
										
											2011-11-10 19:02:26 +04:00
										 |  |  | 						matches.sort(key=lambda e: e[0]) | 
					
						
							|  |  |  | 						if matches[0][0] == matches[1][0]: | 
					
						
							|  |  |  | 							# XXX we could try and use a different | 
					
						
							|  |  |  | 							# 	  strategy... | 
					
						
							|  |  |  | 							##!!! do a better error... | 
					
						
							|  |  |  | 							raise Exception, 'got two targets with same score, can\'t decide where to put the file.' | 
					
						
							|  |  |  | 						del matches[1:] | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 					if len(matches) == 1: | 
					
						
							| 
									
										
										
										
											2011-11-10 19:02:26 +04:00
										 |  |  | 						i = matches[0][1] | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 						# we found a location... | 
					
						
							| 
									
										
										
										
											2011-11-10 19:38:43 +04:00
										 |  |  | 						if t not in res[i]: | 
					
						
							|  |  |  | 							res[i][t] = [] | 
					
						
							|  |  |  | 						res[i][t] += [(path, ext)] | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 					else: | 
					
						
							| 
									
										
										
										
											2011-11-11 01:51:56 +04:00
										 |  |  | 						##!!! we sometimes fall into here for odd reasons (use tmp_config.json) | 
					
						
							| 
									
										
										
										
											2011-11-11 01:41:56 +04:00
										 |  |  | 						# output orphan/ungrouped images... | 
					
						
							|  |  |  | 						# NOTE: these images can be located in a | 
					
						
							|  |  |  | 						# 		different place or are orgonized in a | 
					
						
							|  |  |  | 						# 		different way... | 
					
						
							| 
									
										
										
										
											2011-11-12 02:02:29 +04:00
										 |  |  | 						print '%%%%%%', path, name, ext | 
					
						
							| 
									
										
										
										
											2011-11-11 01:41:56 +04:00
										 |  |  | 						gid = str(uuid.uuid4()) | 
					
						
							|  |  |  | 						yield gid, { | 
					
						
							|  |  |  | 							'gid': gid, | 
					
						
							|  |  |  | 							'name': name, | 
					
						
							|  |  |  | 							t: [(path, ext)], | 
					
						
							|  |  |  | 						}  | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			# yield the results... | 
					
						
							|  |  |  | 			for e in res: | 
					
						
							| 
									
										
										
										
											2011-11-10 19:17:38 +04:00
										 |  |  | 				yield e['gid'], e | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 		else: | 
					
						
							| 
									
										
										
										
											2011-11-10 19:50:58 +04:00
										 |  |  | 			gid = data['gid'] = str(uuid.uuid4()) | 
					
						
							| 
									
										
										
										
											2011-11-10 19:47:45 +04:00
										 |  |  | 			yield gid, data | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-31 03:07:34 +04:00
										 |  |  | #----------------------------------------------------------------------- | 
					
						
							|  |  |  | ##!!! test implementation: rewrite... | 
					
						
							| 
									
										
										
										
											2012-02-02 15:04:06 +04:00
										 |  |  | import pyexiv2 as metadata | 
					
						
							|  |  |  | import shutil | 
					
						
							|  |  |  | import Image | 
					
						
							| 
									
										
										
										
											2012-01-31 03:07:34 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-02 15:04:06 +04:00
										 |  |  | def build_image_cache(ic, min_rating, dest, tmp_path, preview_size=900): | 
					
						
							| 
									
										
										
										
											2012-01-31 03:07:34 +04:00
										 |  |  | 	# build preview cache for 5* images... | 
					
						
							|  |  |  | 	for k, e in ic.items(): | 
					
						
							|  |  |  | 		name = e.get('name', None) | 
					
						
							|  |  |  | 		xmps = e.get('xmp', None) | 
					
						
							|  |  |  | 		jpegs = e.get('jpeg', None) | 
					
						
							|  |  |  | 		raws = e.get('raw', None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		##!!! get tmp dir... | 
					
						
							|  |  |  | 		##!!! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		res = { | 
					
						
							|  |  |  | 			'missing preview': [], | 
					
						
							|  |  |  | 			'missing raw': [], | 
					
						
							|  |  |  | 			'unrated': [], | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if xmps is not None: | 
					
						
							|  |  |  | 			##!!! avoid manual path forming.... | 
					
						
							|  |  |  | 			xmp_path = xmps[0][0][0] + '\\' + os.path.join(*(xmps[0][0][1:] + [name])) + '.' + xmps[0][1] | 
					
						
							|  |  |  | 			# get rating... | 
					
						
							|  |  |  | 			im = metadata.ImageMetadata(xmp_path) | 
					
						
							|  |  |  | 			im.read() | 
					
						
							|  |  |  | 			rating = im['Xmp.xmp.Rating'].value | 
					
						
							|  |  |  | 			##!!! cache the rating... | 
					
						
							|  |  |  | 			e['Rating'] = rating | 
					
						
							|  |  |  | 			ic[k] = e | 
					
						
							|  |  |  | 			if rating >= min_rating: | 
					
						
							|  |  |  | 				# get the jpeg... | 
					
						
							|  |  |  | 				if jpegs is None: | 
					
						
							|  |  |  | 					if raws is None: | 
					
						
							| 
									
										
										
										
											2012-02-02 15:04:06 +04:00
										 |  |  | ##						print '### can\'t find raws for %s' % name | 
					
						
							| 
									
										
										
										
											2012-01-31 03:07:34 +04:00
										 |  |  | 						res['missing raw'] += [k] | 
					
						
							|  |  |  | 						continue | 
					
						
							|  |  |  | 					raw_path = raws[0][0][0] + '\\' + os.path.join(*(raws[0][0][1:] + [name])) + '.' + raws[0][1] | 
					
						
							| 
									
										
										
										
											2012-02-02 15:04:06 +04:00
										 |  |  | ##					print '>> missing preview %s.jpg' % name | 
					
						
							| 
									
										
										
										
											2012-01-31 03:07:34 +04:00
										 |  |  | 					res['missing preview'] += [raw_path] | 
					
						
							|  |  |  | 					##!!! generate jpegs... | 
					
						
							| 
									
										
										
										
											2012-02-02 15:04:06 +04:00
										 |  |  | 					raw = metadata.ImageMetadata(raw_path) | 
					
						
							|  |  |  | 					raw.read() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					for i, p in enumerate(raw.previews): | 
					
						
							|  |  |  | 						if max(p.dimensions) >= preview_size: | 
					
						
							|  |  |  | 							# extract preview... | 
					
						
							|  |  |  | 							tmp_preview_path = os.path.join(tmp_path, '%s-%s%s' % (name, i, p.extension)) | 
					
						
							|  |  |  | 							open(tmp_preview_path, 'wb').write(p.data) | 
					
						
							|  |  |  | 							# resize preview... | 
					
						
							|  |  |  | 							orig = Image.open(tmp_preview_path) | 
					
						
							|  |  |  | 							scale = preview_size/float(max(*orig.size)) | 
					
						
							|  |  |  | 							print 'generating preview...' | 
					
						
							|  |  |  | 							preview = orig.resize((int(orig.size[0]*scale), int(orig.size[1]*scale)), Image.ANTIALIAS) | 
					
						
							|  |  |  | 							# save preview... | 
					
						
							|  |  |  | 							print 'saving preview: %s' % name | 
					
						
							|  |  |  | 							preview_path = os.path.join(dest, k + '-' + name + '.jpg') | 
					
						
							|  |  |  | 							preview.save(preview_path) | 
					
						
							|  |  |  | 							# copy metadata... | 
					
						
							|  |  |  | 							##!!! need to write metadata to all previews... | 
					
						
							|  |  |  | 							preview_metadata = metadata.ImageMetadata(preview_path) | 
					
						
							|  |  |  | 							preview_metadata.read() | 
					
						
							|  |  |  | 							raw.copy(preview_metadata) | 
					
						
							|  |  |  | 							preview_metadata.write() | 
					
						
							| 
									
										
										
										
											2012-02-02 19:46:34 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 							# remove temporary files... | 
					
						
							|  |  |  | 							##!!! triple-check... | 
					
						
							|  |  |  | 							try: | 
					
						
							|  |  |  | 								os.remove(tmp_preview_path) | 
					
						
							|  |  |  | 							except: | 
					
						
							|  |  |  | 								pass | 
					
						
							| 
									
										
										
										
											2012-01-31 03:07:34 +04:00
										 |  |  | 				else: | 
					
						
							|  |  |  | 					jpg_path = jpegs[0][0][0] + '\\' + os.path.join(*(jpegs[0][0][1:] + [name])) + '.' + jpegs[0][1] | 
					
						
							|  |  |  | 					# copy the jpeg to the cache... | 
					
						
							|  |  |  | 					print '>>> copy: %s.jpg' % name | 
					
						
							|  |  |  | 					##!!! HACK: manual name generation... | 
					
						
							|  |  |  | 					##!!! use a good id, like a timestamp... | 
					
						
							|  |  |  | 					shutil.copy2(jpg_path, os.path.join(dest, k + '-' + name + '.jpg')) | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			##!!! need to detect unrated shoots... | 
					
						
							|  |  |  | ##			print '>> no XMP' | 
					
						
							|  |  |  | 			res['unrated'] += [k] | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ic.cache_flush() | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | 	store.pack(ic._path, keep_files=False) | 
					
						
							| 
									
										
										
										
											2012-01-31 03:07:34 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return res | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | #----------------------------------------------------------------------- | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  | 	lst = list(list_files(config['ARCHIVE_ROOT'])) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	print len(lst) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-10 18:43:46 +04:00
										 |  |  | 	index = index_by_name(list_files(config['ARCHIVE_ROOT'])) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	print len(index) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	index = list(split_images(index_by_name(list_files(config['ARCHIVE_ROOT'])))) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-06 22:03:01 +04:00
										 |  |  | 	l = len(index) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	index = dict(index) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	print l, len(index) | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-10 19:50:58 +04:00
										 |  |  | 	json.dump(index, file(os.path.join('test', 'filelist.json'), 'w')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | 	root_index = store.dump(index, os.path.join('test', 'index'), index_depth=1) | 
					
						
							| 
									
										
										
										
											2011-12-07 03:25:38 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-08 16:35:31 +04:00
										 |  |  | ##	##!!! this is not used in anything yet... | 
					
						
							|  |  |  | ##	json.dump(root_index, file(os.path.join('test', 'index', 'file_index.json'), 'w')) | 
					
						
							| 
									
										
										
										
											2011-12-06 22:03:01 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | 	store.pack(os.path.join('test', 'index'), keep_files=False) | 
					
						
							| 
									
										
										
										
											2011-12-06 22:03:01 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | 	d = store.load(os.path.join('test', 'index')) | 
					
						
							| 
									
										
										
										
											2011-12-06 22:03:01 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-07 03:25:38 +04:00
										 |  |  | 	print len(d) | 
					
						
							| 
									
										
										
										
											2011-12-06 22:03:01 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-07 03:25:38 +04:00
										 |  |  | 	k = d.keys()[0] | 
					
						
							| 
									
										
										
										
											2011-12-06 22:03:01 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-13 18:36:53 +04:00
										 |  |  | 	i = store.Index(os.path.join('test', 'index')) | 
					
						
							| 
									
										
										
										
											2011-12-07 03:25:38 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	print len(i) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-08 16:35:31 +04:00
										 |  |  | ##	print i[k] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-13 18:36:53 +04:00
										 |  |  | 	ic = store.IndexWithCache(os.path.join('test', 'index')) | 
					
						
							| 
									
										
										
										
											2011-12-08 16:35:31 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	print ic[k] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ic['000000000000000000000000000000000'] = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ic.cache_flush() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | 	store.pack(ic._path, keep_files=False) | 
					
						
							| 
									
										
										
										
											2011-12-07 03:25:38 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-08 16:46:30 +04:00
										 |  |  | 	ic.__sync__ = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ic['111111111111111111111111111111111'] = {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | 	store.pack(ic._path, keep_files=False) | 
					
						
							| 
									
										
										
										
											2011-12-08 16:46:30 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-31 03:07:34 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	##!!! revise... | 
					
						
							| 
									
										
										
										
											2012-02-02 15:04:06 +04:00
										 |  |  | 	res = build_image_cache(ic, 5, os.path.join('test', 'index', 'cache'), os.path.join('test', 'tmp')) | 
					
						
							| 
									
										
										
										
											2012-01-31 03:07:34 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-07 03:25:38 +04:00
										 |  |  | 	os.remove(os.path.join('test', 'index', 'index.pack')) | 
					
						
							| 
									
										
										
										
											2011-12-06 22:03:01 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-13 18:30:24 +04:00
										 |  |  | 	TEST_20K_ITEMS = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if TEST_20K_ITEMS: | 
					
						
							|  |  |  | 		print 'doing a 20k test...' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		print 'loading...' | 
					
						
							|  |  |  | 		full = dict(json.load(file(os.path.join('test', 'filelist of 20k files.json')))) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		print 'writing files...' | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | 		root_index = store.dump(full, os.path.join('test', 'index'), index_depth=1) | 
					
						
							| 
									
										
										
										
											2011-12-13 18:30:24 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		print 'packing files...' | 
					
						
							|  |  |  | 		# NOTE: the initial archiving seems REALLY SLOW, but working with | 
					
						
							|  |  |  | 		# 		small numbers of files from the archive seems adequate... | 
					
						
							| 
									
										
										
										
											2012-03-15 15:25:03 +04:00
										 |  |  | 		store.pack(os.path.join('test', 'index'), keep_files=True) | 
					
						
							| 
									
										
										
										
											2011-12-13 18:30:24 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-06 22:03:01 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-31 03:07:34 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-03 01:11:10 +03:00
										 |  |  | #======================================================================= | 
					
						
							|  |  |  | #                                            vim:set ts=4 sw=4 nowrap : |