Calibre の書誌情報ダウンロード・プラグインの日本語対応

ファイル名などを基にして検索することで書誌情報をダウンロードするCalibreのプラグインを自分が持っているPDFの日本語ファイル名に対応するよう試みた。

背景

日本語の書名や著者名、出版社が統一のとれていない形でファイル名に含まれている書籍をスキャンしたPDFファイルがある。それらを電子書籍管理ソフトウェア Calibre で管理しようと思って少し試してみている。

書誌情報をダウンロードする機能として、Amazonの情報をGoogle で検索して、可能ならWebキャッシュから情報を得るようになっていると思われるものが組み込まれている。

少し試してみたが、書誌情報がうまく得られない。原因を調べるとファイル名中の単語をうまく抽出できないためのようであった。日本語の記号などを認識していないようであり、そのために、書名や著者名が連続したキーワードで検索したりしているために、求める書籍情報が検索結果に含まれない。

作成したプラグインの概要

そこで、日本語対応を少し試みるプラグインを作成してみた。テストが不十分なので、とりあえず、ここに記録を残しておく。日本語に対応させたが、英語への対応が十分でなくなったりしている。統合したものを作成すべきと思うが、当面は、日本語対応のプラグインと英語などに対応しているプラグインを併用することで対応することにする。

うまくできるようになった書籍もあるが、自動的にはうまくみつけられない書籍もまだ残っている。もっとも、書名の一部が間違っていたりすると当然ながら適切な情報が得られない。

主な変更点

書籍のタイトルと著者の文字列のトークン化の際に、日本語などCJK文字の記号類を空白に変換して、トークンに分けるようにした。

また、検索結果からの書誌情報では著者や訳者の名前のいずれかが欠落している場合もあったので、元のファイル名に含まれていた情報をコメントに残すようにした。

記号とみなした文字

最後に示すプログラムでは以下の表のCJK関連の文字を記号として、空白に変換し、それを区切りとしてトークンを切り出すようにした。他にも記号として考えられる文字はあるが、自分の日本語ファイル名で使っていないと思われるものは対象外を基本的とした。

