Синтаксис AppleScript для автоматизации iPhoto - PullRequest
4 голосов
/ 17 января 2011

Я искал через Google несколько указателей, чтобы заставить меня заняться чем-то, что мне нужно сделать в iPhoto через AppleScript, но до сих пор не нашел много. Существуют различные старые обсуждения сценариев для различных старых версий iPhoto, но нет ничего особенно полезного в том, что мне нужно. В основном, в псевдокоде я ищу это:

for each photo in library
  if photo.Description contains "a known string"
    photo.Description = photo.Description.Replace("a known string", "")
  end if
end for

То есть у меня есть фрагмент ошибочного текста, который попал в каждую (ну, почти каждую) фотографию в моей библиотеке. Я предполагаю, что когда-то в прошлом я испортил пакетную смену и не заметил этого до сих пор. Либо это, либо обновление с iPhoto '08 до '11 сделало это как-то. В любом случае, чистый результат один и тот же.

Я не очень разбираюсь в AppleScript, и у меня проблемы с поиском правильного синтаксиса / словаря для использования в этом. По сути, я нахожусь на tell application "iPhoto" части, но не знаю, что сказать. Если важна иерархия организации фотографий в библиотеке:

  1. Каждая фотография организована в хронологическом порядке в события. (События - моя основная форма организации.)
  2. Есть много альбомов, но не все в альбоме.
  3. Существует один умный альбом, который содержит каждую ошибочную фотографию. Это, конечно, основано на наличии известной строки в описании фотографии. Так что я полагаю, что об этом следует помнить, если окончательный код перебирает фотографии в этом умном альбоме, поскольку умный альбом может изменять итеративный массив, не так ли?

У кого-нибудь есть ссылки или примеры кода, чтобы помочь мне? И наоборот, кто-нибудь знает лучший способ сделать это одноразовое массовое исправление?

Редактировать: Я запустил тест со следующим кодом:

tell application "iPhoto"
    activate
    set thePhotos to get every photo
    repeat with aPhoto in thePhotos
        if aPhoto's comment contains "[known string]" then
            log aPhoto's comment
            tell aPhoto to set it's comment to text 1 thru (offset of "[known string]" in aPhoto's comment) of aPhoto's comment
            log aPhoto's comment
            exit repeat
        end if
    end repeat
end tell

Что привело к следующему выводу:

tell application "iPhoto"
    activate
    get every photo
    get comment of photo id 4.294977224E+9
    (*comment of photo id 4.294977224E+9*)
    offset of "[known string]" in comment of photo id 4.294977224E+9
    «event ascrgdut»
    offset of "[known string]" in comment of photo id 4.294977224E+9
end tell
tell current application
    offset of "[known string]" in «class pcom» of «class ipmr» id 4.294977224E+9
Result:
error "iPhoto got an error: Can’t make comment of photo id 4.294977224E+9 into type string." number -1700 from comment of photo id 4.294977224E+9 to string

Редактировать: Сегодня утром у меня было время повозиться с ним, и похоже, что какое-то приведение типов было всем, что было нужно. Этот код успешно изменяет первую найденную фотографию:

tell application "iPhoto"
    activate
    set thePhotos to get every photo
    repeat with aPhoto in thePhotos
        if aPhoto's comment contains "[known string]" then
            log aPhoto's comment as text
            set theComment to aPhoto's comment as text
            set theComment to text 1 thru (offset of "[known string]" in theComment) of theComment
            tell aPhoto to set it's comment to theComment
            log aPhoto's comment as text
            exit repeat
        end if
    end repeat
end tell

Теперь создайте резервную копию моей библиотеки и удалите exit repeat. И, вероятно, пойти и сделать что-то еще на время, пока он работает:

Ответы [ 2 ]

4 голосов
/ 17 января 2011

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

tell application "iPhoto"
    set thePhotos to get every photo
    repeat with aPhoto in thePhotos
        if aPhoto's comment contains "theString" then
            tell aPhoto to set it's comment to "newString"
        end if
    end repeat
end tell
1 голос
/ 03 июля 2012

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

tell application "iPhoto"
    activate
    set thePhotos to get every photo in current album whose comment contains "TEST123"
    repeat with aPhoto in thePhotos
        tell aPhoto to set it's comment to "123TEST"
    end repeat
end tell
...