Search code examples
macosapplescriptexifcapture

How to get image's (jpeg, raw) capture date time with AppleScript?


By now, I can only get image file creation date which is several seconds later than capture date. How can I get image's capture date from Exif?

tell application "Finder"
    try
        set the source_folder to (folder of the front window) as text
    on error -- no open folder windows

        set the source_folder to (path to desktop folder) as text

    end try
    set these_items to the selection
end tell

set repeatCount to 1
repeat with i from 1 to the count of these_items

    set this_item to (item i of these_items) as alias
    set this_info to info for this_item
    set {file_name, file_ext} to splitExtension from the name of this_info
    set capture_date to (the creation date of this_info)

    set formatted_date to (my dateFormat(capture_date))
    set new_name to formatted_date & file_ext
    -- check to see if it's already there
    tell application "Finder"
        if (exists item (source_folder & new_name)) then
            --- display dialog new_name & " already exists."
            set new_name to formatted_date & "_" & repeatCount & file_ext
            set name of this_item to new_name
            set repeatCount to 1 + repeatCount
        else
            set name of this_item to new_name
        end if
    end tell
end repeat

Solution

  • You can get the EXIF data with help from AppleScriptObjC and AppKit.

    The result is an Applescript record containing the data, the capture date is probably the value for key DateTimeDigitized which is a string.

    use AppleScript version "2.4" -- Yosemite (10.10) or later
    use scripting additions
    use framework "AppKit"
    
    set theFile to (choose file)
    
    set imageRep to current application's NSBitmapImageRep's imageRepWithContentsOfFile:(POSIX path of theFile)
    set exifData to imageRep's valueForProperty:(current application's NSImageEXIFData)
    if exifData is missing value then
        display dialog "No EXIF data found" buttons "Cancel" default button 1
    else
        set exifData to exifData as record
        set captureDate to DateTimeDigitized of exifData
    end if