Я искал через 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"
части, но не знаю, что сказать. Если важна иерархия организации фотографий в библиотеке:
- Каждая фотография организована в хронологическом порядке в события. (События - моя основная форма организации.)
- Есть много альбомов, но не все в альбоме.
- Существует один умный альбом, который содержит каждую ошибочную фотографию. Это, конечно, основано на наличии известной строки в описании фотографии. Так что я полагаю, что об этом следует помнить, если окончательный код перебирает фотографии в этом умном альбоме, поскольку умный альбом может изменять итеративный массив, не так ли?
У кого-нибудь есть ссылки или примеры кода, чтобы помочь мне? И наоборот, кто-нибудь знает лучший способ сделать это одноразовое массовое исправление?
Редактировать: Я запустил тест со следующим кодом:
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
. И, вероятно, пойти и сделать что-то еще на время, пока он работает: