Calibre插件开发

Calibre插件开发

​ 最近在使用calibre-web管理电子书,不过很多时候还是需要用到Calibre桌面版软件,批量管理,编辑电子书等功能,在calibre-web上已经使用calibre-web-douban-api搜素豆瓣元数据,但是桌面版Calibre软件缺没有办法使用,不过calibre可以使用插件,而且是使用python开发,因此可以把calibre-web-douban-api改造一下包装成calibre插件,简单元数据插件还是比较容易的

参考文档

https://manual.calibre-ebook.com/creating_plugins.html#pluginstutorial

首先本地已经安装了calibre软件

基本插件开发

开发HelloWorld插件

新建Python工程文件夹

新建__init__.py,名字必须是这个。

参考HelloWorld,这个插件是文件类型插件,继承FileTypePlugin:

from calibre.customize import FileTypePlugin

class HelloWorld(FileTypePlugin):

    name                = 'Hello World Plugin' # Name of the plugin
    description         = 'Set the publisher to Hello World for all new conversions'
    supported_platforms = ['windows', 'osx', 'linux'] # Platforms this plugin will run on
    author              = 'Acme Inc.' # The author of this plugin
    version             = (1, 0, 0)   # The version number of this plugin
    file_types          = set(['epub', 'mobi']) # The file types that this plugin will be applied to
    on_postprocess      = True # Run this plugin after conversion is complete
    minimum_calibre_version = (0, 7, 53)

    def run(self, path_to_ebook):
        from calibre.ebooks.metadata.meta import get_metadata, set_metadata
        with open(path_to_ebook, 'r+b') as file:
            ext  = os.path.splitext(path_to_ebook)[-1][1:].lower()
            mi = get_metadata(file, ext)
            mi.publisher = 'Hello World'
            set_metadata(file, mi, ext)
        return path_to_ebook

命令安装插件

在刚才工程目录下面执行下面的命令:

calibre-customize -b .
# 输出:Plugin updated: Hello World Plugin (1, 0, 0)

然后到calibre软件中查看:

image-20211215204715335

可以看到插件已经安装到calibre中了。

image-20211215210055084

这个插件是在转换格式的时候使用到。

开发元数据插件

现在可以开始开发元数据插件了。

可以先下载calibre的源码,然后参考里面的其他元数据插件开发:

calibre的开源地址:https://github.com/kovidgoyal/calibre

也可以参考其他人开发的豆瓣插件:https://github.com/jnozsc/calibre-douban

改造成元数据

现在可以改造HelloWorld插件,元数据插件需要继承。

calibre.ebooks.metadata.sources.base.Source,主要需要实现identitydownload_cover方法

简单开发出基本结构:

import datetime
from calibre.ebooks.metadata.book.base import Metadata
from calibre.ebooks.metadata.sources.base import Source, Option
class NewDouban(Source):
    name = 'New Test Books'  # Name of the plugin
    description = 'Downloads metadata and covers from Douban Books web site.'
    supported_platforms = ['windows', 'osx', 'linux']  # Platforms this plugin will run on
    author = 'Gary Fu'  # The author of this plugin
    version = (1, 0, 0)  # The version number of this plugin
    minimum_calibre_version = (5, 0, 0)
    capabilities = frozenset(['identify', 'cover'])
    touched_fields = frozenset([
        'title', 'authors', 'tags', 'pubdate', 'comments', 'publisher',
        'identifier:isbn', 'rating', 'identifier:new_douban'
    ])  # language currently disabled
    options = (
    )
    def identify(
            self,
            log,
            result_queue,
            abort,
            title=None,
            authors=None,  # {{{
            identifiers={},
            timeout=30):
        result_queue.put(get_test_book())
def get_test_book():
    book = Metadata('深入理解计算机系统(原书第3版)', ['龚奕利', '贺莲'])
    book.identifiers = {'new_douban': '26912767'}
    book.pubdate = datetime.date(2016, 11, 1)
    book.publisher = '机械工业出版社'
    return book

if __name__ == "__main__":
    # To run these test use: calibre-debug -e ./__init__.py
    from calibre.ebooks.metadata.sources.test import (
        test_identify_plugin, title_test, authors_test
    )
    test_identify_plugin(
        NewDouban.name, [
            ({
                 'identifiers': {
                     'isbn': '9787111544937'
                 },
                 'title': '深入理解计算机系统(原书第3版)'
             }, [title_test('深入理解计算机系统(原书第3版)', exact=True),
                 authors_test(['龚奕利', '贺莲'])])
        ]
    )

插件本地测试:

# 插件定义安装
calibre-customize -b .
# 如果有测试代码,这个是可以调用测试
calibre-debug -e __init__.py

完善插件具体代码

参考calibre-web-douban-api的代码,改造成calibre插件,具体源代码见GitHub开源:

开源地址:https://github.com/fugary/calibre-douban

打包发布

calibre插件就是一个zip包,可以直接把__init__.py打包成zip即可,可以编写一个工具build.py

import os
import shutil
import zipfile
def zip_dir(input_path, output_file):
    output_zip = zipfile.ZipFile(output_file, "w", zipfile.ZIP_DEFLATED)
    for path, dir_names, file_names in os.walk(input_path):
        # 原路径修复: ./src/test -> /test
        parsed_path = path.replace(input_path, '')
        for filename in file_names:
            full_path = os.path.join(path, filename)
            print('zip adding file %s' % full_path)
            # 文件路径,压缩路径
            output_zip.write(full_path, os.path.join(parsed_path, filename))
    output_zip.close()
if __name__ == "__main__":
    input_path = "src"
    out_path = "out"
    output_file = out_path + "/NewDouban.zip"
    if os.path.exists(out_path):
        print('clean path %s' % out_path)
        shutil.rmtree(out_path)
    os.mkdir(out_path)
    zip_dir(input_path, output_file)

发布地址:https://github.com/fugary/calibre-douban/releases

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