FileMaker Pro で画像や映像のメディアを管理するデータベースを作り、ステップバイステップで進めています。今回バージョンR10 はインポート LEVEL 3、ファイル属性である日付を扱います。
インポート LEVEL 3 ファイル日付
画像などメディアファイルをインポートして管理するのだから、ファイル属性である日付情報は欠かせません。と、私は考えております。
しかし FileMaker の機能ではファイル日付をゲットできず、これまではファイル日付をないものとして進めてきました。扱うにはコマンドラインツールの使用が避けられませんので、シリーズ第二期までお預けでした。ということで、この投稿はインポートのスクリプトを作り変えた「インポート LEVEL 3」です。
このバージョンで実現したこと
ファイル作成日と変更日を取得することができるようになったことで、同じフォルダから再度インポート(更新)する際、「既存だからインポート不要」「既存にないからインポート」「あるけどファイルが更新されているのでインポート」と、スマートな判断が行えるようになりました。
ファイル作成日と変更日のフィールドを作ったので、ソートしたりフィルタで扱えるようにもなります。
尚、現時点ではまだExifToolを使っていませんので「オリジナル作成日」「撮影日」といったメタ情報はゲットしていません。それは次のレベルアップ時に実現させます。
R10 使い方
今回のバージョンでは、メインのブラウザが現れる前に、このようなシンプルなスタートアップ画面が出てくるようになりました。ファイル起動時に裏でごちゃごちゃやっているからで、どっちかというと、前回R9から採用したライブラリ方式の難易度の壁にぶち当たっております。
メインブラウザに進むと次のような画面です。最初は空ですので、何かインポートして進めてください。
日付がゲットできるようになっただけで、使い勝手に大きな変化はありません。細かい使い方は以前のシリーズ記事を参照ください。そろそろマニュアルページを別途用意したほうがいいかなあ。
マニュアルページ作り始めました → 使い方 最新のバージョンに準じていますが。
リストのファイル日付ヘッダ
ファイル日付が手に入りましたので、フィルタしたりソートしたりできます。リストに作成日と変更日を追加し、ヘッダのボタンでソートできるようになりました。
メインブラウザはポータルによるリスト表示です。配置するフィールドはお好きにカスタムして入れ替えられます。その時、ヘッダ部分のボタンを複製して内容を書き換えればクールなヘッダを活用できます。ボタンラベルの計算式、指定するスクリプト引数、セグメント指定の部分、そしてボタンオブジェクトの名前と、ちょっと見る箇所が多くて複雑ですが。
フィルタ
こちら左ペインのフィルタコーナーです。「作成年」「作成年月」といった新たなフィールドを作成し、フィルタできるようになりました。
このフィルターペインに表示させるかどうかもカスタムできます。「値一覧」で、表示させるものは名前が「テーブル名::フィールド名」になっています。表示を消したいなら名前を変更します。何かフィールドを表示させたいならそのフィールドで値一覧を作成し、テーブル名::フィールド名の名前を付けます。
大体こんなところで、仕組みは大きく変わりましたが使用感は前回とあまり変化ありません。
R10の実作ファイルをダウンロードできるようにしておりますが、いつものようにまだまだ未発見のエラーがあるかもしれず、見つけ次第修正版を置き直します。おおらかな気持ちで接してください。
もう一つ、他にフォルダ階層についての新機能をテスト的に搭載していますが、テストレベルなのでここでは触れず、次の機会に回します。
FileMaker Pro v19.3 以降。Mac専用。
修正版がアップされることがありますので時々チェックしてください。
update 2023.06.23 (サムネイルR9のミスを修正)
最新のバージョンは INDEX から確認してください。
新発見
R10のファイルはかなりの頻度で更新して再アップし続けています。デバッグを続ける中、またまた今まで知らなかった新事実を知ることとなりました。例えば値一覧の罠、格納でインポートする際の罠です。それらについては次回R11に合わせてまた改めて。
大体以上です。この次は、日付ゲットの意味と仕組みのざっくりした説明になります。
日付をゲットするということ
ファイル属性
ファイルの日付はファイル属性です。ファイルの属性であるからして、絶対にそれは存在します。中身のないデータやメタデータがないファイルはあり得ますが、ファイル属性が何もないというファイルは考えられません。最悪日付がなくても、無理矢理1970年1月1日となっています。ファイルパスと共に、ファイル属性である日付はメディアファイルを管理する根幹に使用してOKです。
これまでは FileMaker の機能で構築してきたので、データの根幹はオブジェクト、またはFMでインポート出来るファイル名とパスでした。今後それは、パス(POSIX)とファイル日付になります。
ファイル属性である日付をゲットするには FileMaker の機能を飛び越えなければなりません。AppleScript からコマンドラインツールを使います。
メタデータの取得 LEVEL 4 AppleScript
FileMakerでメディア管理 – メタデータの取得 で、レベルに応じたメタデータの取得について書きました。
この中で LEVEL 4 としたのが AppleScript です。スクリプトステップ「AppleScriptを実行」を使います。
AppleScript のスクリプトでファイル属性をゲットできますが、ここではもう一捻りして、コマンドラインのツールを呼び出して使います。その理由は、AppleScript で属性を取得するスクリプトを上手く使いこなすスキルが作者にないからです。
AppleScript でコマンドラインを呼び出すには、主に「do shell script」を使用します。
FileMaker はフィールドの計算や変数を扱うのが得意なので、コマンドの記載から出力結果の受け取りまで、一連の流れをこなせます。この作業には CodeManager という自作のファイルメーカー書類の簡易版 CodeRun を使います。これは ライブラリフォルダ/DBTools にありますのでメインファイルからそいつに働きかけています。
ここではコマンドの処理については触れませんので、興味ある方は以下を含めた関連記事をお読みください。
そんなわけで、CodeRun が AppleScript + Do Shell Script でコマンドをばっさばっさと捌きます。
インポートで最初にやることは、find と stat を使って、インポートすべきメディアファイルをリストします。
find と stat
find でパスを特定し、stat でパスと日付を取得してリストを作ります。このリストを元にインポートを進めるやり方です。
find
find は検索のコマンドですね。フォルダまたはファイルを指定してインポートする、その最初としてこの検索コマンドを使います。
find で作ったファイルパスのリストをそのまま stat に送ります。送り込むオプションは exec ですね。exec を使うと、find の結果を別のコマンドに送り込んで処理させられます。
stat
stat はファイル属性を取得できます。ls と違って作成日と変更日を同時に取得できますし、出力の書式を自由に作れます。これがあるから stat なしではなにもできません。結果として「ファイルパス, 作成日, 変更日」を1行としたファイル数分の改行リストを返してもらうことができます。
FileMaker で「ファイルパス, 作成日, 変更日」のリストを受け取ったらそれをImportテーブルにレコード化し、既存のデータと比較した上で不要レコードを削除します。このときファイル変更日を含めているのが今回の最大功績です。既存ファイルがあるかないかだけではなく、変更日が同じかどうかまで見極めて「既存」を判断します。
Importテーブルでは「FileMaker仕様のインポート元パス」も計算で作成します。これを ImportFMテーブルに転記し、次はFileMakerのインポートを行ってオブジェクトやサムネイルを取得します。
最後にImportテーブルとImportFMテーブルからメインテーブルへ転記してインポートまたは更新の作業完了です。
Xcode
ところで stat ですが、聞くところによりますと Xcode に含まれるコマンドなのだそうです。そうなんですか?デフォルトでは入ってないの?未確認ですが、もし stat が使えないようなら、Xcode をインストールする必要があります。
この後は、仕組みと手順を具体的に行きます。
メディアファイルをインポートする仕組みと詳細
MediaDB R10 のインポートは大雑把に次のような流れです。
- 設定 – インポートの条件を設定する
- プリインポート – 複数テーブルを使ったバックグラウンドインポート
- 仕上げ – メインテーブルに転記
それぞれ、細かい仕様もあります。
設定
現状ではメインテーブルの「設定テーブル」にインポート条件のフィールドを用意しており、最初にユーザーとして条件を埋めていきます。その条件に応じてインポートの作業が進みます。
この中でちょっと気になるのは「インポートする拡張子リスト」かと思います。
ここに拡張子を改行リストで書いておくと、その拡張子のファイルのみをインポートします。フォルダを指定してインポートする際、余計なファイルが読み込まれません。
DBTools に FileType というファイルがあります。これは拡張子データベースです。このファイルを使ってリストを作ったりもできます。
FileType はオマケファイルですので使っても使わなくてもいいし、内容をごっそり作り変えても問題ありません。
テーブル
インポートLEVEL3で使用するテーブルは、ImportテーブルとImportFMテーブルです。フィールドは似通っていて、肝心なのは filePathPosix とパスモドキです。すべてのテーブルにPOSIXを元にしたパスモドキフィールドがあり、照合してリレーションしています。
パスモドキて何やねん。ふざけてんのか。と思われた方は、以下の投稿に目を通してみてください。
Importテーブル
インポートのベースとなるのは Importテーブルです。このテーブルに、インポートするファイルパスのリストを作成します。
具体的には、find + stat で「パス+ファイル作成日+ファイル変更日」リストを取得した後、レコード化して各フィールドを埋めていきます。POSIXパス、作成日、変更日、拡張子やFM仕様のパス、FM仕様のインポート元パスなどです。多くは計算式で作成します。中でもメインテーブルとの比較を行う計算フィールドが重要で「既存なし」「変更あり」「既存」の三つの結果を計算させます。
「既存」はファイルが登録済みで、尚かつファイル変更日も等しいパスですからImportテーブルから削除します。
ImportFMテーブル
ImportテーブルではFileMaker仕様の「インポート元パス」も計算で作成します。これは、FileMakerの「フォルダからインポート」機能を使ったときに「ファイルパス」としてゲットできる形式のパスです。この形式は普通のパスでも普通のFileMaker仕様のパスでもなく、特殊な書式の「パスのようなもの」です。
この特殊なパスのようなものは単なる役立たずではなく、フォルダインポート時に威力を発揮します。つまり、フォルダからインポートのオプションを「更新」にセットしたとき、照合フィールドとして機能するんです。実際には、これに加えてファイル名も照合に使います。インポート元パスが109文字を越えると照合できなくなるからです。
ImportテーブルからImportFMテーブルの「インポート元パス」に転記されたら、照合して「更新インポート」を行い、オブジェクトとサムネイルをインポートします。
工程
工程をまとめると以下のようになります。
- インポートパネルで設定を促す
- Importテーブルにパスと日付のリストを作成
- メインテーブルと比較して不要なレコードを削除
- FileType による拡張子フィルタを条件にする場合は処理
- 「インポート元パス」をImportFMテーブルに転記
- ImportFMテーブルでインポート、オブジェクトとサムネイルをゲットする
- Import、ImportFM から mainData に転記して一工夫入れて完了
随所に怪しげな文言も混ざっていますが、概ねこういう感じです。ファイル単体インポートの場合は大幅に省略されることになります。
1 インポートパネルで設定を促す
これは上の方ですでに書いた通りです。設定を先に済ませ、その後のスクリプトで条件に応じてインポート作業を振り分けます。
2 Importテーブルにパスと日付のリストを作成
find + stat でリストをゲットし、Importテーブルに展開します。
find '$POSIX1' $OPTION -type f -not -name '.*' -not -name 'Icon' -exec stat -f '%N+++%B+++%m' {} + | pbcopy
これをスクリプト「CodeRun」で実行させます。スクリプト「CodeRun」は、 指定のコードを実行し、コード内にpbcopy が含まれていれば結果を「GLB結果フィールド」に格納するまでを行います。
結果フィールドにリストの束が格納されるので、ループを使って1行ずつレコード化していきます。POSIXパス、ファイル作成日、ファイル変更日がフィールドに格納されます。
3 メインテーブルと比較して不要なレコードを削除
あとはパスを元にファイル名や拡張子、FMパスやパスモドキなどを計算で作っていきます。メインテーブルとの比較を計算するフィールドには勝手に「1(既存)」「2(更新)」「0(既存なし)」が記録されます。「既存」のレコードを削除します。
4 FileType による拡張子フィルタを条件にする場合は処理
ここで、ファイル拡張子によるフィルタも行います。設定で拡張子を指定していれば、その拡張子を持つパスのみが残されます。
5 「インポート元パス」をImportFMテーブルに転記
リレーションでは ImportFM テーブルの「作成を許可」していますので、Importテーブルから「インポート元パス」を転記するだけでレコードが作られます。インポート元パスとファイル名をImportFMに転記してレコードを作成します。
6 ImportFMテーブルでインポート
ImportFMテーブルのレイアウトに切り替えてフォルダからインポート、オブジェクトとサムネイルをインポートします。
7 Import、ImportFM から mainData に転記して一工夫入れて完了
ここまででImportテーブルとImportFMテーブルに必要なデータが入りました。最後にまとめてメインテーブルに転記します。
ここで生成され転記されるデータはかなり細かく沢山あります。いちいち説明しませんが、沢山ある中で修正が必要なフィールドもあります。例えば「格納」でインポートした場合、オブジェクトのパスが元の場所のままだったりしますので修正を入れます。セッションや登録日付もきっちり作成し、全てインポートが終わった後「今インポートしたレコードを表示」できるように取り計らいます。
以上、R10ファイル、インポート LEVEL 3 の流れでした。