Emergency Photo Triage

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 . 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.foo format 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 (1) suffix, does not rename XMP sidecars Pane that you cannot move to secondary monitor anymore, because pleasing users does not make money Reject with Backspace (delete by adding Cmd), Cmd plus number keys to rate
Darktable Issue #8507, open over 7 years ago Cannot use dual displays at all Quick rating/reject with R and number keys
Expression Media 2 Multiple criteria, duplicates end up with _1 suffix Separate window you can move to secondary monitor, with histogram and exposure warnings Quick rating/reject with Ctrl and number keys, color labels with number keys alone

And a more subjective take:

Application Pluses Minuses
Adobe Bridge CC 2018 Free, modern app, fairly fast, supports smart folders, supports dragging and dropping files between folders Chock-full of
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 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
  if os.path.exists(n):
    if alt is '':
    # TODO: handle aae|xmp
    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:])
      datetime.strptime(d, '%Y:%m:%d %H:%M:%S')
      c = d.replace(":",'').replace(' ','')
    except ValueError:
      c = strftime("%Y%m%d%H%M%S",localtime(os.path.getmtime(f)))

  1. I’m still not shooting RAW by default, although I care about it enough to pick the right camera for the occasion. But most of the stuff I need to go through is still cameraphone output. ↩︎

  2. Who, incidentally, is a kick-ass photographer whose portfolio you should browse through. ↩︎

This page is referenced in: