ファイルメーカーでメディア管理システムを作る話の続編です。画像や動画のデータベースについて具体例を交えつつ。
wpのメディア管理をFileMakerで行う記事を書くつもりではじめたんですが、FileMakerでのメディア管理そのものについてもうちょっと具体的に書くことにしました。FileMakerでメディア管理システムを作る話のパート2です。パート2というか、前回のが概要、こちらが詳細、みたいな感じです。
書き始めたら長くなったのでページ分割、その後ポストを分けました。
このページ内の見出し
フィールド
フィールド定義です。メディア管理データベースに必要な基本のフィールドをいくつか。そして一工夫入れたりします。
イメージ
オブジェクトタイプのフィールドです。画像や動画を格納します。レイアウトするときに表示方法を二択から選びます。動画プレビューを行うならレイアウトモードのインスペクタで「インタラクティブ」を選択します。

前回の記事に書いたので繰り返しませんが、レコードごとに一個ずつ取り込むときは「挿入」メニューを使います。フォルダごとまとめて取り込みたいときはインポート>フォルダ から一括で行けます。あれ?繰り返してしもた。
もうひとつ、レコードごとの取り込みでドラッグアンドドロップが使えます。使えますが、これが困ったちゃん仕様になっていて、ドラドロだと参照や外部保存で取り込めないんです。問答無用でファイル内に取り込んでしまいます(動画は逆に問答無用で参照になります)画像登録なんてドラッグが一番楽ちんなのに、その道は閉ざされてしまっています。Apertureみたいに、コマンド+オプション+ドラッグだったら参照とか、そういうことが出来れば良いんですけど出来ません。ファイルメじゃなくてクラリス社さま、要改善。
サムネイル
サムネイルフィールドもあったら便利です。ただ便利というより、FileMaker的な理由があります。ポータル表示でレコードをリスト表示するとき、オブジェクトフィールドは動画を表示できません。

図では、リストの左端にイメージフィールドを置いていますが、この場所にサムネイル画像を置くのが好ましいんですよね。
さて、フォルダインポートを使って追加するとき、オブジェクトが画像ならサムネイルも一緒に取得できます。

