mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 10:20:08 +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