はじめに
hkob の雑記録の第205回目は、アルバム、シングル、ビデオなどの Devices のデータベースを追加します。
Devices のエクスポート
次にこれまでに作成したものに依存するデータベースは Devices になります。Albums, Singles, Videos などを別のデータベースにするのではなく、セレクタで区別しビューで別々に表示をしていました。

プロパティは以下のようになります。CSV 出力するものとしないものを以下のように分けました。

前回と同様に CSV に書き出し後、リレーションの URL 削除と日付の ISO8601 変換をしてしまいます。
sed 's/ (https:\/\/www.notion.so[^)]*)//g' Devices\ 0fd8e4fb306a45afb3b0d45f9cd3f147.csv | sed 's/\([0-9][0-9]*\)\/\([0-9][0-9]*\)\/\([0-9][0-9]*\)/\1-\2-\3/g' > Devices.csv
変換結果は以下のようになります。
Name,Device type,Kinds,Sort order,Comments,Release date,Whole time,Official link,Thumbnail,Artist,Year NEW SEASON,Single,EPシングル,1st,デビューシングル,1987-05-25,,http://www.moritaka-chisato.com/discogprahy/product/4005.html,https://is2-ssl.mzstatic.com/image/thumb/Features/v4-83-49/1f/83491ff2-da40-afe7-1e17-a1d291fdc2f1/V4HttpAssetRepositoryClient-ticket.etkfxhhk.jpg-7126143036376632086.jpg/500x500cc.jpeg,森高千里,1987 NEW SEASON,Album,アルバム,1st,デビューアルバム,1987-07-25,"42'25""",http://www.moritaka-chisato.com/discogprahy/product/4101.html,https://is5-ssl.mzstatic.com/image/thumb/Music/v4/d6/db/fc/d6dbfcb1-b55b-8320-9c60-ee9adb40079c/825646583195.jpg/500x500cc.jpeg,森高千里,1987 OVERHEAT. NIGHT,Single,EPシングル,2nd,,1987-10-25,,http://www.moritaka-chisato.com/discogprahy/product/4008.html,https://is2-ssl.mzstatic.com/image/thumb/Features/v4-67-9b/5a/679b5a74-e063-42cc-5430-54c8e2eafe8a/V4HttpAssetRepositoryClient-ticket.nakfgjhk.jpg-3592292848064575103.jpg/500x500cc.jpeg,森高千里,1987 GET SMILE,Single,EPシングル,3rd,,1988-02-25,,http://www.moritaka-chisato.com/discogprahy/product/4012.html,https://is1-ssl.mzstatic.com/image/thumb/Features/v4/98/c2/a3/98c2a305-9d54-ca0e-a09b-cc22137c5540/V4HttpAssetRepositoryClient-ticket.lsquysso.jpg-4034912659110265805.jpg/500x500cc.jpeg,森高千里,1988
Devices の作成 & インポート
森高千里DBの下に作成したいので、また Cmd-Opt-9 で新規ページを作成します。この新規ページを開き、インポートを実施しました。修正点は Kinds を Multi-select に修正するくらいでした。Thumbnail は Image ブロックにできずに URL となってしまいました。

無事にインポートが終わりました。今回は、Thumbnail, Artist, Year を Notion API やオートメーションでコンバートすることにします。

リレーションの作成
Artist は People へのリレーションになります。これは多対多の接続になります。当初1対多で作成したら、複数人アーティストのものがあり、エラーとなってしまいました。そのため、多対多に後から修正しました。

Year は Years へのリレーションになります。こちらは1対多の接続になります。

さらに、Thumbnail はファイル&メディアプロパティとして作成しました。

結果として以下のようになりました。

Year の自動設定
Year のリレーションは Release date の日付が決まれば確定できる項目です。これまでは手動で設定していましたが、データベースオートメーションで設定することにします。本来は日付プロパティの変更でトリガをかけるべきですが、今回 Notion API で Artist の設定を行うので、任意の変更でトリガをかけて設定するようにしておきます。現在のデータが設定された後で、トリガだけ修正します。
まず、Devices から Map へのリレーションを追加します。Years と同様に1対多の接続ですが、Map から Devices への逆方向のリレーションは作成しません。

次に既存の Map を全て all を接続します。簡単のために Map の Name の隣に持ってきます。この状態で Name の横のチェックボックスを選択すると 174件選択済の右に Map と表示されています。

Map をクリック後に all を選択すると、全てのページに all が接続されます。

無事全ての Devices に all が接続されたことがわかったので、非表示にしてしまいます。

今後、新しい Devices を登録したときに all に接続することを忘れそうなので、Years と同様にページ追加時に all を設定するようにしてしまいます。

ここまでできれば、Map を経由して Release date の年に対応する Years 内のページを選択して設定するだけです。

設定した値は以下のような数式になります。

Notion API で Thumbnail, Artist データを準備
Songs と同様に ArtistStr から Artist relation、ThumnailStr から Thumbnail を設定してみます。people_id_hash までは Songs と同様です。リレーションを追加した結果、.title ではエラーになってしまったため、タイトルの取り方だけ少し変更しています。
people_db = Database.find "https://www.notion.so/hkob/234d8e4e98ab807ab739fc65d7c36c2c?v=234d8e4e98ab816f87d9000c31a7c656&source=copy_link" => NotionRubyMapping::Database-234d8e4e98ab807ab739fc65d7c36c2c people = people_db.query_database => NotionRubyMapping::List- people_id_hash = people.each_with_object({}) { |person, h| t = person.properties["Name"].full_text; h[t] = person.id } => {"和田アキ子"=>"234d8e4e98ab811dbb9fda6c90a9274f", ...
まず、Devices データベースを読み込み、それぞれのプロパティを取得します。
devices_db = Database.find "https://www.notion.so/hkob/236d8e4e98ab80e0b548f6e419a81edb?v=236d8e4e98ab817d9af2000c2828262f&source=copy_link" => NotionRubyMapping::Database-236d8e4e98ab80e0b548f6e419a81edb ap = devices_db.properties["Artist"] => #<NotionRubyMapping::RelationProperty:0x0000000139ebf700 ...
まず、Artist が空の曲一覧を取得します。途中でエラーが出た時に続きから実行できるようにするためです。
devices = devices_db.query_database(ap.filter_is_empty) => NotionRubyMapping::List-
あとは先ほど作成した hash を使って設定しまくるだけです。
devices.each do |device| dp = device.properties artist_str = dp["ArtistStr"].full_text ids = artist_str.split(", ").map { |k| people_id_hash[k] } dp["Artist"].relation = ids p [dp["Name"].full_text, artist_str] device.save end (中略) ["OVERHEAT. NIGHT", "森高千里"] ["NEW SEASON", "森高千里"] ["NEW SEASON", "森高千里"]
また、Thumbnail も実行しましたが、URL が 100 文字を超えるとエラーになるようでした。そこで、100 文字を超えないものだけ Notion API で処理を行い、超えるものはスキップした上で手動でコピーしました。
devices.each do |device|
dp = device.properties
url = dp["ThumbnailStr"].url
if url && url.length < 100
dp["Thumbnail"].files = url if url && url.length < 100
device.save
end
p dp["Name"].full_text
end
最後に Year の設定をするオートメーションのトリガを Year が設定されておらず、Release date を編集した時としました。

最終的にオートメーションはこのような形になっています。

最終的に以下のような形になりました。いくつか不整合なデータなどがみられますが、その他のデータを取り込んでから順次修正していくことにします。

おわりに
とりあえず、Devices については取り込みが終わりました。いくつか不整合なデータなどがみられますが、その他のデータを取り込んでから順次修正していくことにします。