Сценарий Apple для экспорта изображений из приложения «Фотографии»

У меня есть альбомы и вложенные альбомы и папки в приложении Фото. Я хочу, чтобы мой applescript экспортировал изображения, сохраняя структуру альбома или папки, которая у меня есть в приложении.

Я попробовал сценарии, доступные в Интернете:

tell application "Finder"

    set location_1 to (choose folder with prompt "Choose a folder to export into") as text

end tell



tell application "Photos"

    set x to name of every folder

    choose from list x with prompt "Choose a project to export"

    set theP to item 1 of result

    tell application "Finder" to make new folder at alias location_1 with properties {name:theP}

    tell folder theP

        set initflist to every folder

        set initalist to every album

        if initflist is equal to {} then


            log "process albums"
            processAlbums(initalist, location_1 & theP) of me

        else

            if initalist is not equal to {} then

                log "process albums"
                processAlbums(initalist, location_1 & theP) of me

            end if

            log "process sub folders "
            processSfolders(initflist, (location_1 & theP)) of me

        end if

    end tell

end tell



on processAlbums(alist, apath)

    tell application "Photos"

        repeat with a in alist

            tell a

                set theimages to get media items of album a
                set thename to name of a

                tell application "Finder"

                    if not (exists folder thename in alias apath) then

                        make new folder at alias apath with properties {name:thename}

                    end if

                    set destination to apath & ":" & thename & ":"

                end tell

                with timeout of 6000 seconds

                    tell a

                        set settings to "JPEG - Original Size"

                        export theimages to alias destination

                    end tell

                end timeout

            end tell

        end repeat

    end tell

end processAlbums



on processSfolders(flist, fpath)

    tell application "Photos"

        repeat with a in flist

            try

                set thename to name of a

                tell application "Finder"

                    if not (exists folder thename in alias fpath) then

                        make new folder at alias fpath with properties {name:thename}

                    end if

                end tell

                tell a

                    set sAlist to every album

                    set sflist to every folder

                    if sflist is equal to {} then

                        processAlbums(sAlist, fpath & ":" & thename) of me

                    else

                        if sAlist is not equal to {} then

                            processAlbums(sAlist, fpath & ":" & thename) of me

                        end if

                        processSfolders(sflist, fpath & ":" & thename) of me

                    end if

                end tell

            on error errMsg
                log "error"
            end try

        end repeat


    end tell

end processSfolders

Проблема в том, что он получает имена только дочерних альбомов, а не альбомов верхнего уровня. Я должен поддерживать всю структуру альбома или папки.

Я не знаю AppleScript, и я пытался настроить его, но пока безуспешно. Могу ли я получить направление, пожалуйста?


person S Khurana    schedule 28.11.2019    source источник
comment
Плохое форматирование и ненужные пустые строки делают код нечитаемым.   -  person vadian    schedule 29.11.2019


Ответы (1)


Вы можете получить имена папок и альбомов, содержащихся в папке, что позволит вам создать верхний уровень и дочерние каталоги. Альбомы могут содержать только элементы мультимедиа, но не альбомы. Альбомы верхнего уровня классифицируются как папки или контейнеры. В словаре Applescript для фотографий он дает определения для этих элементов.

tell application "Finder"
set location_1 to (choose folder with prompt "Choose a folder to export into") as text
end tell

tell application "Photos"
    activate
    set fds to folders

    repeat with fd in fds
        set fdName to name of fd
        set abNames to every album of fd
        if parent of fd is missing value then
            my createFolders(fdName, abNames, location_1, fd)
        end if
    end repeat
end tell

on createFolders(fName, aAlbums, fPath, fd)

    tell application "Finder"
        if not (exists folder fName in alias fPath) then
            make new folder with properties {name:fName} at fPath
        end if

        repeat with a in aAlbums
            set aName to name of a
            set aPath to ((fPath as alias) as text) & fName
            if not (exists folder aName in alias aPath) then
                make new folder with properties {name:aName} at aPath
            end if
            set exPath to ((aPath as alias) as text) & aName

            my exportImages(a, exPath)

        end repeat
    end tell

    tell application "Photos"
        set rcFolders to every folder of fd
        repeat with rcFd in rcFolders
            set rcAlbums to every album of rcFd
            set rcName to name of rcFd
            set rcPath to ((fPath as alias) as text) & fName
            my createFolders(rcName, rcAlbums, rcPath, rcFd)
        end repeat
    end tell
end createFolders

on exportImages(photoAlbum, destination)
    tell application "Photos"
        set theimages to get media items of photoAlbum
        with timeout of 6000 seconds
            tell photoAlbum
                set settings to "JPEG - Original Size"
                export theimages to alias destination
            end tell
        end timeout
    end tell
end exportImages

EDIT — Обработка ошибок

Для обработки ошибок найдите команду, вызвавшую ошибку, и поместите ее в блок try. Решением может быть выход из приложения, чтобы процесс завершился, и, возможно, добавление небольшой задержки, а затем продолжение сценария.

try
    export theimages to alias destination
on error
    -- statements to execute in case of error
    error "The exporting of images failed to complete"
    quit
end try

Из справки разработчика. Когда команда не может быть завершена в отведенное время (будь то две минуты по умолчанию или время, установленное оператором с тайм-аутом), AppleScript останавливает выполнение сценария и возвращает ошибку «время ожидания события истекло». AppleScript не отменяет операцию — он просто останавливает выполнение сценария. Если вы хотите, чтобы сценарий продолжался, вы можете обернуть операторы в операторе try. Однако то, может ли ваш сценарий отправить команду для отмены вызывающей нарушение длительной операции после тайм-аута, зависит от приложения, выполняющего команду. Дополнительная информация об операторах.

person Matts    schedule 28.11.2019
comment
Обновил свой скрипт. Проверьте, пожалуйста. Я все еще не получаю доступ к внешней папке/альбому. - person S Khurana; 29.11.2019
comment
Вы внесли несколько серьезных изменений в сценарий. Я думаю, что ответил на первоначальный вопрос, который должен был дать рекомендации о том, как получить доступ к имени папки/альбома верхнего уровня. - person Matts; 29.11.2019
comment
Я обновил ответ функцией создания папок - person Matts; 30.11.2019
comment
Спасибо за ваш вклад. Это работало хорошо для некоторых папок, а затем не создавало новые папки, а затем истекло время ожидания. - person S Khurana; 10.12.2019
comment
Спасибо за ваш вклад. Это работало хорошо для некоторых папок, а затем не создавало новые папки, а затем истекло время ожидания. @Мэттс - person S Khurana; 11.12.2019
comment
Это сработало для меня на небольшом образце. Может быть, попробуйте запустить его без обработки изображений, чтобы увидеть, создает ли он все папки. Также можно попробовать использовать задержку между циклами, чтобы замедлить его, так как он может использовать много памяти. - person Matts; 12.12.2019
comment
Я хотел бы просто пропустить папку/изображение, если время ожидания истекло. Я попытался добавить попытку, кроме везде. Можете ли вы предложить, как мне справиться с этим, используя try, кроме - person S Khurana; 12.12.2019