インポートではなく挿入を使った場合は自動でサムネイルを作ってくれません。そこで、フィールド定義にサムネイル作成を含めちゃいましょう。
サムネイルのフィールドオプションで計算値にチェックを入れ計算式でサムネイル自動生成します。例えば100px四方のサムネイルを作るならこんな感じです。
GetThumbnail ( イメージ ; 100 ; 100 )
GetThumbnail関数はサムネイル生成関数です。
イメージフィールドには画像以外にもいろいろ格納されるし、他で作ったサムネイル画像をペーストしたい時なんかもあるかもしれません。ですので、無条件に自動生成してほしいわけではありません。”ファイル種類”フィールドがが画像の時だけ、っていう条件をつけたりします。
If ( ファイル種類 ; "画像" ; GetThumbnail ( イメージ ; 100 ; 100 ) )
例えばこんな。必要ないかもしれないけど、ifを使ってファイル種類フィールドが画像のときだけという条件つけます。
おっと「ファイル種類」なんてフィールド作ってないぞ。作りましょうか。
ファイル種類
ファイル種類というフィールドです。例えば「画像」「動画」など、大まかな分類として機能させます。計算式やスクリプトが作りやすくなるし、普通にデータベースを利用する上でも、ぱっと見の「ファイル種類」なんて分類があれば使い勝手も宜しいでしょ。
データ作成時に手動でファイル種類を入力してもいいのですが、私はここも計算式で手を抜きます。データベースへの手動入力は基本きらいです。楽したいです。
自動入力の方法はいろいろあると思いますが、私は拡張子で決めています。jpg、png、tiff、場合によっちゃpsdなど編集アプリの拡張子も含めますが、そういう静止画の拡張子なら「画像」、mov、m4v、mp4、その他動画の拡張子なら「動画」と入力されるよう、「ファイル種類」フィールドに計算式 case を使って羅列しています。
case (
条件 ; 結果 ;
条件 ; 結果 ;
条件 ; 結果 ;
)
てなふうに書きます。私個人の「ファイル種類」フィールドの計算式では、オブジェクトフィールドを参照するだけでなく、拡張子やフォルダ名などのフィールドも参照しつつ適度な分類を行なっております。
えっ。拡張子やフォルダ?それどのフィールド?
はい。拡張子フィールド、フォルダのフィールドも別途作っております。それはまた後ほど。
この画像種類っていうフィールドですが、ちょっとあとに出てくるGetAsTextを利用して基本的なことのみ自動取得もできますね。パス取得時に「image:/」とか「movie:/」とか付くんで、それを画像種類の計算式に利用できそうです。
ファイル名
ファイル名フィールドです。
フォルダインポートを使ってデータを取り込むときには同時にファイル名を取得できます。それ以外の取り込みでは取得できません。フィールドオプションの計算値でファイル名を取得します。
タイプ計算ではなくて計算値を使うことについて
さっきのサムネイルフィールドなんかもそうですが、フィールドタイプを計算式にしてしまうと計算結果以外に何もできなくて融通が利かないです。だからあえて普通のタイプのままフィールドオプションで計算値を使います。既存データの更新を計算値で行いたい時はちょっと工夫が必要ですけど。タイプを計算にするか、オプションで計算値入力にするかはフィールドの使用目的によりますね。
ファイル名はオブジェクトフィールドから取得できます。
GetContainerAttribute ( イメージ ; "filename" )
これでファイル名を得られます。GetContainerAttribute関数はオブジェクトからいろいろとメタデータを取得する関数です。でもいまいち取得できる情報が限られていて、もうちょっと頼むで。と思いますが仕方がないです。ファイルパスは取得できません。
FileMaker Pro 18 Advanced リファレンス GetContainerAttribute
他、GetAsTextでパスを取得できますからパス区切りを改行に置換した上で最後の行を取得するという手もあります。
ファイルパス
ということでファイルパスフィールドです。フォルダインポートしたときには一緒に取得できますがそれ以外では何もしてくれませんので、これも計算式で取得します。
さっきちょろっと書いたGetAsText関数を使います。
これテキスト関数ですが、オブジェクトフィールドを指定すると何故かファイルパスが取得できるんです。なんでオブジェクト関数のGetContainerAttributeではできなくてGetAsTextなんていうテキスト関数でできるのか謎です。でも出来るんだから仕方がない。これを使います。
GetAsText ( イメージ )
こうやって「イメージ」オブジェクトフィールドからゲットします。これでパスが得られるか・・・と思いきやGetAsTextには変な癖があって、オブジェクトの種類や持ってるメタデータによって取得する内容が異なります。
この関数が取得するのはファイルパスだけではなくさまざまな情報です。パス情報の他、何らかの埋め込まれたテキスト情報(種類やファイル名やサイズや?マークなど)を改行区切りの文字列で返します。
改行あるのはこまったな。これだけではパスにならん。そこで使う関数がGetValueです。これは改行を含むフィールド内容から行を指定して表示するというような使い方ができます。
GetValue ( 改行含むテキスト ; 行番号 )
こう書くんですが、これではまだ困ります。行を指定しようにもGetAsTextが返す内容は1行のときもあれば3行の時もあります。1とか3とか決まった数字を書くわけにいきません。じつはGetAsTextが取得するいろんな内容のうち、パスは常に最後の行にあります。「最後の行」を指定したい。
そこで必要なのがValueCount関数です。これは、取得したテキストが何行あるのかを教えてくれます。
ValueCount ( GetAsText ( イメージ ) )
イメージから取得した内容が1行なら「1」を返します。3行あったら「3」を返します。最後の行とは何行目ですか。それは行数とイコールです。これでいける。
ということで、組み合わせるとこうなりました。
GetValue ( GetAsText ( イメージ ) ; ValueCount ( GetAsText ( イメージ ) ) )
私はこういう計算式を組み立てる脳味噌が哀しいぐらいに欠落していますので、こうやって一個ずつ考えていかないと何もできないんです。
ここ追記です。ところで、上記では「:」が邪魔で上手くいかないこともありましたので、次のような改良型もあります。
GetValue ( Substitute ( GetAsText ( イメージ ) ; “:” ; ¶ ) ; ValueCount ( Substitute ( GetAsText ( イメージ ) ; “:” ; ¶ ) ) )
フォルダ
メディア管理システムを参照で作っていくと、オリジナルファイルが内包するフォルダ名を得たい場合が多々ありますね。分類として、カテゴライズとして、フォルダ名フィールドを二つ三つ作っておくと有益に使えそうです。
フォルダ名はファイルパスから取得します。
使う関数の基本はSubstitute。これは検索・置換を行う関数です。
Substitute ( テキスト ; 検索 ; 置換 )
対象の[テキスト]内で[検索]して[置換]します。検索 ; 置換 の部分は
[ 検索 ; 置換 ] ; [ 検索2 ; 置換2 ] ; [ 検索2 ; 置換2 ] ;
というふうに複数並べて追加していく書き方もありです。
パスには「/」が含まれます。ですから、 Substituteを使って「/」を改行(ファイルメーカーでは ¶ です。辞書に登録したった)に変換します。パスが改行区切りの文字列に変換されます。
この改行区切りにされた文字列から、行を指定して目的の行つまりフォルダ名を得るのです。一番下のファイル名から遡りたいときはさっきのValueCountを使った「行数を得てその何行めかを指定」の計算式と組み合わせてやればいい。
ファイル名のすぐ上にあるフォルダ名を得るには、「行数」を得て、イコールそれが最後の行つまりファイル名の部分ですから、「-1」と計算を付け足すとファイルを内包するフォルダ、「-2」を付け足すとフォルダのフォルダ、と取得できます。
計算式の括弧内がとても長い式になってきて混乱しがちですが何とか踏ん張って作ります。ややこしいなら変数(Let)を使って順番にゆっくりやってけばいいと思います。
拡張子
拡張子フィールドもぜひ欲しいところ。計算式やスクリプトでも便利に使えます。これはファイル名から得ましょうか。
拡張子はファイル名末尾にドットと数文字のテキストで出来ていますから、ドットより右にある文字列を取得するだけです。簡単ですね。多分テキスト関数の「left」とか「right」とか「middle」とか使います。これが使える人だったら、ファイル名またはファイルパスの最後からドットまで、とか、逆に最後の行のドットから右の文字列とか、拡張子を得る計算式を簡単に思いつくことでしょう。
ところが私には簡単ではありませんでした。以前どこかにも書きましたが私は左とか右がわからないので、leftやrightという言葉を見るだけで冷や汗が出ます。
そんなわけで何とかの一つ覚えみたいに、さっきから書いている計算式と同じようなのを作って拡張子を得ています。つまりSubstituteでパスの「.」を改行に置換して、最後の行を取得しています。
このやりかたが個人的に良いのは、ドットが拡張子以外に含まれるファイル名が割とあるからという理由もあります。拡張子がないファイルも手元に沢山ありますが、さすがにそういうのまでは面倒見きれないのでここでは除外して無視することにします。
その他自動入力のフィールド
ファイルメーカーのリファレンスを見ると、自動取得できるメタデータはいろいろあって、写真だと若干のExifみたいのとか、容量とか作成日とか、そういうのがあります。取得できそうなものは取得してデータを充実させるが良いと思います。
あと、最初のサムネイルのところで書いたような、既存の他のフィールドを利用した自分なりのメタデータを作っていけたりしますので各自工夫します。
その他手動入力するフィールド
自動で取得できないデータは手動入力します。目的とするメディア管理にどういうフィールドが必要かはそれぞれですのでここは自由にやるところですね。
ムービーファイルなんかはほぼ何も自動取得できないのでデータの充実のために手動入力は外せません。Finderの情報を見るやプレーヤーで開いて情報ウインドウを見るとか、各種別ウインドウを見ながら手入力ということも、仕方なしにやります。Finderと連携させる件については後で書きます。
その他システマチックな目的のフィールド
システマチックなフィールドがあるとレイアウトで活躍します。というかファイルメーカーは何をするにもフィールドが要るので放っておいてもフィールドだらけになります。
メディアデータベースの根幹(オブジェクトや各種メタデータ)ではないものは可能な限り別テーブルや別ファイルに用意するようにしています。特にグローバルフィールドを別途システムテーブルにたくさん作ってご機嫌運用しています。何に使うかというと、レイアウト上の入力補助やメニューや一時的な格納庫などに使うんです。
次の FileMakerでメディア管理 2-2 レイアウト に続きます。