0

I have an AppleScript that exports images from Apple Photos. In some circumstances, it fails with error "Could not write file to destination (1,001)". I've been banging my head on this and could use help figuring out why it's happening.

Here's a simplified AppleScript that reproduces the problem:

tell application "Photos"
    activate
    set mediaItem to last media item
    export {mediaItem} to "/Users/spather/tmp/ApplePhotosExport"
end tell

If I run this right after a fresh start of the Photos app, it will fail. If manually export (using the Apple Photos UI) a photo to the same folder the AppleScript exports to, thereafter, the script works every time. But if I restart the Photos app, the script will fail again until I do a manual export from the UI at least once.

When it fails, I see this error dialog: screenshot of error dialog

This is what the permissions look like on the destination directory:

$ ls -ld@ /Users/spather/tmp/ApplePhotosExport
drwxr-xr-x  10 spather  staff  320 Dec 10 15:56 /Users/spather/tmp/ApplePhotosExport

But I suspect it's not a permissions issue as the same directory will not exhibit the issue for a manual export or the script run after a manual export and will exhibit the issue again after a cold restart of the Photos app.

EDIT: Perhaps it is a permission thing after all. After I wrote the above I traced filesystem activity with Instruments and saw this:

Photos (54936) failed performing open_nocancel on ( /Users/spather/local-storage/tmp/ApplePhotosExport/IMG_4037 (4).jpg.sb-ec7cccde-OaN2DK ) with: Operation not permitted. 1   

EDIT 2: In an attempt to rule out permissions, I tried fulling opening permissions on the directory. Sadly, it still fails in the cases it failed before.

$ chmod 777 ~/tmp/ApplePhotosExport
$ ls -ld@ ~/tmp/ApplePhotosExport
drwxrwxrwx  11 spather  staff  352 Dec 10 16:40 /Users/spather/tmp/ApplePhotosExport

Thanks in advance for any pointers to a solution or avenues to investigate.

triangle_man
  • 1,072
  • 6
  • 10
  • Are you running this out of Script Editor? – matt Dec 11 '19 at 01:48
  • Running out of **Script Editor** on **macOS Catalina**, I get no error, however I can confirm that I have to first manually export from the Photos UI and then the **AppleScript** _script_ will export there after until **Photos** is quit. I also tried this on **macOS High Sierra** and I did get the error message and the rest was the same as in **macOS Catalina**. I also tried writing to `/tmp` and had the same results, so I do not think it's a permissions issue. A bug maybe? – user3439894 Dec 11 '19 at 01:55
  • I'm running it out of Script Debugger (https://latenightsw.com/) but can also reproduce it running from osascript on the command line. – triangle_man Dec 11 '19 at 02:07
  • A sandboxing issue...? – CJK Dec 12 '19 at 08:28

1 Answers1

0

First, the Photos.app dictionary says to export using its own file specifier with the addition of a compound HFS path (2 parts). Moreover, the 1-st part of the HFS path must be a folder that already exists in the file system. An example of such a folder is the temporary items folder from user domain. It definitely exists on any Mac (unlike the tmp of home folder).

Here we come to a little mystery. The dictionary does not say anything about what should be specified as the 2nd part of the HFS path. File or folder? Applying Sherlock Holmes's method of deductive logical thinking, I conclude: The export Photos.app command is for exporting a list of media items (that is, several items). Since it will not be possible to cram several media items into a file, then the 2nd part of the HFS path must be a folder:

-- script: Export media item(s) to local Folder
-- written: by me, right now

-- 1st part of compound HFS path, should be already existing folder
set tmp to (path to temporary items folder from user domain) as text

tell application "Photos"
    activate
    set mediaItem to last media item
    -- we use here Photos.app's flie specifier with compound HFS path
    -- 2nd part of HFS path became container folder for exported media items
    export {mediaItem} to file (tmp & "ApplePhotosExport")
end tell

NOTE: Of course, the HFS path of a folder can also be non-compound if the folder already exists. For example, in the example above, we could only specify file tmp, and then the media items would be exported to the temporary items folder itself, and not to its ApplePhotosExport subfolder.

Robert Kniazidis
  • 1,760
  • 1
  • 7
  • 8