iPhoto说它必须重建它的数据库,然后之前的事件手动排序都搞砸了。
我尝试从备份中恢复较旧的数据库,但iPhoto会再次重建,再次弄乱它。
我 能够从iPhoto图库备份中的AlbumData.xml
文件中提取事件的原始顺序(遗憾的是,编辑此文件无法修复订单)。< / p>
我找不到用AppleScript或其他任何东西改变手动事件顺序的方法(也许你可以用SQLite以某种方式来做)。
但是编辑iPhoto事件标题,添加数字前缀(“1.我的第一个事件”,“2。我的第二个事件”)似乎更可行,然后按标题而不是手动对事件进行排序。这似乎也不那么脆弱了。可以将新事件命名为“1.1我的中等事件”。
但要实现这一点,如果我能以编程方式批量编辑标题将会很方便。那可能吗?我在AppleScript词典中看不到任何有用的内容。
答案 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")
# …