![見出し画像](https://assets.st-note.com/production/uploads/images/59060382/rectangle_large_type_2_96769a1d4631c49e64a975aff3ad3310.png?width=1200)
Kindle本棚をDIYしてみた(実装編②)
作ったものの概要はこちらです。
今回は前回記事のサーバー側の詳細記事になります。
概要
サーバー側はpythonで構築しました。flaskというモジュールを使っています。データの処理はpandasというライブラリを使っています。python, pandasの方が使いなれているのでこんな感じの実装ですが、もっとやりやすい実装の仕方もあると思います。
中で何をやっているかについて説明していきます。
➀Kindle for PC メタデータ読み込み
xmldictというpythonモジュールを使って、xmlファイルを辞書として読み込みます。その後この辞書をpandasのDataFrameとして読み込みます
②③最新の書籍情報と既存の書籍情報の比較・更新
最新の書籍情報と既存の書籍情報を行います。ここで、「既存の書籍情報」は前回このDataFrameからjson形式で保存した書籍情報となります。初回の場合、最新の書籍情報がそのまま使われます。
いったんjsonファイルに書籍情報を書き出しているのは、ユーザが編集したシリーズIDを保持するためです。シリーズIDは基本的に書籍タイトルの読み仮名から自動的に生成していますが、この方法が不正確だったり、ユーザが独自のシリーズIDを付与したくなることがあることを想定しています。
既存の書籍情報にユーザが付与したシリーズIDがある場合はそちらを優先し、それ以外は自動生成されたシリーズIDを用いて漫画のシリーズを整理します。
{
"ASIN":"B013DG9A8U",
"title":"進撃の巨人(17) (週刊少年マガジンコミックス)",
"authors":{
"author":{
"@pronunciation":"イサヤマハジメ",
"#text":"諫山創"
}
},
"publishers":{
"publisher":"講談社"
},
"publication_date":1438905600,
"purchase_date":1544537734,
"textbook_type":null,
"cde_contenttype":"EBOK",
"content_type":"application\/x-mobipocket-ebook",
"title_pron":"シンゲキノキョジン017 (シュウカンショウネンマガジンコミックス)",
"series_pron":"シンゲキノキョジン",
"series_num":17,
"series_id":"シンゲキノキョジン"
},
書き出すjsonファイル(図⑨)は上記のような辞書を一つの要素とするリストで構成されています。
series_pron:書籍タイトル読み仮名(title_pron)から推定したシリーズID
series_id:シリーズID。ユーザによる変更がなければseries_id=series_pron
④⑤書籍情報からシリーズIDの生成・追加
前回保存した、ユーザが付与したシリーズの評価情報を読み込みます。加えて新たなシリーズがあれば、評価情報が空の要素を追加します。
{
"series_id":"シンゲキノキョジン",
"rate":5.0,
"category":"s",
"expectation":null,
"sp":99.0
},
書き出すjsonファイル(図⑩)は書籍情報と同様に辞書のリストになっています。評価情報として何を入れるかまだ検討中で、えいやーでいくつか要素を詰め込んでます。評価情報は書籍ではなくシリーズに対して付与します。
⑥⑦⑧Flaskで書籍の表示・評価情報の編集
まず、ひな型となるHTML, JavaScript, CSSを表示し、その後Ajaxで書籍情報とシリーズ情報を受け取ります。必要に応じて表示方法や評価情報をflaskとブラウザ間でやり取りします。
今のところソートとかの処理はpython側に任せて、JavaScript側ではただリストの順番に並べるだけといった処理の仕方になっています。
最初はソートとかの処理はJavaScript側で行っていたのですが、自分が使い慣れているpandasの方があとあと機能を拡張しやすいかなと思ってpython側で行うことにしました。
現状本棚部分のHTML生成はJavaScript側で行っていますが、その部分もPythonで作ったほうが楽なのかなと思ったりもします。