📚

Mac版Kindleの書籍をブクログに登録する

2024/11/08に公開

Kindle で読んでいた書籍の情報をブクログに連携したかったので、こちらの記事を参考に少しカスタマイズしてみました。

https://zenn.dev/sasasin/articles/1e3c3290b301ff

方針

Kindle には購入した書籍以外にも自分でインポートした PDF なども存在しています。書籍の種類も一般書籍と漫画を含んでいます。
また、過去に何度か手作業でブクログに登録しており、重複して登録することは避けたいです。(ブクログでは紙の本と電子書籍を区別して登録できるため)

そのため以下のような方針を立てました。

  1. 漫画は除外する
  2. 自分でインポートした PDF などは除外する
  3. 登録する書籍は目視で選別する

SQL を調整する

データを確認していたところ以下の特徴があるようでした。

  • 漫画の場合 zbook.ZCONTENTTAGS;MANGA という値が入っている
  • 自前のインポートした PDF などの場合 zboo.ZBOOKID の最初の 3 文字が A:B になっていない
  • おそらく表示名が ZDISPLAYTITLE になっている
  • 日付が ZRAWLASTACCESSTIME で取得できる

これらを踏まえて、以下のような SQL を組み立てました。

SELECT
  datetime(ZRAWLASTACCESSTIME, 'unixepoch') AS `日付`,
  substring(ZBOOKID, 3, 10) AS ASIN,
  ZDISPLAYTITLE AS `タイトル`
FROM zbook
WHERE ZCONTENTTAGS != ";MANGA"
AND ZBOOKID LIKE 'A:B%'
ORDER BY ZRAWLASTACCESSTIME
;

実行結果は、目視と選択が行いやすいようにしました。

  1. 日付(これは Kindle 上で開いた日時のようです)
  2. ASIN(ZBOOKID の 3 文字目から取得したモノ)
  3. タイトル

この SQL は sqlite3 コマンドに渡して実行します。

fzf を利用してターミナル上で選択可能にする

sqlite3 の処理の結果をパイプで受け取りつつ、一覧から自分で登録したい書籍を選ぶようにします。fzf を利用すると実現可能です。

https://github.com/junegunn/fzf

fzf では以下のオプションを設定することにしました。

  • --multi: 複数選択ができるようになる
  • --tac: ターミナル上の出力が逆順にする

--tac はちょっとややこしいです。fzf は、デフォルトではパイプで受け取った内容を逆にして出力するので、その逆、つまり受け取った内容そのままで出力します。

実際に実行するコマンド

最終的なコマンドは以下のようになりました。欲しいのは ASIN なので cut も利用しています。

最終調整したコマンド
db=~/Library/Containers/com.amazon.Lassen/Data/Library/Protected/BookData.sqlite
sqlite3 $db <<'SQL' | fzf --multi --tac | cut -d, -f2 | pbcopy
.mode csv
SELECT
  datetime(ZRAWLASTACCESSTIME, 'unixepoch') AS `日付`,
  substring(ZBOOKID, 3, 10) AS ASIN,
  ZDISPLAYTITLE AS `タイトル`
FROM zbook
WHERE ZCONTENTTAGS != ";MANGA"
AND ZBOOKID LIKE 'A:B%'
ORDER BY ZRAWLASTACCESSTIME
;
SQL

終わりに

実際にやってみると、個人出版の漫画を除外できていませんでしたが、 fzf を経由するので、選択しなければ良いだけでした。

コピーした ASIN はブクログの まとめて登録 (ISBN) に貼り付けて登録できます。
一度に登録できるのは 100 件までのようです。

Discussion