2011-01-16 3 views
4

Я искал информацию через Google для некоторых указателей, чтобы заставить меня перейти к чему-то, что мне нужно сделать в iPhoto через AppleScript, но пока не нашел много. Существуют различные старые обсуждения сценариев для различных старых версий 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. В альбоме есть один умный альбом, в котором содержится всякая странная фотография. Это, конечно, основано на наличии известной строки в описании фотографии. Поэтому я полагаю, что, возможно, это нужно иметь в виду, если конечный код проходит через фотографии в этом умном альбоме, так как смарт-альбом может менять массив, который повторяется, нет?

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

Edit: Я побежал тест с помощью следующего кода:

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 

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

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

ответ

4

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

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 
+0

@ dscl: Выполнение теста на этом с помощью 'exit repeat' после первого catch условного, но я получаю сообщение об ошибке. Добавление вывода событий в вопрос. Может быть, 'comment' должен быть чем-то вроде' description' вместо этого?Может быть, 'comment' - это объект, который сам имеет текстовое поле, которое я ищу? – David

+0

@ david: Какую версию iPhoto вы используете? Возможно, они изменили имена из версии, в которой я тестировал. – dscl

+0

@ dscl: '11 (недавно обновлен с '08 через новый магазин приложений, поэтому библиотека изначально была '08). – David

1

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

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