mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-11-04 05:10:07 +00:00 
			
		
		
		
	started a different, simpler implementation of index.py (merge when done)
This commit is contained in:
		
							parent
							
								
									b01f748df4
								
							
						
					
					
						commit
						2d6521646a
					
				
							
								
								
									
										190
									
								
								index2.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										190
									
								
								index2.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,190 @@
 | 
				
			|||||||
 | 
					#=======================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__version__ = '''0.0.01'''
 | 
				
			||||||
 | 
					__sub_version__ = '''20120229165907'''
 | 
				
			||||||
 | 
					__copyright__ = '''(c) Alex A. Naanou 2011'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#-----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# The first index.py might be a little too complicated. try and resolve
 | 
				
			||||||
 | 
					# this as so:
 | 
				
			||||||
 | 
					# 	- list all relevant files (RAW, XMP, JPG, PSD, ...)
 | 
				
			||||||
 | 
					# 	- group by path (closeness)
 | 
				
			||||||
 | 
					# 		- deepest common path to contain all files with common name.
 | 
				
			||||||
 | 
					# 		  this will fail if we have different files with same names.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#-----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import json
 | 
				
			||||||
 | 
					import zipfile
 | 
				
			||||||
 | 
					import uuid
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from itertools import izip, izip_longest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from pli.logictypes import ANY, OR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from pprint import pprint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#-----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##CONFIG_NAME = 'test_config.json'
 | 
				
			||||||
 | 
					CONFIG_NAME = 'tmp_config.json'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config = json.load(open(CONFIG_NAME))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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'
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					XMP = OR(
 | 
				
			||||||
 | 
						'XMP', 'xmp'
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ITEM = OR(RAW, JPEG, PSD, TIFF, XMP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TYPES = {
 | 
				
			||||||
 | 
						'raw': RAW,
 | 
				
			||||||
 | 
						'jpeg': JPEG,
 | 
				
			||||||
 | 
						'psd': PSD,
 | 
				
			||||||
 | 
						'tiff': TIFF,
 | 
				
			||||||
 | 
						'xmp': XMP,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SUBTREE_CLASSES = {
 | 
				
			||||||
 | 
						'preview': 'preview', 
 | 
				
			||||||
 | 
						'preview (RAW)': 'RAW preview', 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#-----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##!!! 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, include_root_path=False):
 | 
				
			||||||
 | 
						'''
 | 
				
			||||||
 | 
						yields:
 | 
				
			||||||
 | 
							(<path>, <name>, <ext>),
 | 
				
			||||||
 | 
						'''
 | 
				
			||||||
 | 
						for path, dirs, files in os.walk(root):
 | 
				
			||||||
 | 
							# XXX is this correct...
 | 
				
			||||||
 | 
							path = path.split(os.path.sep)
 | 
				
			||||||
 | 
							# process files...
 | 
				
			||||||
 | 
							for f in files:
 | 
				
			||||||
 | 
								name, ext = os.path.splitext(f)
 | 
				
			||||||
 | 
								# we need the extension wothout the dot...
 | 
				
			||||||
 | 
								ext = ext[1:]
 | 
				
			||||||
 | 
								# filter by ext...
 | 
				
			||||||
 | 
								if ext == type:
 | 
				
			||||||
 | 
									if not include_root_path:
 | 
				
			||||||
 | 
										yield path[len(root.split(os.path.sep)):], name, ext
 | 
				
			||||||
 | 
									else:
 | 
				
			||||||
 | 
										yield path, name, ext
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#-----------------------------------------------------------------------
 | 
				
			||||||
 | 
					if __name__ == '__main__':
 | 
				
			||||||
 | 
					##	lst = list(list_files(config['ARCHIVE_ROOT']))
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					##	print len(lst)
 | 
				
			||||||
 | 
					##	pprint(lst[0])
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					##	json.dump(lst, file(os.path.join('test', 'flatfilelist.json'), 'w'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						lst = json.load(file(os.path.join('test', 'flatfilelist.json')))
 | 
				
			||||||
 | 
						print len(lst)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##	lst.sort()
 | 
				
			||||||
 | 
						# sort via name, ext, path
 | 
				
			||||||
 | 
						lst.sort(key=lambda e: (e[1], e[-1], e[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						##!!! duplicate a raw file...
 | 
				
			||||||
 | 
						for p, n, t in lst:
 | 
				
			||||||
 | 
							if t == RAW:
 | 
				
			||||||
 | 
								lst += [(p, n, t)]
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# index by name (indexing preparation)...
 | 
				
			||||||
 | 
						# {
 | 
				
			||||||
 | 
						# 	<name> : [
 | 
				
			||||||
 | 
						# 		(<path>, <name>, <type>),
 | 
				
			||||||
 | 
						# 		...
 | 
				
			||||||
 | 
						# 	],
 | 
				
			||||||
 | 
						# 	...
 | 
				
			||||||
 | 
						# }
 | 
				
			||||||
 | 
						index = {}
 | 
				
			||||||
 | 
						for p, n, t in lst:
 | 
				
			||||||
 | 
							if n in index:
 | 
				
			||||||
 | 
								index[n] += [(p, n, t)]
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								index[n] = [(p, n, t)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# index via a propper GID...
 | 
				
			||||||
 | 
						# split similarly named but different files...
 | 
				
			||||||
 | 
						GID_index = {}
 | 
				
			||||||
 | 
						for name, l in index.items():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							##!!! gid construction should be a customizable function in itself...
 | 
				
			||||||
 | 
							# main gid criteria:
 | 
				
			||||||
 | 
							# 	- unique
 | 
				
			||||||
 | 
							# 	- calculable from the item (preferably any sub-item)
 | 
				
			||||||
 | 
					##		GID = '%s-%s' % (uuid.uuid4().hex, name)
 | 
				
			||||||
 | 
							##!!! get RAW file creation date from EXIF...
 | 
				
			||||||
 | 
							GID = '%s-%s' % (hex(long(time.time()*1000))[2:-1], name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							l.sort()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							raws = [e for e in l if e[-1] == RAW] 
 | 
				
			||||||
 | 
							if len(raws) > 1:
 | 
				
			||||||
 | 
								# split the group into c seporate groups...
 | 
				
			||||||
 | 
								# strategies:
 | 
				
			||||||
 | 
								# 	- path proximity (distance)
 | 
				
			||||||
 | 
								# 	- metadata
 | 
				
			||||||
 | 
								##!!!
 | 
				
			||||||
 | 
								print 'duplicates: %s (%sx)' % (name, len(raws))
 | 
				
			||||||
 | 
					##			raise TypeError, 'found %s RAW files with identical names (%s).' % (len(raws), name)
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								GID_index[GID] = {
 | 
				
			||||||
 | 
									'gid': GID,
 | 
				
			||||||
 | 
									'name': name,
 | 
				
			||||||
 | 
									'RAW': raws,
 | 
				
			||||||
 | 
									'XMP': [e for e in l if e[-1] == XMP],
 | 
				
			||||||
 | 
									'JPG': [e for e in l if e[-1] == JPEG],
 | 
				
			||||||
 | 
									'PSD': [e for e in l if e[-1] == PSD],
 | 
				
			||||||
 | 
									'TIFF': [e for e in l if e[-1] == TIFF],
 | 
				
			||||||
 | 
									'other': [e for e in l if e[-1] != OR(TIFF, PSD, JPEG, XMP, RAW)],
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						print len(GID_index), GID
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#=======================================================================
 | 
				
			||||||
 | 
					#                                            vim:set ts=4 sw=4 nowrap :
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user