mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-31 19:30:07 +00:00 
			
		
		
		
	lots of tweaks...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									3249dcbf77
								
							
						
					
					
						commit
						933b763944
					
				| @ -82,6 +82,8 @@ var SharpActions = actions.Actions({ | |||||||
| 		// 	'files'
 | 		// 	'files'
 | ||||||
| 		'preview-progress-mode': 'gids', | 		'preview-progress-mode': 'gids', | ||||||
| 
 | 
 | ||||||
|  | 		'preview-generate-threshold': 2000, | ||||||
|  | 
 | ||||||
| 		// NOTE: this uses 'preview-sizes' and 'preview-path-template' 
 | 		// NOTE: this uses 'preview-sizes' and 'preview-path-template' 
 | ||||||
| 		// 		from filesystem.IndexFormat...
 | 		// 		from filesystem.IndexFormat...
 | ||||||
| 	}, | 	}, | ||||||
| @ -422,8 +424,13 @@ var SharpActions = actions.Actions({ | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	// XXX should this update all images or just the ones that have no metadata???
 | 	// XXX should this update all images or just the ones that have no metadata???
 | ||||||
|  | 	// XXX would be nice to be able to abort this...
 | ||||||
|  | 	// 		...and/or have a generic abort protocol triggered when loading...
 | ||||||
|  | 	// XXX make each section optional...
 | ||||||
| 	// XXX revise name...
 | 	// XXX revise name...
 | ||||||
| 	cacheImageMetadata: ['- Sharp|Image/', | 	cacheImageMetadata: ['- Sharp|Image/', | ||||||
|  | 		core.doc` | ||||||
|  | 		`,
 | ||||||
| 		function(images, logger){ | 		function(images, logger){ | ||||||
| 			var that = this | 			var that = this | ||||||
| 
 | 
 | ||||||
| @ -452,34 +459,57 @@ var SharpActions = actions.Actions({ | |||||||
| 			logger = logger && logger.push('Caching image metadata') | 			logger = logger && logger.push('Caching image metadata') | ||||||
| 			logger && logger.emit('queued', images) | 			logger && logger.emit('queued', images) | ||||||
| 
 | 
 | ||||||
|  | 			// NOTE: we are caching this to avoid messing things up when 
 | ||||||
|  | 			// 		loading before this was finished...
 | ||||||
|  | 			var cached_images = this.images | ||||||
|  | 
 | ||||||
| 			var loaded = this.ribbons | 			var loaded = this.ribbons | ||||||
| 				&& this.ribbons.getImageGIDs() | 				&& new Set(this.ribbons.getImageGIDs()) | ||||||
| 
 | 
 | ||||||
| 			return images | 			return images | ||||||
| 				.mapChunks(function(gid){ | 				.mapChunks(function(gid){ | ||||||
| 					var img = that.images[gid] |  | ||||||
| 					return sharp(that.getImagePath(gid)) | 					return sharp(that.getImagePath(gid)) | ||||||
| 						.metadata() | 						.metadata() | ||||||
| 						.then(function(data){ | 						.catch(function(){ | ||||||
| 							var o = normalizeOrientation(data.orientation) | 							logger && logger.emit('skipping', gid) }) | ||||||
|  | 						.then(function(metadata){ | ||||||
|  | 							// XXX what should we return in case of an error???
 | ||||||
|  | 							if(metadata == null){ | ||||||
|  | 								return } | ||||||
|  | 
 | ||||||
|  | 							var img = cached_images[gid] | ||||||
|  | 
 | ||||||
|  | 							var o = normalizeOrientation(metadata.orientation) | ||||||
| 							// NOTE: we need to set orientation to something
 | 							// NOTE: we need to set orientation to something
 | ||||||
| 							// 		or we'll check it again and again...
 | 							// 		or we'll check it again and again...
 | ||||||
| 							img.orientation = o.orientation || 0 | 							img.orientation = o.orientation || 0 | ||||||
| 							img.flipped = o.flipped | 							img.flipped = o.flipped | ||||||
| 
 | 
 | ||||||
|  | 							/* XXX should generate previews in a temp dir or as data-urls... | ||||||
|  | 							// if image too large, generate preview(s)...
 | ||||||
|  | 							var size_threshold = that.config['preview-generate-threshold'] | ||||||
|  | 							if(size_threshold | ||||||
|  | 									&& Math.max(metadata.width, metadata.height) > size_threshold){ | ||||||
|  | 								logger && logger.emit('Image too large', gid) | ||||||
|  | 								// XXX might be a good idea to only generate 
 | ||||||
|  | 								// 		a single preview...
 | ||||||
|  | 								// XXX 
 | ||||||
|  | 								this.makePreviews(gid) } | ||||||
|  | 							//*/
 | ||||||
|  | 
 | ||||||
| 							// XXX EXIF -- keep compatible with exiftool...
 | 							// XXX EXIF -- keep compatible with exiftool...
 | ||||||
| 							// 		- dates
 | 							// 		- dates
 | ||||||
| 							// 		- camera / lens / ...
 | 							// 		- camera / lens / ...
 | ||||||
| 							var exif = data.exif  | 							var exif = metadata.exif  | ||||||
| 								&& exifReader(data.exif)  | 								&& exifReader(metadata.exif)  | ||||||
| 							// XXX
 | 							// XXX
 | ||||||
| 
 | 
 | ||||||
| 							// xmp:Rating...
 | 							// xmp:Rating...
 | ||||||
| 							var rating = data.xmp  | 							var rating = metadata.xmp  | ||||||
| 								// NOTE: we do not need the full XML 
 | 								// NOTE: we do not need the full XML 
 | ||||||
| 								// 		fluff here, just get some values...
 | 								// 		fluff here, just get some values...
 | ||||||
| 								&& parseInt( | 								&& parseInt( | ||||||
| 									(data.xmp.toString() | 									(metadata.xmp.toString() | ||||||
| 											.match(/(?<match><(xmp:Rating)[^>]*>(?<value>.*)<\/\2>)/i)  | 											.match(/(?<match><(xmp:Rating)[^>]*>(?<value>.*)<\/\2>)/i)  | ||||||
| 										|| {groups: {}}) | 										|| {groups: {}}) | ||||||
| 									.groups.value) | 									.groups.value) | ||||||
| @ -487,24 +517,20 @@ var SharpActions = actions.Actions({ | |||||||
| 								&& (img.metadata = img.metadata || {}) | 								&& (img.metadata = img.metadata || {}) | ||||||
| 								&& (img.metadata.rating = rating || 0) | 								&& (img.metadata.rating = rating || 0) | ||||||
| 
 | 
 | ||||||
| 							// XXX check size and create preview if needed...
 |  | ||||||
| 							// 		...might be a good idea to keep previews 
 |  | ||||||
| 							// 		as data urls (or tmp-dir) if no index exists and 
 |  | ||||||
| 							// 		queue their creation on save...
 |  | ||||||
| 
 |  | ||||||
| 							that.markChanged('images', [gid]) | 							that.markChanged('images', [gid]) | ||||||
| 
 | 
 | ||||||
| 							logger && logger.emit('done', gid) | 							logger && logger.emit('done', gid) | ||||||
| 
 | 
 | ||||||
| 							// update image to use the orientation...
 | 							// update image to use the orientation...
 | ||||||
| 							loaded | 							loaded | ||||||
| 								&& loaded.includes(gid) | 								&& loaded.has(gid) | ||||||
| 								&& that.ribbons.updateImage(gid) }) }) }], | 								&& that.ribbons.updateImage(gid)  | ||||||
|  | 
 | ||||||
|  | 							return gid }) }) }], | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // XXX need to auto-generate previews for very large images...
 | // XXX need to auto-generate previews for very large images...
 | ||||||
| // XXX read exif/xmp/...
 |  | ||||||
| var Sharp =  | var Sharp =  | ||||||
| module.Sharp = core.ImageGridFeatures.Feature({ | module.Sharp = core.ImageGridFeatures.Feature({ | ||||||
| 	title: '', | 	title: '', | ||||||
| @ -528,13 +554,22 @@ module.Sharp = core.ImageGridFeatures.Feature({ | |||||||
| 		//*/
 | 		//*/
 | ||||||
| 
 | 
 | ||||||
| 		// set orientation if not defined...
 | 		// set orientation if not defined...
 | ||||||
| 		// XXX this would be a great place to parse EXIF metadata...
 | 		// NOTE: progress on this is not shown so as to avoid spamming 
 | ||||||
| 		// XXX check size and create preview if needed...
 | 		// 		the UI...
 | ||||||
|  | 		// XXX should this be pre or post???
 | ||||||
|  | 		// 		...creating a preview would be more logical than trying 
 | ||||||
|  | 		// 		to load a gigantic image, maybe even loading a placeholder
 | ||||||
|  | 		// 		while doing so...
 | ||||||
|  | 		//['updateImage.pre',
 | ||||||
|  | 		//	function(gid){
 | ||||||
| 		['updateImage', | 		['updateImage', | ||||||
| 			function(_, gid){ | 			function(_, gid){ | ||||||
| 				this.images[gid] | 				var img = this.images[gid] | ||||||
| 					&& this.images[gid].orientation == null | 				img | ||||||
| 					&& this.cacheImageMetadata(gid, false) }], | 					&& img.orientation == null | ||||||
|  | 					&& this.cacheImageMetadata(gid, false)  | ||||||
|  | 					&& this.logger  | ||||||
|  | 						&& this.logger.emit('Caching metadata for', gid) }], | ||||||
| 
 | 
 | ||||||
| 		// XXX need to:
 | 		// XXX need to:
 | ||||||
| 		// 		- if image too large to set the preview to "loading..."
 | 		// 		- if image too large to set the preview to "loading..."
 | ||||||
|  | |||||||
							
								
								
									
										24
									
								
								Viewer/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										24
									
								
								Viewer/package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -636,9 +636,9 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "electron": { |     "electron": { | ||||||
|       "version": "9.3.2", |       "version": "9.3.3", | ||||||
|       "resolved": "https://registry.npmjs.org/electron/-/electron-9.3.2.tgz", |       "resolved": "https://registry.npmjs.org/electron/-/electron-9.3.3.tgz", | ||||||
|       "integrity": "sha512-0lleEf9msAXGDi2GukAuiGdw3VDgSTlONOnJgqDEz1fuSEVsXz5RX+hNPKDsVDerLTFg/C34RuJf4LwHvkKcBA==", |       "integrity": "sha512-xghKeUY1qgnEcJ5w2rXo/toH+8NT2Dktx2aAxBNPV7CIJr3mejJJAPwLbycwtddzr37tgKxHeHlc8ivfKtMkJQ==", | ||||||
|       "requires": { |       "requires": { | ||||||
|         "@electron/get": "^1.0.1", |         "@electron/get": "^1.0.1", | ||||||
|         "@types/node": "^12.0.12", |         "@types/node": "^12.0.12", | ||||||
| @ -646,9 +646,9 @@ | |||||||
|       }, |       }, | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "@types/node": { |         "@types/node": { | ||||||
|           "version": "12.12.64", |           "version": "12.19.3", | ||||||
|           "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.64.tgz", |           "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.3.tgz", | ||||||
|           "integrity": "sha512-UV1/ZJMC+HcP902wWdpC43cAcGu0IQk/I5bXjP2aSuCjsk3cE74mDvFrLKga7oDC170ugOAYBwfT4DSQW3akDA==" |           "integrity": "sha512-8Jduo8wvvwDzEVJCOvS/G6sgilOLvvhn1eMmK3TW8/T217O7u1jdrK6ImKLv80tVryaPSVeKu6sjDEiFjd4/eg==" | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
| @ -1117,9 +1117,9 @@ | |||||||
|       "integrity": "sha512-EzT4CP6d6lI8bnknNgT3W8mUQhSVXflO0yPbKD4dKsFcINiC6npjoEBz+8m3VQmWJhc+36pXD4JLwNxUEgzi+Q==" |       "integrity": "sha512-EzT4CP6d6lI8bnknNgT3W8mUQhSVXflO0yPbKD4dKsFcINiC6npjoEBz+8m3VQmWJhc+36pXD4JLwNxUEgzi+Q==" | ||||||
|     }, |     }, | ||||||
|     "ig-types": { |     "ig-types": { | ||||||
|       "version": "2.0.16", |       "version": "2.0.21", | ||||||
|       "resolved": "https://registry.npmjs.org/ig-types/-/ig-types-2.0.16.tgz", |       "resolved": "https://registry.npmjs.org/ig-types/-/ig-types-2.0.21.tgz", | ||||||
|       "integrity": "sha512-p1qm26MkphItN1lj9CbcE/oKeLA55xpsqt17r8RVorWDbQBTtl1vtNdiAtBcVrCj+1CbJhZN74/ODi/pJR7kIQ==", |       "integrity": "sha512-s+Hu9MU50iohoS/5SUwuoS+P2EHk7Z2zKx9wX3syiBsaL9HYq8g/0Yp/4yz9JkME1zpbS8r9aviR0O2rjBXwHQ==", | ||||||
|       "requires": { |       "requires": { | ||||||
|         "ig-object": "^5.2.8", |         "ig-object": "^5.2.8", | ||||||
|         "object-run": "^1.0.1" |         "object-run": "^1.0.1" | ||||||
| @ -2361,9 +2361,9 @@ | |||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|     "v8-compile-cache": { |     "v8-compile-cache": { | ||||||
|       "version": "2.1.1", |       "version": "2.2.0", | ||||||
|       "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", |       "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", | ||||||
|       "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" |       "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==" | ||||||
|     }, |     }, | ||||||
|     "verror": { |     "verror": { | ||||||
|       "version": "1.10.0", |       "version": "1.10.0", | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ | |||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "app-module-path": "^1.0.6", |     "app-module-path": "^1.0.6", | ||||||
|     "async-json": "0.0.2", |     "async-json": "0.0.2", | ||||||
|     "electron": "^9.3.2", |     "electron": "^9.3.3", | ||||||
|     "exif-reader": "^1.0.3", |     "exif-reader": "^1.0.3", | ||||||
|     "exiftool": "^0.0.3", |     "exiftool": "^0.0.3", | ||||||
|     "fs-extra": "^7.0.1", |     "fs-extra": "^7.0.1", | ||||||
| @ -32,14 +32,14 @@ | |||||||
|     "ig-argv": "^2.15.0", |     "ig-argv": "^2.15.0", | ||||||
|     "ig-features": "^3.4.2", |     "ig-features": "^3.4.2", | ||||||
|     "ig-object": "^5.2.8", |     "ig-object": "^5.2.8", | ||||||
|     "ig-types": "^2.0.16", |     "ig-types": "^2.0.21", | ||||||
|     "moment": "^2.29.1", |     "moment": "^2.29.1", | ||||||
|     "object-run": "^1.0.1", |     "object-run": "^1.0.1", | ||||||
|     "requirejs": "^2.3.6", |     "requirejs": "^2.3.6", | ||||||
|     "requirejs-plugins": "^1.0.2", |     "requirejs-plugins": "^1.0.2", | ||||||
|     "sharp": "^0.25.4", |     "sharp": "^0.25.4", | ||||||
|     "strip-json-comments": "^2.0.1", |     "strip-json-comments": "^2.0.1", | ||||||
|     "v8-compile-cache": "^2.1.1", |     "v8-compile-cache": "^2.2.0", | ||||||
|     "wildglob": "^0.1.1" |     "wildglob": "^0.1.1" | ||||||
|   }, |   }, | ||||||
|   "dependencies-disabled": { |   "dependencies-disabled": { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user