Kindle の蔵書一覧を取得する(1)

追記

npxコマンド一発で蔵書リストが取れるツール作ったので、結果だけが欲しい人はそっち使う方がいいです。

npx kindle-title-exporter > books.csv 

dominion525.hatenablog.jp

背景

Kindleの蔵書、主に漫画なんですが、現在ざっくり3500冊、600シリーズくらいあるんですよ。 なお、継続購入してるシリーズが100件くらい。

こうなるとあんまり上手く把握できなくなっちゃうからなんとかしたいなーと思ってたわけです。 しかもAmazonは公式なエクスポート機能を提供してくれないし…。

で、以前調べた時は下記くらいが挙がってたものの、ちょっとなんだかなあと思ってたんですよ。

が、最近調べていたらわりとなんとかなりそうでした。

目次

比較的新しい方法(ただしMacOSのみ)

Kindle

Kindle

  • AMZN Mobile LLC
  • ブック
  • 無料
apps.apple.com

Macで使えるネイティブアプリ、Kindle for Macがあるんですが、これが内部的にSQLiteを使ってるんです!

はい、ここまでで全部わかっちゃった人はもう十分ですね。 単なるSQLiteなんで普通にクライアントから接続すればいいだけ。 もう、あと読まなくていいかと思います。

DBの場所

各人のホームディレクトリの下記の場所にあります。

~/Library/Containers/com.amazon.Lassen/Data/Library/Protected/BookData.sqlite

なので、任意のSQLiteクライアントがあれば簡単に参照できます。

# インストールされてなければ
brew install sqlite

# 接続
sqlite3 ~/Library/Containers/com.amazon.Lassen/Data/Library/Protected/BookData.sqlite
 

あとは普通にSQL投げるだけです。

DBの仕様

  • 形式: SQLiteデータベース
  • 文字エンコーディング: UTF-8
  • 主要テーブル数: 10テーブル + システムテーブル3つ

DB schema

エクスポートしたやつを貼っておきました。Table Plusは便利だなあという感じです。

Kindle for Mac が使っているデータベース(BookData.sqlite.sql)のschema · GitHub

細かいことは別の記事で書こうと思います。

クイックスタート

1. データベースの確認

# データベースファイルの存在確認
ls -lh ~/Library/Containers/com.amazon.Lassen/Data/Library/Protected/BookData.sqlite

# テーブル一覧を表示
sqlite3 ~/Library/Containers/com.amazon.Lassen/Data/Library/Protected/BookData.sqlite ".tables"

2. 書籍一覧の取得

SELECT ZDISPLAYTITLE, ZRAWPUBLISHER
FROM ZBOOK;
EOF

3. シリーズ情報付きで取得

いくつかのテーブルをLEFT JOINします。

SELECT
  ZBOOK.ZDISPLAYTITLE,
  ZGROUP.ZDISPLAYNAME as series_name,
  ZGROUPITEM.ZPOSITIONLABEL as series_position
FROM ZBOOK
LEFT JOIN ZGROUPITEM ON ZBOOK.Z_PK = ZGROUPITEM.ZBOOK
LEFT JOIN ZGROUP ON ZGROUPITEM.ZPARENTCONTAINER = ZGROUP.Z_PK;
  • あと全ての作品にシリーズ情報が入っているわけでもないので割と困りますね。
  • 詳細は別の記事で書きます。

FAQ

Q. 著者名を取得するには?

A: plist(ZSYNCMETADATAATTRIBUTES)からデコードする必要があります。

  • ZDISPLAYAUTHORはハッシュ値で人間が読めません。
  • 詳細は別の記事で書きます。

Q. 購入日時を取得するには?

A: plistのpurchase_dateフィールドから取得します。

  • ZBOOKテーブルには購入日フィールドがありません
  • 詳細は別の記事で書きます。

Q. タイムスタンプの形式は?

A: Unix timestamp(1970-01-01からの秒数)です。

: - Unix timestamp: 1353283200 - 日時: 2012-11-19T00:00:00.000Z

  • SQLite って日付型、日時型のカラムがなくて、ぜんぶ文字列として保持するんですよね。

Q. このデータベースを直接編集してもいい?

A: やめましょう。

  • データベースの破損リスクがあります。
  • 読み取り専用にした方が堅いです。

詳細解説

わりといろいろあるので別記事で解説します。

免責

  • 本情報は、筆者が独自に調査・検証した非公式情報であり、AmazonまたはKindleとは一切関係ありません。
  • 正確性の保証はありません。誤りや不適切な認識が含まれる可能性があります。
  • 特定の環境・バージョンでの検証結果であり、すべての環境での動作を保証するものではありません。
  • 本記事の内容を利用した結果生じたいかなる損害についても、筆者は一切の責任を負いません。
  • 「Kindle」はAmazon.com, Inc.の登録商標です。本情報は、私的利用の範囲において自身の蔵書情報を参照するものであり、デジタル著作権管理(DRM)やコピープロテクション機構を改変、回避、妨害するものではありません。