diff --git a/ui/compatibility.js b/ui/compatibility.js index 5abf5c1b..ee3bce11 100755 --- a/ui/compatibility.js +++ b/ui/compatibility.js @@ -66,6 +66,7 @@ if(window.CEF_dumpJSON != null){ } // XXX make this work across fs... // XXX this will not overwrite... + // XXX set ctime to the same value as the original... window.copyFile = function(src, dst){ var deferred = $.Deferred() src = osPath(src) @@ -75,7 +76,6 @@ if(window.CEF_dumpJSON != null){ path.pop() path = path.join('/') - // make dirs... if(!fs.existsSync(path)){ console.log('making:', path) @@ -380,7 +380,22 @@ if(window.CEF_dumpJSON != null){ return queue } - window.makeImageGID = function(source, make_text_gid){ + // format: "20130102-122315" + window.getEXIFDate = function(source){ + var getter = $.Deferred() + getVipsField('exif-ifd0-Date and Time', source) + .done(function(date){ + getter.resolve(date + // remove substrings in braces... + .replace(/\([^)]*\)/, '') + .trim() + .replace(/:/g, '') + .replace(/ /g, '-')) + }) + return getter + } + + window.getEXIFGID = function(source, make_text_gid){ if(source in IMAGES){ var img = IMAGES[source] var source = normalizePath(img.path) @@ -389,21 +404,19 @@ if(window.CEF_dumpJSON != null){ $.when( getVipsField('exif-ifd0-Artist', source), - getVipsField('exif-ifd0-Date and Time', source)) + getEXIFDate(source)) .done(function(artist, date){ // Artist... artist = artist + // remove substrings in braces... .replace(/\([^)]*\)/, '') .trim() artist = artist == '' ? 'Unknown' : artist + // Date... - // format: "20130102-122315" // XXX if not set, get ctime... - date = date - .replace(/\([^)]*\)/, '') - .trim() - .replace(/:/g, '') - .replace(/ /g, '-') + // XXX + // File name... var name = source.split(/[\\\/]/).pop().split('.')[0] diff --git a/ui/data.js b/ui/data.js index 9c3334b7..b440a3eb 100755 --- a/ui/data.js +++ b/ui/data.js @@ -715,7 +715,10 @@ function orientationExif2ImageGrid(orientation){ // NOTE: this depends on that the base dir contains ALL the images... // NOTE: if base is not given, this will not read image to get // orientation data... -function imagesFromUrls(lst){ +function imagesFromUrls(lst, ctime_getter){ + ctime_getter = (ctime_getter == null + ? function(){ return Date.now()/1000 } + : ctime_getter) var res = {} $.each(lst, function(i, e){ @@ -739,7 +742,7 @@ function imagesFromUrls(lst){ type: 'image', state: 'single', path: e, - ctime: Date.now(), + ctime: ctime_getter(e), preview: {}, classes: '', orientation: 0, @@ -1606,7 +1609,7 @@ function openImageWith(prog){ /********************************************************************** -* Experimental +* Experimental & utility */ // The idea here is to add markers as first-class image-like elements... @@ -1641,6 +1644,85 @@ function loadRibbonsFromPath(path, cmp, reverse, dir_name){ } +function readImageDate(gid, images){ + images = images == null ? IMAGES : images + var img = images[gid] + return getEXIFDate(normalizePath(img.path)) + .done(function(date){ + img.ctime = Date.fromTimeStamp(date).getTime()/1000 + }) +} +function readImagesDates(images){ + images = images == null ? IMAGES : images + + return $.when.apply(null, $.map(images, function(_, gid){ + return readImageDate(gid, images) + })) +} +function readImagesDatesQ(images){ + images = images == null ? IMAGES : images + + var queue = getWorkerQueue('date_reader') + + $.each(images, function(gid, img){ + queue.enqueue(readImageDate, gid, images) + .always(function(){ queue.notify(gid, 'done') }) + }) + + return queue +} + + +function updateImageGID(gid, images, data){ + images = images == null ? IMAGES : images + var img = images[gid] + return getEXIFGID(normalizePath(img.path)) + .done(function(gid){ + img.id = gid + // images... + images[gid] = images[key] + delete images[key] + + // data... + if(data != null){ + // replace current... + if(data.current == key){ + data.current = gid + } + // replace in order... + data.order[data.order.indexOf(key)] = gid + // replace in ribbons... + for(var i=0; i < data.ribbons; i++){ + var r = data.ribbons[i] + var k = r.indexOf(key) + if(k >= 0){ + r[k] = gid + } + } + } + }) +} +function updateImagesGIDs(images, data){ + images = images == null ? IMAGES : images + + return $.when.apply(null, $.map(images, function(_, key){ + return updateImageGID(key, images, data) + })) +} +function updateImagesGIDsQ(images, data){ + images = images == null ? IMAGES : images + + var queue = getWorkerQueue('gid_updater') + + $.each(images, function(_, key){ + queue.enqueue(updateImageGID, key, images, data) + .always(function(){ queue.notify(key, 'done') }) + }) + + return queue +} + + /********************************************************************** * vim:set ts=4 sw=4 spell : */ diff --git a/ui/lib/jli.js b/ui/lib/jli.js index 329985f7..60a664c0 100755 --- a/ui/lib/jli.js +++ b/ui/lib/jli.js @@ -778,6 +778,7 @@ Date.prototype.getTimeStamp = function(no_seconds){ return ''+y+M+D+H+m+s } Date.prototype.setTimeStamp = function(ts){ + ts = ts.replace(/[^0-9]*/g, '') this.setFullYear(ts.slice(0, 4)) this.setMonth(ts.slice(4, 6)*1-1) this.setDate(ts.slice(6, 8))