mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 18:30:09 +00:00
reworking metadata caching...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
c4c7c78019
commit
3249dcbf77
@ -55,6 +55,7 @@ var IndexFormatActions = actions.Actions({
|
|||||||
config: {
|
config: {
|
||||||
'index-dir': '.ImageGrid',
|
'index-dir': '.ImageGrid',
|
||||||
|
|
||||||
|
// XXX should these be 'p' or 'px' (current)...
|
||||||
'preview-sizes': [
|
'preview-sizes': [
|
||||||
75,
|
75,
|
||||||
200,
|
200,
|
||||||
|
|||||||
@ -24,6 +24,7 @@ if(typeof(process) != 'undefined'){
|
|||||||
var fse = requirejs('fs-extra')
|
var fse = requirejs('fs-extra')
|
||||||
var pathlib = requirejs('path')
|
var pathlib = requirejs('path')
|
||||||
var glob = requirejs('glob')
|
var glob = requirejs('glob')
|
||||||
|
var exifReader = requirejs('exif-reader')
|
||||||
|
|
||||||
var file = require('imagegrid/file')
|
var file = require('imagegrid/file')
|
||||||
}
|
}
|
||||||
@ -64,6 +65,11 @@ function normalizeOrientation(orientation){
|
|||||||
} }
|
} }
|
||||||
|
|
||||||
|
|
||||||
|
var exifReader2exiftool = {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
|
|
||||||
@ -308,17 +314,26 @@ var SharpActions = actions.Actions({
|
|||||||
Make previews for all images...
|
Make previews for all images...
|
||||||
.makePreviews()
|
.makePreviews()
|
||||||
.makePreviews('all')
|
.makePreviews('all')
|
||||||
-> actions
|
-> promise
|
||||||
|
|
||||||
Make previews for current image...
|
Make previews for current image...
|
||||||
.makePreviews('current')
|
.makePreviews('current')
|
||||||
-> actions
|
-> promise
|
||||||
|
|
||||||
Make previews for specific image(s)...
|
Make previews for specific image(s)...
|
||||||
.makePreviews(gid)
|
.makePreviews(gid)
|
||||||
.makePreviews([gid, gid, ..])
|
.makePreviews([gid, gid, ..])
|
||||||
-> actions
|
-> promise
|
||||||
|
|
||||||
|
|
||||||
|
Make previews of images, size and at base_path...
|
||||||
|
.makePreviews(images, sizes)
|
||||||
|
.makePreviews(images, sizes, base_path)
|
||||||
|
-> promise
|
||||||
|
|
||||||
|
|
||||||
|
NOTE: if base_path is given .images will not be updated with new
|
||||||
|
preview paths...
|
||||||
`,
|
`,
|
||||||
function(images, sizes, base_path, logger){
|
function(images, sizes, base_path, logger){
|
||||||
var that = this
|
var that = this
|
||||||
@ -397,16 +412,99 @@ var SharpActions = actions.Actions({
|
|||||||
return false }
|
return false }
|
||||||
|
|
||||||
// update metadata...
|
// update metadata...
|
||||||
|
if(!base_path){
|
||||||
var preview = img.preview = img.preview || {}
|
var preview = img.preview = img.preview || {}
|
||||||
preview[parseInt(size) + 'px'] = name
|
preview[parseInt(size) + 'px'] = name
|
||||||
that.markChanged('images', [gid])
|
that.markChanged('images', [gid]) }
|
||||||
|
|
||||||
return [gid, size, name] }) }) })
|
return [gid, size, name] }) }) })
|
||||||
.flat()) }],
|
.flat()) }],
|
||||||
|
|
||||||
|
|
||||||
|
// XXX should this update all images or just the ones that have no metadata???
|
||||||
|
// XXX revise name...
|
||||||
|
cacheImageMetadata: ['- Sharp|Image/',
|
||||||
|
function(images, logger){
|
||||||
|
var that = this
|
||||||
|
|
||||||
|
// get/normalize images...
|
||||||
|
//images = images || this.current
|
||||||
|
images = images
|
||||||
|
|| 'current'
|
||||||
|
// keywords...
|
||||||
|
images =
|
||||||
|
images == 'all' ?
|
||||||
|
this.data.getImages('all')
|
||||||
|
: images == 'loaded' ?
|
||||||
|
(this.ribbons ?
|
||||||
|
this.ribbons.getImageGIDs()
|
||||||
|
: this.data.getImages('all'))
|
||||||
|
: images == 'current' ?
|
||||||
|
this.current
|
||||||
|
: images
|
||||||
|
images = images instanceof Array ?
|
||||||
|
images
|
||||||
|
: [images]
|
||||||
|
|
||||||
|
logger = logger !== false ?
|
||||||
|
(logger || this.logger)
|
||||||
|
: false
|
||||||
|
logger = logger && logger.push('Caching image metadata')
|
||||||
|
logger && logger.emit('queued', images)
|
||||||
|
|
||||||
|
var loaded = this.ribbons
|
||||||
|
&& this.ribbons.getImageGIDs()
|
||||||
|
|
||||||
|
return images
|
||||||
|
.mapChunks(function(gid){
|
||||||
|
var img = that.images[gid]
|
||||||
|
return sharp(that.getImagePath(gid))
|
||||||
|
.metadata()
|
||||||
|
.then(function(data){
|
||||||
|
var o = normalizeOrientation(data.orientation)
|
||||||
|
// NOTE: we need to set orientation to something
|
||||||
|
// or we'll check it again and again...
|
||||||
|
img.orientation = o.orientation || 0
|
||||||
|
img.flipped = o.flipped
|
||||||
|
|
||||||
|
// XXX EXIF -- keep compatible with exiftool...
|
||||||
|
// - dates
|
||||||
|
// - camera / lens / ...
|
||||||
|
var exif = data.exif
|
||||||
|
&& exifReader(data.exif)
|
||||||
|
// XXX
|
||||||
|
|
||||||
|
// xmp:Rating...
|
||||||
|
var rating = data.xmp
|
||||||
|
// NOTE: we do not need the full XML
|
||||||
|
// fluff here, just get some values...
|
||||||
|
&& parseInt(
|
||||||
|
(data.xmp.toString()
|
||||||
|
.match(/(?<match><(xmp:Rating)[^>]*>(?<value>.*)<\/\2>)/i)
|
||||||
|
|| {groups: {}})
|
||||||
|
.groups.value)
|
||||||
|
rating
|
||||||
|
&& (img.metadata = img.metadata || {})
|
||||||
|
&& (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])
|
||||||
|
|
||||||
|
logger && logger.emit('done', gid)
|
||||||
|
|
||||||
|
// update image to use the orientation...
|
||||||
|
loaded
|
||||||
|
&& loaded.includes(gid)
|
||||||
|
&& that.ribbons.updateImage(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: '',
|
||||||
@ -423,34 +521,20 @@ module.Sharp = core.ImageGridFeatures.Feature({
|
|||||||
isApplicable: function(){ return !!sharp },
|
isApplicable: function(){ return !!sharp },
|
||||||
|
|
||||||
handlers: [
|
handlers: [
|
||||||
|
/* XXX not sure if we need this...
|
||||||
|
['loadImages',
|
||||||
|
function(){
|
||||||
|
this.cacheImageMetadata('all', false) }],
|
||||||
|
//*/
|
||||||
|
|
||||||
// set orientation if not defined...
|
// set orientation if not defined...
|
||||||
|
// XXX this would be a great place to parse EXIF metadata...
|
||||||
|
// XXX check size and create preview if needed...
|
||||||
['updateImage',
|
['updateImage',
|
||||||
function(_, gid){
|
function(_, gid){
|
||||||
var that = this
|
this.images[gid]
|
||||||
var img = this.images[gid]
|
&& this.images[gid].orientation == null
|
||||||
|
&& this.cacheImageMetadata(gid, false) }],
|
||||||
if(img && img.orientation == null){
|
|
||||||
img.orientation = 0
|
|
||||||
|
|
||||||
sharp(this.getImagePath(gid))
|
|
||||||
.metadata()
|
|
||||||
.then(function(data){
|
|
||||||
var o = normalizeOrientation(data.orientation)
|
|
||||||
|
|
||||||
// NOTE: we need to set orientation to something
|
|
||||||
// or we'll check it again and again...
|
|
||||||
img.orientation = o.orientation || 0
|
|
||||||
img.flipped = o.flipped
|
|
||||||
|
|
||||||
that.markChanged('images', [gid])
|
|
||||||
|
|
||||||
// update image to use the orientation...
|
|
||||||
// XXX this might be a source for recursion
|
|
||||||
// as it triggers .updateImage(..) again...
|
|
||||||
that.ribbons && that.ribbons.updateImage(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..."
|
||||||
|
|||||||
@ -621,6 +621,34 @@ var BaseRibbonsPrototype = {
|
|||||||
return img
|
return img
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Get images...
|
||||||
|
//
|
||||||
|
// .getImages()
|
||||||
|
// -> images
|
||||||
|
//
|
||||||
|
// .getImages(jquery)
|
||||||
|
// .getImages(ribbon)
|
||||||
|
// -> images
|
||||||
|
//
|
||||||
|
// .getImages(ribbon-gid)
|
||||||
|
// -> images
|
||||||
|
//
|
||||||
|
getImages: function(target){
|
||||||
|
return (target instanceof jQuery ?
|
||||||
|
target
|
||||||
|
// gid...
|
||||||
|
: target ?
|
||||||
|
this.viewer.find(RIBBON + '[gid='+ target +']')
|
||||||
|
// viewer...
|
||||||
|
: this.viewer)
|
||||||
|
.find(IMAGE) },
|
||||||
|
// same as .getImages(..) but returns a list of gids...
|
||||||
|
getImageGIDs: function(target){
|
||||||
|
return this.getImages(...arguments)
|
||||||
|
.map(function(_, e){
|
||||||
|
return e.getAttribute('gid') })
|
||||||
|
.toArray() },
|
||||||
|
|
||||||
// Get image marks...
|
// Get image marks...
|
||||||
//
|
//
|
||||||
// .getImageMarks(gid)
|
// .getImageMarks(gid)
|
||||||
|
|||||||
5
Viewer/package-lock.json
generated
5
Viewer/package-lock.json
generated
@ -738,6 +738,11 @@
|
|||||||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
|
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"exif-reader": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/exif-reader/-/exif-reader-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-tWMBj1+9jUSibgR/kv/GQ/fkR0biaN9GEZ5iPdf7jFeH//d2bSzgPoaWf1OfMv4MXFD4upwvpCCyeMvSyLWSfA=="
|
||||||
|
},
|
||||||
"exiftool": {
|
"exiftool": {
|
||||||
"version": "0.0.3",
|
"version": "0.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/exiftool/-/exiftool-0.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/exiftool/-/exiftool-0.0.3.tgz",
|
||||||
|
|||||||
@ -21,6 +21,7 @@
|
|||||||
"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.2",
|
||||||
|
"exif-reader": "^1.0.3",
|
||||||
"exiftool": "^0.0.3",
|
"exiftool": "^0.0.3",
|
||||||
"fs-extra": "^7.0.1",
|
"fs-extra": "^7.0.1",
|
||||||
"fs-walk": "^0.0.1",
|
"fs-walk": "^0.0.1",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user