AppleScriptでAperture内写真のメタデータを設定する(その1)

デジカメで撮影した写真の管理をiPhotoで管理していたのですが、私が使う分には機能的には十分なのに数万枚の写真の中から目的の写真を探し出すのに必要な写真に付けたコメントやキーワードといったメタデータがめちゃくちゃになるという致命的な欠陥がなかなか直らなくて業を煮やして一時期Apertureへ移行しました。しかしApertureはiPhotoより編集機能を強化した影響か、写真をパラパラめくっていくときに「読み込み中...」というメッセージが一瞬表示されてわずかな時間ではありますが待たされてiPhotoに比べサクサク感がなくストレスが溜まるという不満がありました。多分編集に備えていちいち前準備をしているものと推測されますが、単に写真をブラウズするときにそんな無駄な処理する必要はなく、ユーザーが編集の意思を示したときに準備すればいいのにとちょっと落胆。また最新版のiPhotoに戻って見たのですが、以前ほどではないにしても何らかのタイミングでコメントが崩れる現象が発生。さらに検索時にメタデータを確認して見ても明らかに違う写真が引っかかったり逆に正しくメタデータを設定しているのを確認した写真が引っかからなかったりとこちらも使い物にならず。AdobeのLightroomも試して見たのですがこちらはマウスのスワイプでスクロールすると一枚一枚スクロールするのではなく一気に何枚もすっ飛んでしまうという「何だこれ?」仕様だし、何より調べた範囲では私がメタデータの設定や管理を自動化するためのAppleScriptやJavaScriptによるスクリプティングに対応していないようで、こちらも脱落。その結果スクロール時の待ち時間の問題はあるものの今のところメタデータの不具合は確認しておらず、AppleScriptでの自動化に対応しているApertureに戻ることにしました。

そこで実験の第一段として選択した写真のタイトルを設定するAppleScriptを書いて見ました。マニュアルがないのでネットで検索しながらのトライ&エラーの繰り返しですが、Apertureに関してはiPhotoに比べ情報が少なく難儀。まず現在表示しているプロジェクト情報を取得する方法がわからず、四苦八苦した結果解決しましたが、iPhotoで

set thePhotos to photos in current album

の1行で済むものがApertureでは

to getCurrentProjectInfo(selectAll)
     tell application "Aperture"
          set thePhoto to item 1 of (get selection)
          set theProject to parent of thePhoto
          if selectAll is equal to true then
               set selectedPhotos to every image version in theProject
          else
               set selectedPhotos to get selection
          end if
          return {CURRENT_PROJECT:theProject, SELECTED_PHOTOS:selectedPhotos}
     end tell
end getCurrentProjectInfo

ほどのコードが必要でした。ほんとに疲れた...

しかしこれを契機にメタデータの一つである写真のタイトルを設定するスクリプトが完成したのでこれからはすんなり進みそうです。
コード全体は以下のとおりです。

--
-- Aperture Test
--
property TIME_OUT : 86400
property TAG_TITLE : "ObjectName"

on run
	my setTitle()
end run

--
-- タイトルの設定
--
to setTitle()
	tell application "Aperture"
		activate
		
		display dialog "タイトルを入力してください" default answer ""
		set theTitle to text returned of result
		if theTitle is equal to "" then return
		
		set curProjectInfo to my getCurrentProjectInfo(false)
		set theProject to CURRENT_PROJECT of curProjectInfo
		set selectedPhotos to SELECTED_PHOTOS of curProjectInfo
		--display dialog ((name of theProject) as string) & " #images=" & (count of selectedPhotos)
		repeat with thePhoto in selectedPhotos
			log (name of thePhoto) as string
			set theTags to IPTC tag of thePhoto
			tell thePhoto
				if exists IPTC tag TAG_TITLE then
					set value of IPTC tag TAG_TITLE to theTitle
				else
					make new IPTC tag with properties {name:TAG_TITLE, value:theTitle}
				end if
			end tell
		end repeat
		
		beep
		display dialog "Complete." buttons "OK" default button 1
	end tell
end setTitle

--
-- 現在開いているプロジェクト情報取得
--
to getCurrentProjectInfo(selectAll)
	tell application "Aperture"
		set thePhoto to item 1 of (get selection)
		set theProject to parent of thePhoto
		if selectAll is equal to true then
			set selectedPhotos to every image version in theProject
		else
			set selectedPhotos to get selection
		end if
		return {CURRENT_PROJECT:theProject, SELECTED_PHOTOS:selectedPhotos}
	end tell
end getCurrentProjectInfo

 

【作成・確認環境】
MacOS X v10.8.5
AppleScript Editor v2.5.1

一覧に戻る