我可以通过编程方式批量编辑iPhoto事件标题吗?

时间:2014-02-08 09:24:54

标签: applescript iphoto

iPhoto说它必须重建它的数据库,然后之前的事件手动排序都搞砸了。

我尝试从备份中恢复较旧的数据库,但iPhoto会再次重建,再次弄乱它。

能够从iPhoto图库备份中的AlbumData.xml文件中提取事件的原始顺序(遗憾的是,编辑此文件无法修复订单)。< / p>

我找不到用AppleScript或其他任何东西改变手动事件顺序的方法(也许你可以用SQLite以某种方式来做)。

但是编辑iPhoto事件标题,添加数字前缀(“1.我的第一个事件”,“2。我的第二个事件”)似乎更可行,然后按标题而不是手动对事件进行排序。这似乎也不那么脆弱了。可以将新事件命名为“1.1我的中等事件”。

但要实现这一点,如果我能以编程方式批量编辑标题将会很方便。那可能吗?我在AppleScript词典中看不到任何有用的内容。

1 个答案:

答案 0 :(得分:0)

我开始手动编号,然后我意识到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")
# …

Also available as a Gist.