Синтаксис AppleScript для автоматизации iPhoto

Я искал через 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. И, наверное, займемся чем-нибудь другим, пока он работает :)


person David    schedule 16.01.2011    source источник


Ответы (2)


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

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
person dscl    schedule 17.01.2011
comment
@dscl: Выполнение теста с exit repeat после первого перехвата условного выражения, но я получаю сообщение об ошибке. Добавление вывода событий к вопросу. Может быть, вместо comment должно быть что-то вроде description? Может быть, comment - это объект, который сам имеет текстовое поле, которое я ищу? - person David; 18.01.2011
comment
@david: Какую версию iPhoto вы используете? Возможно, они изменили имена из версии, в которой я тестировал. - person dscl; 18.01.2011
comment
@dscl: '11 (недавно обновлен с '08 через новый магазин приложений, поэтому изначально библиотека была '08). - person David; 18.01.2011
comment
@david: Ах, ладно, я тоже пользуюсь iPhoto '08, но у меня есть друзья, которым должно быть 11. Я посмотрю библиотеку на одной из их машин при первой возможности. - person dscl; 18.01.2011
comment
@dscl: Замечательно. Могу ли я тоже это изучить? Думаю, я просто не знаю, с чего начать разработку AppleScript. Но если есть библиотека или объектная модель, на которую я могу сослаться, тогда я могу немного поэкспериментировать с кодом. - person David; 18.01.2011
comment
@david: Я должен пойти сегодня вечером к своим приятелям, у которых есть iPhoto '11, чтобы я мог посмотреть его тогда. Извините за задержку. Между тем, если вы откроете редактор сценариев, когда iPhoto загружено, вы сможете просмотреть библиотеку приложения. Проверьте свойства объекта Photo. - person dscl; 20.01.2011
comment
@dscl: Я сейчас просматриваю функцию словаря в редакторе AppleScript (просто ковыряюсь, никогда раньше не видел эту часть). Когда я захожу в Словарь iPhoto, выбираю пакет iPhoto и фото, свойство комментария отображается в виде текста. Странный. - person David; 20.01.2011
comment
@dscl: У меня было время поработать с этим сегодня утром, и похоже, что ему просто нужно было какое-то приведение типов, чтобы работать (обновленный код в вопросе). Спасибо за помощь! - person David; 23.01.2011

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

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
person Bubba    schedule 03.07.2012