FileMakerで作るメディア管理。コツコツ作って逐一報告、今回から ExifTool を使っていきます。画像データベースがステップアップする実感が得られるでしょう。
MediaDB R12 何が新しいか
R12の特徴は以下の通りです。
- 今回からExiftool を使います。
- それを前提にインポートスクリプトを刷新。インポート LEVEL 4 となりました。
- インポート設定の条件のひとつ「インポートする拡張子」のプリセットが作成できるようになりました。
- インポート設定の条件に「パッケージ内部のファイルを除外」が追加されました。
- Exiftool で取得できるタグと同じ名前のフィールドがメインテーブルにいくつか追加されました。
その他、仕組みの部分を大幅にいじくり倒しています。
- スタートアップスクリプト
- ライブラリ管理
- フィルターペイン、フォルダ階層ペイン、メタデータペイン
- DBTools/FileType の機能
内部的には驚異的な変更があって夜な夜なデバッグに苦しんでおりました。どうぞダウンロードしてバグ出しにご協力お願いします💦
MediaDB R12
DownloadMediaDB_R12.zip
Mac専用です。FileMaker 19.3以上
R12(12.12) 2023.08.22 ミスをいろいろ修正
最新のバージョンは INDEX から確認してください。
マニュアルページ作り始めました → 使い方 最新のバージョンに準じていますが。
Exiftool インストール
姿を持たないコマンドラインツールの ExifTool です。Exif、IPTC、XMP、あらゆるメタデータを取得できる最強ツールで、市販の写真管理アプリなんかにも組み込まれています。MediaDB には組み込んだりできませんので、あらかじめインストールしておいてください。今回からこいつが使用できることを前提とします。
公式からダウンロードできます。インストーラーを用意してくださっているので、どなたにも簡単にインストールできます。
MediaDBでは、スクリプトから ExifTool に働きかけて動かします。インストールされた場所が /usr/local/bin/ であることを前提にしていますので、もし異なった場所にインストールされた場合は対応が必要です。CodeRun の歯車アイコンから「ExifToolの場所」を入力してください。インストーラーに従ってインストールされた場合は変更の必要ありません。
もしこれを機会に初めて Exiftool をインストールしたなら、ターミナルでちょちょっと遊んでみるといいかも。ターミナルで「exiftool」と書いて半角スペース、そこに適当に画像ファイルをドラッグします。リターンすると、たくさんのメタデータが出現して「すげー」ってなります。これがExifToolです。
「exiftool パス」が基本の形ですが、いろいろなオプションを指定して自在に操れます。
「exiftool <オプション> パス」の形になります。オプションに何をどう書いたら如何様になるのか、かんたんにまとめた投稿がありますのでご参考に。
ところで、少し前のバージョンからシェルスクリプトをちょくちょく使っています。ターミナルの初期設定で、仕事が終わればウインドウを閉じるように設定しておくことをオススメします。
使い方
ExifTool の利用を前提に、インポートスクリプトを刷新しています。インポート LEVEL 4 となりました。まずは使い方をおさらいします。技術的なお話は後のほうに置きます。
インポート
では使い方ベースで見ていきます。最初は空なので何かインポートして使い始めてください・・・と、いつも書きますが、そのインポートについて今回は丁寧目に順を追っていきましょう。
インポートのボタンから設定パネルが出てきますので設定します。
登録方法 – 参照または格納
最初の大きな選択は、登録を参照で行うか格納するかの決断です。何となく、このファイルは参照登録をベースに作られています。作り手が参照ばかり使うからです。
インポート対象 – フォルダまたはファイル
次にインポート対象です。フォルダからまとめてインポートするか、ファイルをひとつだけ選ぶかです。ファイルを選んだ場合はそれ以上の設定項目はなく、下に「ファイルをインポート」ボタンが現れています。クリックするとダイアログが開くのでファイルを選択します。たった一つのファイルを登録するのに随分面倒な手続きに思えますが、他のインポート方法は残念ながらありません。
フォルダを選ぶと、さらに設定する項目が現れます。
順番で見ると「拡張子フィルタ」があります。これはちょっと後に回します。
別のライブラリからインポート
今回から急遽「別のライブラリ」という選択肢が登場しました。MediaDBのライブラリフォルダが他にあればインポートできます。例えば R11 をダウンロードされていて今回R12をダウンロードして開いたら「別のライブラリ」でR11のライブラリを選択してインポートできます。
フォルダを選択
「フォルダを選択」ボタンで、ダイアログが開きますから選択します。隣にある小さなボタンはポップアップメニューで、すでにインポート済みのセッション(フォルダインポートで選んだフォルダ)から選べます。
過去にインポートしたフォルダを再度選択することで「インポート」が「更新」となります。未登録や変更されたファイルがあればそれだけをインポートできます。
フォルダの階層指定 全階層または階層限定
フォルダの階層以下にあるサブフォルダを含めるかどうかの設定です。全階層からファイルをゲットするか、指定したフォルダの階層のみに限定するかを選びます。
パッケージの内部を除外するかどうか
フォルダだけどファイルに見えるパッケージというタイプがあります。
Finder ではファイルのように振る舞いますが、それは単にフォルダで、中には沢山のファイルが入っています。よくわからない設定ファイルやリソースなどに満ちていて、インポート元指定したフォルダの中にパッケージが含まれていると、その中のファイルもインポート対象になります。それでいいのか、除外するのかを設定できるようになりました。
拡張子フィルタのプリセット
拡張子をリストに書いておくことで、インポートするファイルタイプを限定できます。
フィルタをなしにすると、あらゆるファイルをインポートします。最早メディア管理ではなくファイル管理の領域です。それでもいいのですが、やはりそこそこ画像や映像や音楽のファイルに限定したい。例えばこの欄に「jpg」とだけ書けば、フォルダを指定してJPEG画像のみをインポートできます。
このリストは手動で書いてもいいですが、DBTools に付属している FileType という拡張子データベースを利用することでも作れます。と、ここまでが前回のあらすじ。今回はさらに踏み込んで、プリセットが追加されました。
あらかじめいくつかのプリセットを用意しています。
ここまでやれるからには、プリセットをカスタマイズできます。そのレイアウトも用意しました。「プリセットを編集」ボタンで次のような画面が現れます。
左側がプリセット名、真ん中の青枠がプリセット内容です。手入力してもいいし、右側のポータルに FileType のレコードが表示されているので利用することもできます。
そしてここまで来れば元となるファイル FileType の高機能化に着手します。FileTypeは拡張子のデータベースですが、フォルダを指定して拡張子リストをゲットしたり、パッケージを探してその拡張子を加えたりする機能を調整しました。
このFileTypeというファイルをきっちり育て「Type」分類を己の手で作り上げれば、メインのデータベースがとても快適になる要素のひとつとなりますよ。
以上のような設定を経て、インポートまたは更新ボタンをクリック、インポートスクリプトが動き出しメディアが登録されます。
ExifTool でメタデータをゲット
刷新したインポートスクリプトでは ExifTool を使用してたっぷりのメタデータを取得しています。インポートの最後に、引き続きメタデータを処理するかどうか訊ねるダイアログを設けたのは、メタデータ取得にそれなりの時間がかかるからです。インポートの最後に続けてもいいし、後でメタデータパネルから行うことも出来ます。
「後で」を選んだら、後でメタデータパネルの下方、歯車から司令を出せます。
可能ならインポートの続きでメタデータ処理までやってしまうことをお勧めします。インポートするファイルが100個や200個ならいいのですが、数千を越えるとさすがに時間がかかりますので、後に回してもいいかもしれません。
追加したフィールド
多くのメタデータのタグのうち、主要ないくつかをフィールドとして追加しています。撮影日(オリジナルデータ作成日)、画像や映像のイメージサイズ、MIMEType、Duration、ビットレート、フレームレートなどです。フィールドへ転記することでレイアウト上の使い勝手が少し上がります。フィールドに昇格させることで、値一覧にしてフィルタパネルで利用することもできますし。
フィールドに追加したことで、リストの中にも登場させられました。
インポート LEVEL 4 で Exiftool を組み入れたことで、一気に世界が広がっております。インポート後は、メタデータパネルで存分に情報を得ることができます。
メタデータパネル
メタデータパネルはこれまでFileMakerのGetContainerAttribute()をゲットしていましたがそれを辞めて、ExifTool をメインに据えました。オマケで GetFileInfo も置いています(これは古いMacのファイルのタイプとクリエータをゲットします)
仕組みを大幅に改善し、ツールごとグループごとに折りたためるようになりましました。ポップアップメニューでいちいち選択してフィルタしていたこれまでとは雲泥の使い勝手となり作った本人もご満悦です。
左に飛び出している小さなボタンは「全て畳む」「全て展開」です。
行の右側あたりにボタンが仕込まれていて、表示しきれない値を確認したり、この項目と一致するレコードを検索できます。
ここからもフィルタできてしまうことについて、インターフェイスデザイン的には散漫でよろしくないのですが、便利だから採用しています。
フィルタペインのフィルタ or と and
フィルタペインもスクリプトを見直し、ついでに操作のインターフェイスを少し変更しています。
ラベル部分が単一のフィルターであることは同じですが、位置をずらして追加(or)と絞り込み(and)を選択できるようになりました。切り替え操作不要です。複合的に or と and を同時に使えることが売りです。果たして問題なく動作するでしょうか。
仕組み編 概要
拡張子・FileType・MIMEType
Exiftool でたっぷりメタデータを取得できるようになったことで、多少の混乱も生まれます。否、より深く物事の真理に触れられます。
MediaDBの始まりから、拡張子というフィールドがありました。これは、ファイル名のお尻に付いている拡張子を抜き出したものです。001.jpg なら「jpg」002.JPGなら「JPG 」拡張子がなければ「n/a」が入ります。
「拡張子」は信頼が置けません。なぜなら、粗忽なユーザーが間違った拡張子を付けることがあるからです。はい。たっぷりそういう間違いファイルがありました。名前が .ai なのに調べてみればpsd だったりすることは普通によくあります。
メタデータで得られる拡張子またはそれに類するタグがいくつかあります。
- FileType … FileType は、jpegファイルなら「JPEG」m4aなら「M4A」と大文字で記されます。
- Extension … 拡張子です。こちらは「00.JPG」というファイル名であっても「jpg」と、小文字で記されます。
- MIMEType … MIMEType はより詳細ですね。「image/jpeg」と、種類と小文字のFIleTypeが記されます。
自作の「拡張子」フィールドは上記のどれでもない大事な情報です。「ファイル名に含まれる拡張子」として、ファイル名やパスに関連する操作に必須です。
FileMaker仕様のファイルパスついてまたまた新事実
この話と関連する FileMaker の仕草について余談いきます。今まで気付いていなかった新事実を知りました。即ち、FileMaker では格納でインポートすると、格納されたファイルは、ファイル名の拡張子が無視され、Extensionが付与されるんです。つまり、名前が変わります。
例えば、001.jpeg というファイルがあって、格納すると 001.jpg に名前が変えられます。計算式でパスを作っても正しく指し示せません。Substitute関数で期待の結果を得られないことも起きます。
面白いことに、GetContainerAttribute でファイル名を取得すると「001.jpeg」と元の名前のまま示されます。GetAsTextすると「001.jpg」と変更された名前が示されます。
この複雑な仕組みを知らずにいたので、ごく希に発生するファイルパスに関する不具合の原因がつかめず、長年苦労してきました。これまで軽い気持ちで作ってきたパスやファイル名や拡張子に関係する計算式を洗い直す必要が出てきました。
FileType.fmp12 の Type という名の分類フィールド
さて、上記Exiftoolで得られる拡張子やファイルタイプの話に戻りまして、ファイルの分類について考察してみます。
MediaDBではファイル分類として FMType というのがあります。これは FileMaker が対応するメディアの拡張子を分類したものです。技術的な分類としては必須ですが、使用者の目線ではどうでもいい分類です。これと似た分類を作ってみようと思いつきました。大雑把に「イメージ」「ビデオ」「オーディオ」などと分ける分類です。フィールドを作成し「Type」と名付けました。
Type の値をなるべく自動で振り分けたい。でも完全に自動化するのは無理です。
そこで、DBTools に入っている FileType の出番です。このファイル、今回結構アップデートしました。このファイルに Type フィールドを設けました。計算式を含み、半自動で分類します。でも最終的には人の手で分類の値を決定します。
メインのデータベースでインポートしたファイル一個ずつを分類するなんて御免ですが、拡張子データベースで拡張子ごとに分類してしまえば後は自動でイケます。
フォルダを指定してファイルをゲットし、その拡張子をレコードに登録するという仕組みを作っていて、作者がすでにそこそこデータを作っています。MIMEType をベースにして半自動で分類した後、手動で値を上書きしていくつか分類。現状はこんな分類の値が記入されています。
このファイルの Type 分類を各自ご自由に育てていただければ、その後のメディアデータベースが良い案配で使用できることでしょう。
Application という分類は、MIMEType でアプリケーション独自のファイルに対して付けられます。例えば psd なら、application/vnd.adobe.photoshop です。
作者はここで勝手な分類に修正しています。psd なら Image にしてしまっています。でも ai は application のまま。それは FileMaker がサムネイル表示に非対応だからです。こんな風に、若干個別の対応を混ぜつつ、Typeという分類を作っています。これは使用者がそれぞれ好きに変更すればいいと思います。
インポート LEVEL 4 Get ExifTool
さて Exiftool を使ったインポート LEVEL4の技術的な解説ですが、あまり詳細を書くと長大すぎて死ぬのでざっくりですいません。
ざっくり流れ
まず Exiftool への指示ですが、結果を JSON で取得します。いちびってるわけではなくて、こうしないと拡張子がないファイルなどで不具合が起きるからです。
これまでは importテーブルと importFMテーブルがありました。ここに importJSONテーブルを追加します。これらはすべてimportテーブルを基軸に、パスモドキで照合してリレーションします。
importテーブルは、find – stat でパスとファイル日付を取得してレコード化します。このテーブルとメインテーブルのリレーションに応じて、インポートするファイルが決定されます。
importFM は、importテーブルがインポートすべきファイルのFMパスを送り込み、FileMakerのインポート機能を発動させるテーブルです。
importJSON は、取得した「ファイルごとのJSONの束をぜんぶ束ねた全体のJSON」をファイル単位に分割してレコード化するためのテーブルです。まずは「束の束」を「束」に分割、つまりファイル単位で展開してレコード化します。その中でようやくファイルパスを特定できます。ファイルパスを特定できて初めてリレーションが成立し、importテーブルと一体化できます。
レコード毎のJSONはまだファイル単位のJSONの束です。それ以上の分割を行わず、インポート作業でメインテーブルのJSONフィールドに束のまま放り込みます。
JSONの束をタグごとに分解してメタテーブルにレコード化するのはインポート作業を終えた後です。インポートLEVEL4では、インポートの終わりに「引き続きメタデータを処理しますか」という選択肢を与えますが、それがまさにこれです。
レコードにメタデータの束を保持しているので、次にタグごとに分割して metadataテーブルにレコード化します。こうしてメタデータペインにタグがだーっと並びます。この展開の作業途中に、一部の指定タグがフィールドへと昇格します。例えば ImageSize というタグがあれば、フィールド「ImageSize」にもその値が入ります。
以上が流れです。もう少し詳しくは、以下の投稿に手を加えましたのでご覧ください。
インポート設定:拡張子プリセット
インポート設定の項目が今回いくつか増えました。その一つが「インポートする拡張子のリスト」のプリセットです。
プリセットを作っておけば、インポート設定で選べます。リストは手動で拡張子を書いてもいいし、右側の拡張子リストを利用してもOKという、これは、DBTools の FileType.fmp12 にあるテーブルです。
当初、メインファイル MediaDB_Rx ファイルのテーブルに作っていたんですが、DBTools のほうに変更したんです。その理由は、メインファイル MediaDB に重要レコードを作りたくなかったからです。プリセットは /Library/DBTools/FIleType.fmp12 にあることを覚えておいてください。
さてこのプリセットですが、ちょっとだけ面白い仕掛けを持っています。「新規プリセット」というレコードだけ特別で、内容を変更するとすぐさま「カスタム」と名前が変更され、新規に空の「新規プリセット」が作られます。
しかもレコード番号が常に最後の数字に。どうですか?これ。
だから何だよ。
パッケージを除外する
今回の目玉のひとつはインポート設定でパッケージを除外できるようになったことです。何年も憧れていた機能をついに実現できました。この件に関しては先にポストしておきました。
Exiftool のタグが一部フィールドへ昇格する仕組み
メタデータをレコード展開していく途中で、特定タグがあった場合にフィールドに昇格します。この仕組みで使用するのは、DBTools の中にある metaKeys.fmp12 です。
このファイルは、タグ名のデータベースです。このファイルは、以前から自作メディア管理とリレーションさせつつ、育ててきました。
まずメインデータのメタデータテーブルにタグが入力されると、同じタグを持つ metaKeys が繋がります。タグを持たない場合は繋がりません。そういうときは metaKeys に新規で作られます。ついでに、値が「値の例」として入力されます。しばらく使っていると、Exiftoolでゲットできるタグのデータベースが充実してきました。
このファイルに「entry_field」というフィールドを一つこしらえて、フィールドとして昇格させたいタグに、フィールド名を手動で書き入れます。
メインデータのテーブルに同じフィールド名をこしらえて、メタデータをJSONからレコード化する際に「同じフィールド名があればフィールドにも値を入れる」というスクリプトステップを追加しておくわけです。
フィールドにしたいタグが常に定まっているわけではないので、このやり方はなかなかいいですよ。例えばオリジナル作成日を取得したい場合、Exiftool で次のようなタグがあります。
Composte – DateTimeCreated
Exif – DateTimeOriginal
EXIF – CreateDate
PDF – CreateDate
XMP – CreateDate
XMP – DateCreated
PDF – DateCreated
XMP – DateTimeOriginal
Matroska – DateTimeOriginal
ざっとこういう感じなので、すべてに「オリジナル作成日」という Entry_field を与えておくと、どんなファイルでも該当タグがあればオリジナル作成日フィールドに値が入るという案配です。ちなみにIPTC の同名タグは含めないのが吉。日付と時間を別に記録しているから同じようには使えません。
メタデータパネル
メタデータパネルを刷新し、折り畳みで閲覧しやすくなりました。上の方でも挙げたこんな感じです。
MediaDB には、左側にフィルタペインとフォルダ階層ペインがあります。どちらもフィルタ(検索)するためのポータルです。右側のメタデータペインもポータルで、作り始めた当初はこの三つは無関係な三つの機能と表示を受け持つものと考えていましたが、作り込むとだんだん理解できてきました。「この三つは三つあるけど、仕組みはどれも同じやがな」
それに気付くのが遅かったせいで、それぞれがそれぞれのフィールドを持ち、それぞれのスクリプトを持っています。根っこは同じなのに。まとめたい。いずれもっとすっきりまとめたい。
ということで、フィルタペインとフォルダ階層ペインを整理していくついでに、メタデータペインも同じ手口で改造を施し、ツールやグループを折り畳めるように変更しました。
ポータルに表示することを目的にした専用テーブルがあって、そのテーブルにどのようにレコードを作っていくかです。まずリストがあります。リスト1行ずつを取り出してレコード化します。この時、階層があったりグループがあったり親となるタイトルがあれば、その親なりグループ名なり、そういうのだけでひとつレコードを作ります。肝心のkeyとvalueは入れません。これがコツですね。この、keyとvlueが空であるレコードが、ポータルで折り畳みのタイトル部分になります。
フィールド「表示」と「open」を持たせます。「表示」が1なら表示する、open が1なら「開いている」を示します。そしてグローバルなフィールドを作って「表示が1のレコードリスト」「openが1のレコードリスト」といった、集計っぽいリストを持たせ、ボタンのスクリプトや集計っぽいフィールドを元に表示をコントロールするスクリプトを作ってやれば折り畳みが実現できます。言葉では分かりにくいが、それほど難しいことをやっているわけではありません。
スタートアップとライブラリ管理
R9 からの流れをぶった切るレベルでスタートアップのスクリプトやライブラリ管理を作り直しました。テストしていると数々の不手際に遭遇したからです。設計の一貫性もなかったし、何がどうなってんのか作ってる本人も判らなくなってきたので一旦ご破算にして作り直しました。
時々発生するFileMakerの接続エラーもかなり減ってきました(まだ壊滅はしていない)
まず何の接続もしないシンプルなテーブルで起動させ、グローバル変数で接続先のパスを決定します。次に存在チェックや接続チェックをして、そのあとメインテーブルを開いて初期設定を済ませるという流れを徹底させました。
ここまでやってもまだ希に接続エラーが出ます。このエラーが出たらもうその時点でファイルが壊れていて二度と復旧しません。ポイと捨てて、バックアップやzipファイルからメインファイルだけを持ってきて入れ替えます。
ライブラリ管理では、バージョン絡み、アップデート絡み、あとやっぱりパス周りで難しいこともありますが何とかなったでしょうか。どうでしょうか。
おわりに
技術的な解説をする気力もなく、ちょっとだらだらした内容になりました。R12は、Exiftool を使ったインポートだけが新ネタのはずでした。ところが、作っては試し作っては試しを繰り返している間に修正箇所が多すぎてたいへんなことに💦 いやーむつかしいですねー。
まあまあそこそこ使えるようになったと思いますがいかがでしょう。問題箇所を発見されたらご連絡ください。