日記アプリ Day One のデータをJSONから作る

日記アプリとして Day One を使い始めた。 それ以前も汎用的なノートアプリであるEvernoteとBearで日記をつけていたが、日記は日記に特化したアプリに任せたほうが良さそうだと考え、Day Oneへの移行を決めた。

そこで、過去の日記をDay Oneに取り込みたくなった。公式guideに案内がある。

Importing data to Day One

画像を含めて取り込むには、Day One固有形式のJSONファイルと画像を含むZIPアーカイブが必要らしい。 ↑のdocsページでサンプルのzipをダウンロードできる。

開いてみると、結構に長いJSONが現れる。Day Oneは日記や画像に様々なメタ情報を付与できるようだ。 だが、自分がインポートしたいのは次の情報だけだ。

  • 作成日時
  • 日記の本文(テキスト)
  • 添付画像

この最低限の情報だけを持つDay One のJSONを作ると、以下のようになる。

{
  "metadata": {
    "version": "1.0"
  },
  "entries": [
    {
      "text": "# Test Journal\nThis is image.\n![](dayone-moment://2A69239A5B364348AC64FA7758C2151B)",
      "creationDate": "2024-01-05T03:02:50Z",
      "photos": [
        {
          "type": "jpeg",
          "identifier": "2A69239A5B364348AC64FA7758C2151B",
          "md5": "0e2d16db35b89f9880ee5b3441659d54"
        }
      ]
    }
  ]
}

まず作成日時。これは creationDate フィールドに RFC3339 Zulu format(UTC time zone)で入れる。

次に日記の本文。これは text フィールドにMarkdownがそのまま入る。

そして添付画像は photos フィールド。ここは少し複雑なので表で解説する。

フィールド名 役割
type 画像ファイルの形式。 jpeg, png, gif など。
identifier 任意のUUIDv4。Markdown内に埋め込む際に ![](dayone-moment://<identifier>) のように記述する。
md5 画像ファイルのmd5 hash。これと type を組み合わせた photos/<md5>.<type> がファイルの場所となる。

これで最低限のJSONの作り方がわかった。ファイル構造は次のようになる。

├── Journal.json
└── photos
   └──  0e2d16db35b89f9880ee5b3441659d54.jpeg

実際に、この手法で作った Journal.json と photos をZIPに圧縮してDay One のImport > JSON Zip fileでうまく取り込めた🎉。

あとは他のアプリで書いた日記データを上のJSON形式に変換するスクリプトを書けば、データの引っ越しができる。 たとえばBearはTextBundleというMarkdown, JSON, 添付ファイルが一定の規則でまとまったZIPファイルで出力できるので、それを解析してDay OneのJSONに変換するコードを書けばよい。

こういった移行に備えて常に日記は(普及した形式の)テキストデータによるimport/exportに対応したアプリでつけておきたい。