One of the yearly chores I keep putting off is triage of Summer photos, and this year is no exception (rather, it is an especially telling occasion, since I have nearly two years of photos to consolidate and file)
I don’t usually need actual editing functionality when I am doing triage–I just need a fast way to go through hundreds of photos in one sitting, toss as many away as possible and file the rest away like I want. In essence, what I need is:
- Brutally fast thumbnail viewer (ideally with an EXIF sidebar and a full-screen preview on a secondary monitor)
- (Some) support for RAW (CR2 and DNG, in my case1) and video, so I can at least see what I’m filing
- Batch rename files to
YYYYMMDDhhmmss.fooformat based on EXIF data (I have Automator scripts for it, but I don’t want to use just those)
- Quick way to rate/reject photos (more reject than rate, really, but rating is nice)
- XMP metadata support (for ratings and as sidecar data for non-destructive editing)
Photos, of course, is a joke and cannot do (or even think about) most of the above, especially since it abhores the filesystem and, like most modern Apple apps, has no clue about hierarchical filing, let alone scalable file operations across hundreds of files.
The Finder is slated to get a Gallery view with Mojave (which, in typical Apple style, seems to do the basics really well, but will certainly not do “pro” things like display a full screen preview on a secondary monitor), but I can’t really wait for it.
So I groaned and griped and fiddled and diddled and swore, and after trying to do as much as I could with Darktable, ended up installing Adobe Bridge CC 2018 to do most of it, and near the end got a tip from Benjamim Silva2 and installed Microsoft Expression Media 2, which is a “pure” Digital Asset Manager (DAM) from times of yore.
Looking back, I probably ought to have started with the latter, but here’s a summary of my findings feature-wise:
|Application||Batch Rename||Image Preview||Triage|
|Adobe Bridge CC 2018||Multiple criteria, duplicates end up with
||Pane that you cannot move to secondary monitor anymore, because pleasing users does not make money||Reject with
|Darktable||Issue #8507, open over 7 years ago||Cannot use dual displays at all||Quick rating/reject with
|Expression Media 2||Multiple criteria, duplicates end up with
||Separate window you can move to secondary monitor, with histogram and exposure warnings||Quick rating/reject with
And a more subjective take:
|Adobe Bridge CC 2018||Free, modern app, fairly fast, supports smart folders, supports dragging and dropping files between folders||Chock-full of Adobe spyware|
|Darktable||Full-blown non-destructive RAW editing, asymptotally converging towards the Lightroom feeature set, Open Source and cross-platform||Excruciatingly slow on Retina Macs because it redraws the entire lighttable upon mouse move (Issue #10764, filed over two years ago). Tiny percentage of Mac users, single Mac dev/packager|
|Expression Media 2||Nominally free if, like me, you got it with ancient Office versions (even if you ignored it). Runs like greased lightning, old-school multiple-palette crop/edit with file versioning,||Has no clue about XMP. 32-bit app completely outside any kind of support. Old(ish) GUI, but remarkably sensible and usable (more so than Photos)|
I also looked at simpler things like Spect (which is promising) and am toying with the notion of building a very simple Cocoa previewer and EXIF/XMP inspector that just syncs with whatever is in focus inside the Finder, but there are only so many hours in the day and, at least for now, my needs are met.
In the long run, I’m still (sort of) betting on Darktable, but the excruciating slowness on my Mac means I’ve taken to use Affinity Photo for editing, and just file new copies manually when I’m done. Affinity is also clueless about XMP and doesn’t have a DAM of their own (seems like they never will), but at least it’s fast.
For the sake of completeness, here’s the Python script I run inside Automator to rename files, using
sips to extract creation dates:
#!/bin/env python2 from time import gmtime, strftime, localtime from subprocess import check_output from datetime import datetime import sys, os, re pattern = re.compile(".+\.(png|gif|heif|jpg|jpeg|mov|avi|3gp|wmv|mp4|m4v|cr2|nef)$", re.IGNORECASE) def rename(f,p,c,e,alt=''): n = "%s/%s%s.%s" % (p,c,alt,e.lower()) if f == n: print f return if os.path.exists(n): if alt is '': alt='a' else: alt=chr(ord(alt)+1) rename(f,p,c,e,alt) else: # TODO: handle aae|xmp os.rename(f,n) print n for f in sys.stdin: f = f.strip() matches = pattern.match(f) if matches: e = matches.group(1).lower() p = os.path.dirname(f) c = check_output([ 'sips','-g','creation',f]) d = ' '.join(c.strip().split(' ')[-2:]) try: datetime.strptime(d, '%Y:%m:%d %H:%M:%S') c = d.replace(":",'').replace(' ','') rename(f,p,c,e) except ValueError: c = strftime("%Y%m%d%H%M%S",localtime(os.path.getmtime(f))) rename(f,p,c,e)