calibreのplugin自作にあたっての覚書

もうタイトル通りcalibreのpluginを自作したい。しかし半年も経てばどうせ忘れるのでここにメモしておこうと思う。

まずは公式ページで情報を漁る

Writing your own plugins to extend calibre’s functionality
API documentation for plugins
上記はplugin sampleにAPI ReferenceだがAPIはこれだけではない。APIを全て把握しようと思ったらcalibreのsource codeにあたる必要がある。calibrepythonで書かれているので本体の機能はほぼ全部APIから叩けるはず。

細かいフォルダ及びファイル構造なんて言い出したらキリがないのでその辺はsampleを読み込む事。なんだったら似たような事してるpluginを参考にする事。しかしここで注意点がある。まだcalibre本体の機能が未熟だった時代からある古参のpluginは機能の殆どを自前で実装してる場合がある。今から新規に作るならそんな事する必要はない場合も多い。その場合は本体の該当機能のclassをcalibreのsourceから探す事。この作業は相当大変。

よく使うオブジェクトの本体のclass

推測でしかないがたぶん実体はここ。

library_view
calibre.gui2.library.views.BooksView
db
calibre.librarydatabase2.LibraryDatabase2

library_viewというのはlibraryのテーブル操作が主。多分get_selected_ids以外あまり使わない。dbは文字通りdbだがlibrary_view配下のオブジェクトなのでlibraryを複数持っている場合は切り替える必要がある。

pluginアイコン

pluginアイコンをツールバーに追加するにあたって追加できないツールバーを設定できるdont_add_toというfrozensetがある。
値の候補は以下

all_locations = frozenset(["toolbar", "toolbar-device", "context-menu", "context-menu-device", "toolbar-child", "menubar", "menubar-device", "context-menu-cover-browser", "context-menu-split", "searchbar"])
MOBI及びAZW系フォーマットの扱い方
calibre.ebooks.mobi.reader.mobi6.MobiReader
calibre.ebooks.mobi.reader.mobi8.Mobi8Reader

辺りを見ればいいはず。今回は画像をzipにしたいだけなので

calibre.ebooks.mobi.reader.mobi6.MobiReader.extract_content
calibre.ebooks.mobi.reader.mobi6.MobiReader.extract_images

辺りを叩けばいいはずだがparse_cacheやprocessed_records等の引数に何を指定していいか分からない。今回作成するpluginだと結局DRM判定に使ってるだけなのであまり必要ない。将来の機能拡張用にあるだけ。

KFX系フォーマットの扱い方

統合的に扱うclassはまだ7.9.0の時点でない。つまりcalibre本体がまだ対応してない。KFX Inputが必要。metadata読み取りだけなら

calibre.ebooks.metadata.kfx.read_metadata_kfx

がある。

データ展開の仕方
calibre.ebooks.conversion.plumber.Plumber

を起点にして取り扱う。conversionなので変換系のclass。インスタンス作成の際の引数だが、inputは書籍データの絶対PATH、outputは展開するフォルダ。問題はlogだが

calibre.utils.logging.default_log

を指定しておけば取り敢えずいいらしい。

プログレスバーを出したい
calibre.gui2.dialogs.progress.ProgressDialog

を使えばいいのだがこれは当然非同期で動かす必要がある。しかしそもそもpythonで非同期は面倒臭い。JavaScriptのpromiseみたいに簡単にはいかない。calibre内部のProgressDialogを使ってる個所ではQThreadを親classとして使ってるので検索してパクった方が手っ取り早い。