Unicode一覧表 (http://www.shurey.com/js/works/unicode.html) を参考にした。

区分 Unicode 文字
一般句読点
(General Punctuation)
U+2000 から U+206F
CJKの記号及び句読点
(CJK Symbols and Punctuation)
U+3000 から U+3004
U+3006 から U+303F
空白および 、から〄 と 〆 から 〿
U+3005「々」を除く
囲みCJK文字・月
(Enclosed CJK Letters and Months)
U+3200 から U+32FF ㈀ から ㋿
CJK互換用文字
(CJK Compatibility)
U+3300 から U+33FF ㌀ から ㏿
半角・全角形 (Halfwidth and Fullwidth Forms)の全角の記号 U+FF00 から U+FF65までの右に示す文字 ＀!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~⦅⦆。「」、・

基にした Calibre

基にしたCalibre のバージョンは 4.2.0 である。

GitHubのkovidgoyal/calibre の次のソースを基にしてプラグインを作成してみた。

src/calibre/ebooks/metadata/sources/amazon.py

作成したプラグインの名前は AmazonJP とした。

プラグインのCalibre への組み込み方法

単一のファイルのみで構成されているので、作成したプラグインファイル _init__.py だけを含むZIPファイルを作成する。たとえば、ファイル名を AmazonJP.zip とする。

Calibre の 「設定」の「高度な設定」にある「プラグイン」を選択する。

次に、「ファイルからプラグインを読み込む」を選択する。

プラグインのZIPファイル(ここでは、AmazonJP.zip)を選択する。

次のような確認が出る。「はい」をクリックすることで次に進む。

プラグインがインストールされたら次のようなパネルが表示されるはず。「OK」をクリックすると次に進む。

プラグインの一覧でインストールを確認できる。

「適用」をクリックすることで「設定」のパネルに戻る。

「設定」のパネルの「閉じる」をクリックしてメイン画面に戻る。

プラグインを有効にするためには再起動するようにということなので、再起動を行う。

たとえば、次のようにデバッグモードで再起動する。

プラグインの有効化のしかた

「設定」を開いて「書誌情報のダウンロード」を選択する。

書誌情報のダウンロードに使えるプラグインが表示されるので、必要なプラグインにチェックを入れて選択する。「適用」をクリックし、「設定」パネルも「閉じる」。

書誌情報のダウンロードのしかた

いくつかの方法があるが、簡単なのは、メイン画面で書籍を選択し、Control-D を押すことであろう。

次のようなダイアログが表示されるので、「書誌情報のみのダウンロード」、「表紙のみのダウンロード」、「両方ダウンロード」から必要なものをクリックして選択する。

以下では、「両方ダウンロード」を選択した場合を示す。

しばらすくすると右下に以下のような通知が表示されるはず。

一般に確認が必要と思われるので「ダウンロードした書誌情報をレビュー」をクリックして選択する。

元のデータのままがよければ、その項目の「<」をクリックすると、その内容が左側の更新される情報にコピーされる。

左側は直接修正できても良いと思うが、NASのDockerをWebインタフェースで使っている場合には、ASCIIは入力できるが、日本語などはうまく入力できない(Web browserをつかわないデスクトップアプリであれば大丈夫)。原因と改善方法の調査は今後である。

左側の情報で満足したら、「OK」をクリックして、書誌情報の更新を実際に行う。

作成したプラグインファイル __init__.py

プラグインには __init__.py ファイルが必ず必要であり、ここでは1つのファイルだけを使っているので、ファイル名は「__init__.py」でなければならない。

変更点の前には # kunsen という行があるはず。

__init__.py を含むzipファイル amazonJP.zip を参考までに置いておく。

コメント

  1. アキラ より:

    入れさせていただきます!
    ありがとうございます!

  2. アキラ より:

    すいません。
    プラグインとなるファイルをどのように保存すればいいかを書いていただけれるとありがたいです。

    • epi より:

      _init__.py だけを含むZIPファイル(たとえば、AmazonJP.zip)を作成して、それを「ファイルからプラグインを読み込む」で読み込んでみてください。

  3. アキラ より:

    calibre, version 4.2.0
    エラー: ハンドルされない例外: InvalidPlugin:The plugin in u'C:\\Users\\\u30df\u30ab\u30c9\\Downloads\\amazon.zip' is invalid. It does not contain a top-level __init__.py file

    calibre 4.2 [64bit] embedded-python: True is64bit: True
    Windows-10-10.0.18362-SP0 Windows ('64bit', 'WindowsPE')
    ('Windows', '10', '10.0.18362')
    Python 2.7.16+
    Windows: ('10', '10.0.18362', 'SP0', u'Multiprocessor Free')
    Interface language: ja
    Traceback (most recent call last):
    File "site-packages\calibre\gui2\preferences\plugins.py", line 319, in add_plugin
    File "site-packages\calibre\customize\ui.py", line 472, in add_plugin
    File "site-packages\calibre\customize\ui.py", line 61, in load_plugin
    File "site-packages\calibre\customize\zipplugin.py", line 194, in load
    File "site-packages\calibre\customize\zipplugin.py", line 292, in _locate_code
    InvalidPlugin: The plugin in u'C:\\Users\\\u30df\u30ab\u30c9\\Downloads\\amazon.zip' is invalid. It does not contain a top-level __init__.py file
    ↑がでて上手くいきませんでした。

    プログラムをテキストファイルに貼り付けて名前を_init__.py にして、圧縮してZIPファイルに変換し、AmazonJP.zipに名前を読み込ませようとしましたが、おそらく認識してくれてないようです。
    作者様のを上手く使えるように、勉強してからまた試してみます。
    丁寧にありがとうございました。

    • epi より:

      申し訳ありません。まず、以前のコメントへの返信の訂正です。ファイル名は本文の記述通り __init__.py でなければなりません。initの前の「_」は2個です。
      __init__.py を含む amazonJP.zip をダウンロードできるようにしました。参考になれば幸いです。

  4. take より:

    当プラグインですが、calibre 5.xにご対応する予定はございませんでしょうか?
    4.xで利用させて頂きましたが、バージョンアップで動作しなくなったため、コメントさせて頂いた次第となります