kindle本をPower BIですっきり管理！【Python】

# はじめに

`kindle`は大型セールが頻繁にあるのでどうしてもたくさん買ってしまいがちですが、kindleアプリは使い勝手が~~ゴミ~~あまりよくないため書籍が増えてくると管理がしづらいと思います。

特に検索機能が問題で、**前方一致でしか検索が行えない**ためタイトル名を完璧に覚えていない場合に目当ての書籍を探し出すのは困難を極めます。

そこで、自分の所持している**kindleの書籍データからタイトル名や著者名から検索できる機能や分析できる機能**を`PowerBI`を用いて実装してみました。

# 書籍データの取得

## xmlファイルの入手

kindleのデスクトップアプリを入れると、以下のファイルパスに`xml`形式のファイルが自動保存されます。

```plaintext: windows
C:\Users\user_name\AppData\Local\Amazon\Kindle\Cache\KindleSyncMetadataCache.xml
```

```plaintext: Mac
$HOME/Library/Containers/com.amazon.Kindle/Data/Library/Application\ Support/Kindle/Cache/
```

中身をのぞいてみると以下のような内容になっています。


```xml:KindleSyncMetadataCache.xml
<response>
    <sync_time>2023-12-15T15:42:26+0000;softwareVersion:70673;SE:F;SC:F;CS:S;CT:F;ST:KS-15000000000023,Periodical-1702654946091,KB-15000000001458,</sync_time>
    <cache_metadata>
        <version>1</version>
    </cache_metadata>
    <add_update_list>
        <meta_data>
            <ASIN>B0BSPC58ZH</ASIN>
            <title pronunciation="オカルトケンハソンザイシナイ003">オカルト研は存在しない！！ 3 (ヤングアニマルコミックス)</title>
            <authors>
                <author pronunciation="カワライユウキ">河原井優貴</author>
            </authors>
            <publishers>
                <publisher>白泉社</publisher>
            </publishers>
            <publication_date>2023-01-27T00:00:00+0000</publication_date>
            <purchase_date>2023-12-10T10:33:28+0000</purchase_date>
            <textbook_type/>
            <cde_contenttype>EBOK</cde_contenttype>
            <content_type>application/x-mobipocket-ebook</content_type>
            <origins>
                <origin>
                    <type>Purchase</type>
                </origin>
            </origins>
        </meta_data>
    ...
```

取得できる中で使えそうなデータは以下の通りです。

- タイトル
- 作者
- 出版社
- 購入日
- 出版日

データの詳細についてですがタイトルにレーベル名や巻数が含まれていたり、シリーズ名を保持していない、などなかなかに使いづらそうなデータとなっています。

## xmlファイルをdictに変換

``` python: xml>dict変換
import xmltodict

# xmlファイルのパスを指定
xml_file = "(ファイルパス)/KindleSyncMetadataCache.xml"

# XMLファイルの処理
with open(xml_file, encoding='utf-8') as fp:

    # xml読み込み
    xml_data = fp.read()

    # xml → dict
    dict_data = xmltodict.parse(xml_data)

# 各書籍のデータを格納
books = dict_data["response"]["add_update_list"]["meta_data"]
```

`xml`ファイルをそのまま扱うのは面倒だったので、`xmltodict`を用いて`xml`ファイルを`dict`に変換することで中のデータを取得しやすくしました。

## csvファイルの出力

``` python:csv出力
import csv

# CSVファイルの出力先を指定
csv_file = "output.csv"

with open(csv_file, 'w', newline='', encoding='utf-8') as f:

  writer = csv.writer(f)

  # ヘッダー行を書き込む
  writer.writerow(["タイトル(読み)", "タイトル", "作者(読み)", "作者", "出版社", "購入日", "出版日"])

  # 各書籍のデータを書き込む
  for book in books:
    title_pronunciation = book["title"]["@pronunciation"]
    title_text = book["title"]["#text"]

    # 作者が複数人の場合
    if isinstance(book["authors"]["author"], list):
      author_pronunciation = ""
      author_text = ""
      for author in book["authors"]["author"]:
        author_pronunciation += author["@pronunciation"]
        author_text += author["#text"]
    else:
      author_pronunciation = book["authors"]["author"]["@pronunciation"]
      author_text = book["authors"]["author"]["#text"]

    # 出版社の書き込み
    if book["publishers"]is not None:
      publisher = book["publishers"]["publisher"]

    # 購入日の書き込み
    purchase_date = book["purchase_date"]

    # 発行日の書き込み
    publication_date = book["publication_date"]

    # データ行を書き込む
    writer.writerow([title_pronunciation, title_text, author_pronunciation, author_text, publisher, purchase_date, publication_date])
```

`dict`に変換した各項目を`csv`ファイルに出力します。
これで自分の持っているkindle本の状態をデータとして取得することが出来ました。

# PowerBIで可視化

## 書籍検索

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/a5c661fc-e5c5-c86c-5206-120f6832dd69.png)

kindleアプリで一番不満だった「検索が前方一致でしか行えない問題」を解決するためのページです。
PowerBIの基本機能に検索ウィンドウはありませんが、`Text Filter`と呼ばれる公式の追加DLCのようなものを用いて実現させました。

また、ある地点で買った本なども検索できるように購入日での範囲指定フィルタも追加してみました。


## 出版社ランキング

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/b1f5a0f1-f54b-7cdb-e1bf-beabcffc0055.png)

所持している書籍の出版社を多い順にグラフで表示するページです。
自分好みの書籍がどこの出版社から出ているかが一目でわかります。


### 補足
ドリルスルー機能を使うことで、内訳もチェックできるようにしました。
右クリックで「ドリルスルー」を選択すると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/7ff94dee-b717-94bc-1d50-b0188b9f90a9.png)

別ページに飛ばされて、選択したグラフの内訳が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/c4f6101e-f4f4-edf6-9d52-595a99d4797d.png)


## 作者ランキング

出版社ランキングの作者版です。
自分の好きな作者が一目で分かりますが、シリーズ物も1冊ごとに集計しているため長編漫画の作者が上位にランクインしやすいという欠点があります。
ただ、取得したデータの中にシリーズの情報は無いためシリーズ物をひとまとめにするには一工夫必要そうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/1dbe7d12-1467-5b0b-965a-2922a314bdc2.png)


## 購入月推移

購入日の推移を可視化したビューです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/39dcdfb7-1fe5-95d3-109a-9fff6040529b.png)

上は月ごとに、真ん中は年ごとの推移を表示しています。

また、下のグラフは通年の月ごとの推移を表しているので、どの時期に自分が書籍を多く買う傾向にあるかというのが分かります。


# 終わりに

`xml`ファイルから取得できるデータの種類が少ないためあまり分析案を出すことができませんでしたが、本来の目的であった部分一致の検索機能が実装できたため満足しました。
書籍データを`csv`ファイルに吐き出せれば`PowerBI`で見せる以外にも色んな使い方ができると思うので、みなさんも良い読書ライフを！

# 参考サイト

https://zenn.dev/karaage0703/articles/3a163290a4bc26