Applescript- How to prevent script from adding duplicate folders or albums to iPhoto?

185 Views Asked by At

I found this script online (see below) for importing photos automatically into iPhoto. It uses AppleScript and it works perfectly. The only issue is that when you stop the script and run it again, it will duplicate the folders (i.e. it will reimport the same pictures and create the same folders and albums, creating duplicates) (see the picture below).

PICTURE OF IPHOTO LIBRARY FOLDERS

Does anybody know how could this script be modified so that if the folder or album already exists, it will import the photos into that folder or album? I know you can select "no" to stop duplicate pictures from being imported, but I am looking to stop duplicate albums and folders from being imported.

I am not 100% familiar with AppleScript, so any help would be greatly appreciated.

Thank you!

Here is the script:

on run
    set folderList to (choose folder with multiple selections allowed)
    
    tell application "Photos"
        activate
        delay 2
    end tell
    
    repeat with baseFolder in folderList
        importEachSubFolder(baseFolder, null)
    end repeat
end run

on importEachSubFolder(aFolder, parentFolder)
    tell application "Finder"
        set albumName to (name of aFolder as text)
        set subFolders to every folder of aFolder
    end tell
    
    if (count of subFolders) > 0 then
        set fotoFolder to createFotoFolder(aFolder, albumName, parentFolder)
        
        repeat with eachFolder in subFolders
            importEachSubFolder(eachFolder, fotoFolder)
        end repeat
    else
        set fotoFolder to parentFolder
    end if
    
    importFotos(aFolder, albumName, fotoFolder)
end importEachSubFolder

on importFotos(aFolder, albumName, parentFolder)
    set imageList to getImageList(aFolder)
    if imageList is {} then return
    
    set fotoAlbum to createFotoAlbum(albumName, parentFolder)
    
    tell application "Photos"
        with timeout of 600 seconds
            import imageList into fotoAlbum skip check duplicates yes
        end timeout
    end tell
end importFotos

on createFotoFolder(aFolder, folderName, parentFolder)
    tell application "Photos"
        if parentFolder is null then
            make new folder named folderName
        else
            make new folder named folderName at parentFolder
        end if
    end tell
end createFotoFolder

on createFotoAlbum(albumName, parentFolder)
    tell application "Photos"
        if parentFolder is null then
            make new album named albumName
        else
            make new album named albumName at parentFolder
        end if
    end tell
end createFotoAlbum

on getImageList(aFolder)
    set extensionsList to {"jpg", "png", "tiff", "JPG", "jpeg", "gif", "JPEG", "PNG", "TIFF", "GIF", "MOV", "mov", "MP4", "mp4", "MPG", "mpg", "BMP", "bmp", "TIF", "tif", "AVI", "avi", "PSD", "psd", "ai", "AI", "orf", "ORF", "nef", "NEF", "crw", "CRW", "cr2", "CR2", "dng", "DNG", "PEF"}
    tell application "Finder" to set theFiles to every file of aFolder whose name extension is in extensionsList
    
    set imageList to {}
    repeat with i from 1 to number of items in theFiles
        set thisItem to item i of theFiles as alias
        set the end of imageList to thisItem
    end repeat
    
    imageList
end getImageList

2

There are 2 best solutions below

4
Robert Kniazidis On BEST ANSWER

Check for album/folder existing before creating:

on importFotos(aFolder, albumName, parentFolder)
    set imageList to getImageList(aFolder)
    if imageList is {} then return
    set fotoAlbum to createFotoAlbum(albumName, parentFolder)
    tell application "Photos" to set albumPictureNames to filename of media items of fotoAlbum
    set filteredImageList to {}
    repeat with anAlias in imageList
        tell application "Finder" to set pictureName to name of anAlias
        if not (pictureName is in albumPictureNames) then set end of filteredImageList to contents of anAlias
    end repeat
    with timeout of 600 seconds
        tell application "Photos" to import filteredImageList into fotoAlbum skip check duplicates yes
    end timeout
end importFotos

on createFotoFolder(aFolder, folderName, parentFolder)
    tell application "Photos"
        if parentFolder is null then
            if not (exists folder folderName) then make new folder named folderName
            return folder folderName
        else
            if not (exists folder folderName of parentFolder) then make new folder named folderName at parentFolder
            return folder folderName of parentFolder
        end if
    end tell
end createFotoFolder

on createFotoAlbum(albumName, parentFolder)
    tell application "Photos"
        if parentFolder is null then
            if not (exists album albumName) then make new album named albumName
            return album albumName
        else
            if not (exists album albumName of parentFolder) then make new album named albumName at parentFolder
            return album albumName of parentFolder
        end if
    end tell
end createFotoAlbum

on getImageList(aFolder)
    set extensionsList to {"jpg", "png", "tiff", "JPG", "jpeg", "gif", "JPEG", "PNG", "TIFF", "GIF", "MOV", "mov", "MP4", "mp4", "MPG", "mpg", "BMP", "bmp", "TIF", "tif", "AVI", "avi", "PSD", "psd", "ai", "AI", "orf", "ORF", "nef", "NEF", "crw", "CRW", "cr2", "CR2", "dng", "DNG", "PEF"}
    tell application "Finder" to set imageList to (files of aFolder whose name extension is in extensionsList) as alias list
end getImageList
1
Roderick Muller On

Super happy with the script. After the script, I run an automation to delete these folders but I am looking for repetitive process. This would eliminate the problem of the duplicates all together.

As I am not a applescript expert, my question is; how can i point the script to a fixed folder and when it sees new subfolders there, have those imported as albums into photos after which the folders then get deleted. last part i can do with an automation I suppose. After which the script monitors this folder so the process repeats itself etc etc