FileMakerでメディア管理のデータベースの作り方その14。ExifTool を使うシリーズまだ続きます。ファイル情報の詳細パネルレイアウトを追加、閲覧、編集、メタデータの埋め込みを行えます。オリジナルを弄るので複製機能も設けました。あとオマケ的にGPSからマップ表示のパネルを追加。
MediaDB R14 の新しいこと
ここしばらく ExifTool の使用開始に関する話が続いていますがまだ続きます。R14 の新しいことは以下の通りです。
- ファイル情報の詳細を表示するレイアウトを新設しました。
- メタデータを現在のレコードにも埋め込めるようになりました。
- レコードとファイルを複製する「バージョン」の機能を追加しました。
- その他「このアプリで開く」やGPSマップ表示パネルなど
MediaDB R14
DownloadMediaDB_R14.zip
Mac専用です。FileMaker 19.3以上。ExifTool 必須。
R14 update 2023.09.30
マニュアルページ作り始めました → 使い方 最新のバージョンに準じています。
ファイル情報詳細パネル
前回エクスポートでメタデータを追加できるようにしました。今回は、登録しているレコードのファイルを直接変更し、メタデータを追加できます。フィールドとして用意したいくつかの項目を追加したり消したりできます。
これを実現するに合わせて、またまたフィールドを追加しました。作成者情報や撮影場所に関するフィールドを増やし、作成者の住所や電話番号まで入力できるようになりました。撮影場所も国、地域、住所や場所名まで、さらにGPS緯度とGPS経度と、いずれもメタデータのタグに同じものがあるフィールド版です。増やしました。
無駄にフィールドが増えたので右側ペインの概要欄では表示しきれません。そこでファイル情報の詳細パネルを用意しました。
とりあえず詳細を開くボタンでカードとして表示させます。優柔不断なので同じ役割のボタンを二箇所に。
このボタンで次のようなレイアウトが開きます。
ざっくりした分類ごとの詳細表示
フィールドをざっくりした分類(ファイル、作成者、見出しと概要など)で分け、フィールドと同じ場所の下半分にメタデータをポータル表示しています。
フィールドを編集できます。例えば上図だと、ファイル名やパスは弄れませんが管理名は変更可能です。
フィールドにはメタデータと密接なものとそうでないものがあります。「管理名」や「セッション名」なんかはメタデータと何の関係もありません。作成者情報、見出しや概要やキーワード、場所、そういったものはメタデータのタグに同じものがあり密接です。
ざっくりした分類ごとに、関連するフィールドとメタデータが表示されます。
下段の枠内がExiftoolで取得したメタデータで、metadataテーブルがポータル表示されています。。
上段はテーブル内のフィールドです。フィールドで編集した内容はレコードに保存されるだけで、ファイルには何の変更もなされません。そのままでもいいのですが、メタデータとしてファイルに埋め込むこともできます。エクスポートですでに実現している同じことを、エクスポートではなく現状のファイルに対して行えます。
パネルの右側に、ファイルに書き込んだり操作するボタンを配置しました。
肝心なのは、これらはオリジナルファイルを直接変更できてしまうことです。という次の話に移る前に、ファイル情報詳細パネルの中にある「撮影場所」について補足入れておきます。
補足: 撮影場所 – GPS を書き入れる
GPS情報を読み込んでマップに表示する新機能(笑)についてはこの後で出てきます。それとは逆に、Exif の GPS 情報がない画像に、手動でGPSを書き込むことも可能です。ファイル情報詳細パネルに、GPS緯度、GPS経度のフィールドがありますので、ここに座標を入れれば「メタデータを埋め込む」で埋め込めます。
GPS緯度経度の座標がわかっていればいいのですがそんなもの普通はわかりません。GoogleMapを利用して座標を取得する方法を書いておきます。同じことを ExifToolのかんたんなメモ にも書きましたががこちらでも。
GoogleMap で場所を特定したらコンテキストメニューを表示させます。一番上に出てくる数字が緯度・経度ですのでクリックしてコピーします。座標を選んだら勝手にコピーしてくれますよ。
緯度と経度がカンマで区切られていますので、上図ならGPS緯度フィールドに「35.01468」GPS経度に「135.74808」を入力します。
Exiftool でゲットできるデフォルトのGPS座標は数字の羅列ではない別の書式ですが、数字による座標でも問題ありません。「埋め込み」ボタンでメタデータとして追加できます。
オリジナルファイルを変更すべきではない
さて、さっきの話の続きです。ファイル情報詳細レイアウトの右側に、ファイルを変更してしまう機能のボタンを配置しました。
ファイルを変更する機能を付け足した尻から言いますが、オリジナルファイルをおいそれと変更すべきではありません。これは当然ですよね。が、オリジナルに不備があってそれを修正したいだけのケースもあるでしょうし、そもそもインポートしたファイルが最初から複製品でオリジナルではないというケースもあるでしょう。ですのでこういう措置を平然と付けました。
とはいえ、オリジナルに手を付けないのが原則なので、そのためひとつ機能を追加しました。即ち、レコードとその登録メディアの複製を作成します。
レコードのバージョン
よし。複製を作ろう。ということでバージョンという機能です。右側ペインに「バージョン」パネル、設けました。
そもそもこのFMファイル MediaDB にはRというバージョンがありますし、ライブラリ管理でもライブラリバージョンがあります。今度はレコードのバージョンですか。こいつ、つくづくバージョン好きやな—。と思われたかもしれません。昔チルドレンクーデターを解散した数年後、チルドレンクーデターVer.Booという名前でナンチャッテ復活していたことがありまして、ここDigitalBooもその活動の一環として作られ名付けされたという、そんな経緯がバージョン好きの由来かもしれません。どうでもいい話をすいませんでした。
バージョン機能ですが、単なるレコードの複製です。レコードだけじゃなく登録したメディアも複製されます。何のための複製かというとオリジナルを守るためです。バージョンを作ってそのメディアをどう改編しようとも、複製元の安全は担保されます。
バージョンのファイルは必ず「格納」で複製されます。複製先を指定したりもしません(それエクスポートと同じですし) 自動でしかるべきフォルダに格納されます。
そして、複製元の情報が保持されます。複製元を親、バージョンを子であると見立てているわけです。バージョンはいくつでも作成できます。でもバージョンのバージョンは作れません。
バージョンを作成する
バージョンパネルからバージョンを作成できます。
スクリプトが必死こいて働き、レコードが複製されメディアが格納で複製されバージョンが出来上がります。ファイル名に version 1 と付き、管理名にも付きます。裏でパスの記述も変更済み、メタデータも再取得済みです。レコードには黄土色の Version の印が付き、複製元レコードも示されます。
複製元のレコードをアクティブにすると、バージョンを持っていることを示す印が付き、このレコードから作られたバージョンが一覧されます。
親子関係を保持した複製、バージョンが成立しました。実を言うと「だから何なん?」という話でもあります。改変できるようになったといってもメタデータを付けたり消したりするくらいで、大それた編集ができるわけでもありません。バージョンの必要性は今後さらに高まると期待します。
その他
GPSでナンチャッテGoogleMap
Exiftool でGPS情報を得られますから、InfoパネルのGPSパネルに配置したWebビューアにマップを表示させることにしました。
高度かつ本格的な実装ではなくナンチャッテURL表示です。本格的とナンチャッテで何が違うのでしょう。見た目がぜんぜん違います。まず目に入るのは謎の表示です。こんなのです。
これは不細工。なんですかこれは。これの正体はサイドパネルです。レスポンシブも何もあったもんじゃない困ったCSSのなせる技、まったくもってGoogleのデザイン力の底力ですね。
「閉じる」ボタンで邪魔なサイドパネルを閉じないと何も見えません。どうか手動で閉じてください。閉じるボタンてどこにあるの?ここです。
余談ですが、このInfoパネル、作り始めはもっと幅の狭いパネルでした。ですがこのGoogleMapを表示したときに幅が狭いと「閉じる」ボタンが隠れてしまい表示されません。表示されないから畳めません。最初なにが起きているのがわからず随分考え込んだものです。で、このサイドパネルをデフォルトで消す設定もパラメータも見当たらず、仕方なしに「閉じる」が表示されるギリギリまでパネル幅を広げました。
サイドパネルを手動で閉じるとようやく地図が見えてきます。やれやれ。
というような、まことにいい加減なナンチャッテ地図表示です。すぐ下にウェブブラウザで表示するボタン置いときましたので勘弁してください。
このアプリケーションで開く
infoパネルに A マークの「デフォルトアプリで開く」ボタンがあります。
こっそりAの横に他のアプリで開くポップオーバーを追加しました。特定アプリでレコードのメディアを開けます。
当然ながらインストールしているアプリケーションはそれぞれでありまして、こんなボタンを設けるのは問題もあります。ここは各自インストール済みのアプリを元にカスタマイズしてください。
ボタンの設定では、スクリプト指定に「このアプリで開く」を選択し、引数にアプリケーション名を入れます。アイコンは適当にアプリから持ってきてセットしてください。
スクリプト引数にアプリケーション名を書くことでこのボタンスクリプトが機能します。アプリケーション名はあまり厳密ではありませんが、AppleScript が理解できる名前である必要があります。例えば「プレビュー」では開きません。「Preview」にすると開きます。
仕組みの解説
この小さな機能についてはこの場所で仕組みの解説もしておきます。スクリプト引数で指定されたアプリケーションでレコードのファイルを開くコードを CodeRun しています。
使用するコードは UNIXコマンドの open ではなく、AppleScriptの using (path to application “アプリ名”) です。open では次のように書きます。
open -a '$アプリ名' $POSIX
AppleScript では次のように書きます。
tell application "Finder" activate open POSIX file "$POSIX" using (path to application "$アプリ名") end tell
どちらも同じ働きですが、ゆるさで AppleScript に軍配があがりました。例えばアプリ名に「Photoshop」とだけ書いて実行させると、open は動きませんがAppleScriptは動きました。AppleScript が緩いというのはこのことですね。open ではもっと正確にPhotoshopのアプリケーション名を書かねばならないんです。
そんなわけで、このボタンバーをカスタムして使ってください。特定アプリを指定して開くボタンは便利です。ただしオリジナルファイルをホイホイ開いて編集できてしまう危険性があります。
参照ファイルではオリジナルファイルが変更され、格納ファイルではFileMakerがおかしなことになります。そういう危険がありますので気をつけて使用します。
参照を格納に、格納を参照に変換する
他にこっそり追加しているのは、レコードの登録方法を変換するスクリプトです。参照なら格納に、格納なら参照に変更します。
レコードが格納なら「格納を参照に変換」参照なら「参照を格納に変換」と、現状と反対のメニューが現れます。
格納登録しているメディアに「インポート元」の情報が無い場合、または、インポート元にすでにそのファイルが存在しない場合があるかもしれません。そんなときは新たな場所をダイアログで指定します。そこに一旦書き出して読み込みます。
仕組み
このスクリプトは、ファイルパスやインポート元パスを元に、再挿入してパスの記述を更新しているだけの単純な処理です。技術的に興味深い内容ではありません。ただ、これを作るに当たって「インポート元パスモドキ」フィールドを新規に作成し、これまでの「パスモドキ」と差別化、扱いを大きく変更しました。インポートの際、各テーブルを結びつけていた「パスモドキ」ですが、「インポート元パスモドキ」に変更しました。
役割を変更というか修正したわけです。パスモドキは現在のファイルPOSIXのパスモドキです。インポート元パスモドキはインポート元パスをPOSIXに変換したパスモドキです。この役割を明確にしました。
仕組み編
では他の仕組み編行きます。
Map表示 データ取得と表示の仕組み
ExifToolでゲットしたGPSメタデータによってGoogleMapを表示させています。単にパラメータ付きURLをWebビューアで表示させているだけです。本格的でライセンスが必要な仕組みを利用しているわけではありません。
ExifTool ではゲットするGPSの書式を指定できます。GoogleMapで直接使える書式で取得することもできますが、ここでは指定せずにデフォルトのままゲットし、フィールドの計算式で少し整形して済ませています。
書式指定をせずに取得した結果は「34 deg 51′ 51.71\ N」このような形なので、GoogleMapのURLパラメータで表示可能な「34°51’51.71N」こういう形に整形しています。
・「 」(スペース)を消す
・「deg」を 「°」に置換
・「\」を消す
こういう処置です。
(参考)ExifToolのかんたんなメモ: Google Map で検索できるGPS表記をゲットしたい
メインテーブルのフィールドにGPS緯度GPS経度から計算して「緯度,経度」となるフィールド GPSposition を作っていまして、これを GoogleMapのURLパラメータとして利用します。Webビューアのアドレスに以下を書いておきます。
"https://www.google.co.jp/maps/search/?api=1&query=" & mainData::GPSposition & "&output=embed"
output=embed と最後に書いたらサイドパネルが非表示にできないかと思いましたが出来ませんでした。
ファイル情報詳細パネル
ファイル情報パネルではオリジナルに手を付けるスクリプトがボタンとして配置されています。
メタデータを埋め込んだり取り除いたりするグループ、日付を変更するグループ、そしてパスを変更するボタンがあります。これらはそれぞれ全然違うスクリプトです。
メタデータ
追加するメタデータの分類を指定して、追加したり消したりできます。仕組みはエクスポート時と同じです。メタデータのタグ名とFileMakerのフィールド名を関連付けるmetaKeysテーブルに従い、タグ名=’フィールド内容’ またはタグ名=’ ‘ のオプションを作成してExiftool のコードを完成させ CodeRun します。ざっくり以下の流れです。
- 指定されたグループを取得(作成者とか見出しと概要など)
- 埋め込むか取り除くかの設定を取得しておく
- metaKeysに移動。 指定グループかつoutput_fieldに値があるレコードを検索
- 対象レコードをループしてタグ名(key)フィールド名(output_field)をタブ区切りのリストとして作成
- mainDataに戻り、上記リストを回してフィールド内容を value として追加。この時「取り除く」なら値はすべてスペース。
- 同時に、タグ名に – と = を付けたりしつつ -key=’value’ の形でリストを作成
- そのリストの改行をスペースに置換して「-key=’value’ -key=’value’ -key=’value’」の形に整形してオプション完成
- CodeRun の ExifTool の該当コードからオプションを上記オプションに置換、パスを指定して CodeRun実行
※ CodeRun の該当コードは「exiftool $OPTION $POSIX」です。
※ metaKeys はタグ名データベースで、フィールド名やカスタム分類などを施してあります。
すいません、詳細な説明は割愛します。何のことやら判らない方は過去記事・関連記事をご参照ください。
metaKeys の詳細は投稿を追加しました。
日付
日付の変更はコマンド setfile を使っています。setfile は日付の書式が独自ですのでそれに合わせてから指定パスに対して実行します。作成日は setfile 変更日なら touch でいいんですが、ここではどちらも setfile を使っています。
setfile -d "mm/dd/yyyy HH:MM" 目的パス
setfile -m "mm/dd/yyyy HH:MM" 目的パス
-d が作成日、-m が変更日です。
ファイル名やパス
「ファイル名やパスを変更する」はファイル名を変えたり、オリジナルファイルの場所を移動できます。こちらはコマンド mv を使った措置です。
変更後は自動でレコードのパスを修正します。が、肝心の名前や場所を指定するための親切なUIは用意していません。単純にパスを手動で書きます。雑ですいません。いずれもうちょっと親切なUIを追加したいと思います。
バージョン
バージョンは旧実作編にもありましたが、実装を躊躇していたのは「単なる複製では満足できないな」と考えていたからです。でも単なる複製でいいじゃん。と気が変わりました。むしろ単なる複製こそ必要。とすら。
難しいことはやっていません。parent_id フィールドを設けました。ID が 1 のレコードを複製すると parent_id に 1 が入ります。これにより親子関係が作られます。
mainData のテーブルオカレンスを複製して親と子を作ってリレーションすれば概ね完了です。
parent_id が空でなければ、それは parent_id = ID の複製です。「バージョンである」と判定できます。
mainData から見て、子mainData の parent_id が空でなく己のIDと等しいなら、それは己の子です。「バージョンを持っている」と判定できます。
バージョンパネルには親mainDataと子mainDataのポータルを置いて、親を示したり子をリストしたりしています。
複製は「格納」で作成しますから、パスの生成がちょっとだけ計算面倒ですがそのために「オブジェクトフォルダパス」だの「格納時のフォルダパス」だの、すでにフィールドを作っております。それらを組み合わせて新しいパスを作って置き換えます。
この時注意が必要なことがひとつあります。格納で保存する際、FileMakerが拡張子を変更するケースが希にあります。ですので、複製して挿入した直後、GetAsTest を使って「どういう名前で保存されたか」を確認し、パスに反映させなければなりません。
バージョンについては投稿を分け、以下でもっと詳しく書いています。引き続きご覧ください。
おわりに
Exiftool の使用をずっと待ち構えていました。インポート、エクスポート、そして今回のいろいろ細かい実装となりました。ここまでが Exiftool シリーズ一区切りです。
実作編リメイク完了
以前の旧実作編シリーズをリセットしてリブートしてリメイクしたのが本シリーズです。旧実作編はv5.1までありました。今回のR14で、実作編の内容をほぼすべてカバー、リメイク完了しました。5つの記事とファイルをリメイクするのに14個かかったという、如何に実作編がすっ飛んでいたか伺えるというものです。