Можно ли программно редактировать заголовки событий iPhoto в пакетном режиме?

iPhoto заявила, что ей пришлось перестроить свою базу данных, после чего предыдущая ручная сортировка событий была нарушена.

Я попытался восстановить старую базу данных из резервной копии, но iPhoto просто перестроил ее снова, снова все испортив.

Мне удалось извлечь первоначальный порядок событий из файла AlbumData.xml в резервной копии библиотеки iPhoto (к сожалению, редактирование этого файла не исправит порядок).

Я не могу найти способ изменить порядок событий вручную с помощью AppleScript или чего-либо еще (может быть, вы могли бы как-то сделать это с помощью SQLite).

Но представляется более целесообразным редактировать заголовки событий iPhoto, добавляя префиксы чисел («1. Мое первое событие», «2. Мое второе событие»), а затем сортировать события по названию, а не вручную. Это также кажется менее хрупким в будущем. Новые события могут быть названы «1.1 Мое среднее событие», чтобы быть промежуточными.

Но для этого было бы удобно, если бы я мог пакетно редактировать заголовки программно. Это возможно? Я не вижу ничего полезного в словаре AppleScript.


person Henrik N    schedule 08.02.2014    source источник


Ответы (1)


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

Это довольно уродливая и хакерская смесь Ruby (мое любимое оружие) и AppleScript, и она написана для решения моей конкретной проблемы, но, вероятно, дает хорошее представление о том, как вы можете это сделать:

def osascript(cmd)
  system "osascript", "-e", cmd
end

def assign(number, name)
  `echo | pbcopy` #  clear out clipboard in case the title is empty and the cmd+c fails
  osascript %{tell app "System Events" to keystroke "c" using command down}  # copy
  actual_name = `pbpaste`
  name_was_empty = actual_name.to_s.chop.empty?  # names generated from dates may show as empty when you try to edit them

  if (actual_name == name) || name_was_empty
    puts "go on"
    osascript %{tell app "System Events" to keystroke (ASCII character 28)}  # left
    osascript %{tell app "System Events" to keystroke "#{number}. "}
    osascript %{tell app "System Events" to keystroke #{name.inspect}} if name_was_empty
    osascript %{tell app "System Events" to keystroke tab}
  else
    puts "Got: #{actual_name.inspect} but expected #{name.inspect} (number: #{number})"
    osascript %{tell app "iPhoto" to display dialog "Not the name I expected. Bailing!"}
    exit 1
  end
end

osascript %{tell app "iPhoto" to activate}
osascript %{tell app "iPhoto" to display dialog "Click the first event title and wait…"}
sleep 3

# You would probably loop over some data structure here.
assign(1, "My first event")
assign(2, "My second event")
# …

Также доступно как Gist.

person Henrik N    schedule 08.02.2014