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