森高千里データベースの再構築(6) : hkob の雑記録 (205)

はじめに

hkob の雑記録の第205回目は、アルバム、シングル、ビデオなどの Devices のデータベースを追加します。

Devices のエクスポート

次にこれまでに作成したものに依存するデータベースは Devices になります。Albums, Singles, Videos などを別のデータベースにするのではなく、セレクタで区別しビューで別々に表示をしていました。

元の Devices データベース

プロパティは以下のようになります。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 となってしまいました。

CSV インポート

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

CSV 読み込み後

リレーションの作成

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

Artist リレーション

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

Year リレーション

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

Thumnail プロパティ

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

追加後のプロパティ

Year の自動設定

Year のリレーションは Release date の日付が決まれば確定できる項目です。これまでは手動で設定していましたが、データベースオートメーションで設定することにします。本来は日付プロパティの変更でトリガをかけるべきですが、今回 Notion API で Artist の設定を行うので、任意の変更でトリガをかけて設定するようにしておきます。現在のデータが設定された後で、トリガだけ修正します。

まず、Devices から Map へのリレーションを追加します。Years と同様に1対多の接続ですが、Map から Devices への逆方向のリレーションは作成しません。

Map リレーション

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

Devices の全選択

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

all を設定

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

Map を非表示

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

Map を設定するオートメーション

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

Year を設定するオートメーション

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

Year 設定のための数式

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 を編集した時としました。

Year 設定のオートメーションのトリガを変更

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

設定されたオートメーション

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

作成された Devices データベース

おわりに

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

hkob.notion.site