Skip to content

Instantly share code, notes, and snippets.

@redoPop
Last active December 20, 2023 19:36
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save redoPop/0667cab8afd6c1fb94bb to your computer and use it in GitHub Desktop.
Save redoPop/0667cab8afd6c1fb94bb to your computer and use it in GitHub Desktop.
Hazel: "photo taken" custom date attribute

At the time of writing, Hazel's default date attributes all refer to an image file's creation date rather than the date on which the photo was originally taken. The two dates may differ.

This script provides a custom date attribute reflecting the time the photo was actually taken. As written, it's intended to be added as an embedded script in a "Run JavaScript" rule action, so that it's custom attribute can be used in subsequent "Sort into subfolder" patterns.

The date this script exposes is obtained via sips -g creation [filename]. It's not clear to me exactly which EXIF attribute the sips "creation" property comes from, but it seems reasonable to assume it's either DateTimeOriginal or DateTimeDigitized.

var app = Application.currentApplication();
app.includeStandardAdditions = true;
var theDate = app.doShellScript(
'sips -g creation ' +
// Dragons below: Q&D shell escape:
('' + theFile).replace(/ /g, '\\ ')
)
// Parse SIPS output & extract date
.match(/(\d{4}):(\d{2}):(\d{2}) (\d{2}):(\d{2}):(\d{2})/)
.slice(1)
// Q&D numberification of stringy dates
.map(function (i) { return +i });
// Offset the month by 1 because JavaScript
theDate[1] -= 1;
return {
hazelOutputAttributes: [
// Apply array of values to Date constructor
new (Function.prototype.bind.apply(
Date, [null].concat(theDate)
))
]
};
@redoPop
Copy link
Author

redoPop commented Jun 10, 2015

Here are a couple of screenshots showing how I use this custom data attribute JS in Hazel:

After which I can refer to the pattern when sorting:

There are three "Sort into subfolder" steps because I sort my photos into a Y/M/D path structure. For example, here's the first sort action:

This was mostly an experimental foray into JXA and Hazel custom attributes, and to be honest the whole thing feels pretty awful and clunky to me. I plan to replace it with a more maintainable shell script that does the whole job of reading the photo date from sips, creating new folders based upon it, and moving the file into place.

@redoPop
Copy link
Author

redoPop commented Jun 12, 2015

If anyone else ends up down this same path, eventually I replaced all of the above with a simple embedded shell script using exiftool:

exiftool "-Filename<DateTimeOriginal" -d "~/Pictures/%Y/%Y-%m/%Y-%m-%d_%H-%M-%S%%-c.%%e" "$1"

More information about its file and directory naming features can be found here.

@emmagine79
Copy link

If anyone else ends up down this same path, eventually I replaced all of the above with a simple embedded shell script using exiftool:

exiftool "-Filename<DateTimeOriginal" -d "~/Pictures/%Y/%Y-%m/%Y-%m-%d_%H-%M-%S%%-c.%%e" "$1"

More information about its file and directory naming features can be found here.

thank you so much, this was so helpful!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment