Calibre:全能电子书管理器

Calibre 是一款功能强大的电子书管理器。它能够查看、转换、编辑和编目所有主流电子书格式,还可以与电子书阅读器设备通信。Calibre 能够从互联网获取图书元数据,下载新闻并转换为电子书以便阅读。它是跨平台的,可以在 Linux、Windows 和 macOS 上运行。

功能特性

  • 电子书查看与转换:支持所有主流电子书格式的查看和互相转换。
  • 元数据管理:自动从互联网获取图书封面、作者、简介等元数据。
  • 设备同步:与各种电子书阅读器设备无缝连接和同步。
  • 新闻下载:将新闻网站内容下载并转换为电子书格式。
  • 图书编目:强大的图书馆管理功能,支持自定义分类和智能收藏。
  • 插件系统:支持通过插件扩展功能。
  • 内置阅读器:包含功能完整的电子书阅读器。
  • 命令行工具:提供完整的命令行界面,支持自动化操作。
  • 内容服务器:内置 Web 服务器,可在浏览器中访问电子书库。
  • 跨平台支持:原生支持 Linux、Windows 和 macOS 系统。

安装指南

直接下载安装

访问 calibre-ebook.com 下载适合您操作系统的安装包:

  • Windows:.exe 安装程序
  • macOS:.dmg 磁盘映像
  • Linux:二进制安装包或通过包管理器安装

从源码构建

  1. 克隆仓库:

    git clone 
    cd calibre
    
  2. 设置开发环境:

    python setup.py develop
    
  3. 构建依赖项:

    python setup.py build_dep
    

系统要求

  • Python 3.8 或更高版本
  • Qt 6 库
  • 各平台特定的依赖库(在构建过程中会自动处理)

使用说明

基础使用

启动 Calibre 图形界面:

calibre

使用命令行工具转换电子书:

ebook-convert input.epub output.mobi

启动内容服务器:

calibre-server

核心工具

Calibre 包含多个命令行工具:

  • calibre - 主图形界面程序
  • ebook-viewer - 电子书查看器
  • ebook-edit - 电子书编辑器
  • ebook-convert - 格式转换工具
  • calibredb - 数据库管理工具
  • calibre-server - 内容服务器
  • calibre-customize - 插件管理工具

API 使用示例

Calibre 提供丰富的 Python API,可用于自动化处理:

from calibre.ebooks.conversion.cli import main as convert_main
from calibre.library import db

# 初始化数据库连接
library_db = db('/path/to/calibre/library')

# 获取所有图书
all_books = library_db.new_api.all_book_ids()

# 转换电子书格式
convert_main(['input.epub', 'output.mobi', '--output-profile', 'kindle'])

核心代码解析

启动器核心代码(C语言实现)

/*
 * launcher.c
 * 跨平台启动器实现
 * 设置环境变量并执行主程序
 */
#define PATHLEN 1023

int main(int argc, char **argv) {
    static char buf[PATHLEN+1] = {0}, lib[PATHLEN+1] = {0}, base[PATHLEN+1] = {0}, exe[PATHLEN+1] = {0}, *ldp = NULL;

    // 读取可执行文件路径
    if (readlink("/proc/self/exe", buf, PATHLEN) == -1) {
        fprintf(stderr, "Failed to read path of executable with error: %sn", strerror(errno));
        return 1;
    }
    
    // 设置环境变量
    SET("CALIBRE_QT_PREFIX", base)
    SET("LD_LIBRARY_PATH", buf)
    SET("OPENSSL_MODULES", buf)

    // 执行主程序
    argv[0] = exe;
    if (execv(exe, argv) == -1) {
        fprintf(stderr, "Failed to execute binary: %s with error: %sn", exe, strerror(errno));
        return 1;
    }

    return 0;
}

Python 扩展构建系统

#!/usr/bin/env python
# setup.py - Calibre 构建系统核心
"""
Calibre 扩展构建系统,支持多平台编译和打包
"""
import os
import re
import sys

src_base = os.path.dirname(os.path.abspath(__file__))

def check_version_info():
    """检查 Python 版本要求"""
    with open(os.path.join(src_base, 'pyproject.toml')) as f:
        raw = f.read()
    m = re.search(r'''^requires-pythons*=s*['"](.+?)['"]''', raw, flags=re.MULTILINE)
    assert m is not None
    minver = m.group(1)
    # 验证版本兼容性
    if not is_ok:
        sys.exit(f'calibre requires Python {minver}. Current Python version: {".".join(map(str, sys.version_info[:3]))}')

class Extension:
    """扩展模块定义类"""
    def __init__(self, name, sources, **kwargs):
        self.data = d = {}
        self.name = d['name'] = name
        self.sources = d['sources'] = absolutize(sources)
        self.needs_cxx = d['needs_cxx'] = bool([1 for x in self.sources if os.path.splitext(x)[1] in ('.cpp', '.c++', '.cxx')])
        self.headers = d['headers'] = absolutize(kwargs.get('headers', []))
        self.inc_dirs = d['inc_dirs'] = absolutize(kwargs.get('inc_dirs', []))
        self.lib_dirs = d['lib_dirs'] = absolutize(kwargs.get('lib_dirs', []))

冻结打包系统

#!/usr/bin/env python
# freeze.py - 应用冻结和打包
"""
将 Python 应用打包为独立可执行文件
"""
import os
import shutil
import subprocess
from functools import partial

from bypy.constants import LIBDIR, PREFIX, python_major_minor_version
from bypy.utils import run_shell

def binary_includes():
    """收集二进制依赖文件"""
    ffmpeg_dlls = tuple(os.path.basename(x).partition('.')[0][3:] for x in glob.glob(os.path.join(FFMPEG_PREFIX, '*.so')))
    return [
        j(PREFIX, 'bin', x) for x in ('pdftohtml', 'pdfinfo', 'pdftoppm', 'pdftotext', 'optipng', 'cwebp', 'JxrDecApp')] + [
        j(PREFIX, 'private', 'mozjpeg', 'bin', x) for x in ('jpegtran', 'cjpeg')] + list(map(
            get_dll_path,
            ('usb-1.0 mtp expat ffi z lzma openjp2 poppler dbus-1 iconv xml2 xslt jpeg png16'
             ' webp webpmux webpdemux sharpyuv exslt ncursesw readline chm hunspell-1.7 hyphen'
             ' icudata icui18n icuuc icuio stemmer gcrypt gpg-error uchardet graphite2 espeak-ng'
             ' brotlicommon brotlidec brotlienc zstd podofo ssl crypto deflate tiff onnxruntime'
             ' gobject-2.0 glib-2.0')
        ))

插件系统架构

#!/usr/bin/env python
# 插件系统示例
"""
Calibre 插件系统架构示例
"""
import builtins
import os
import sys

# 插件基类
class FileTypePlugin:
    """文件类型插件基类"""
    name = '插件名称'
    description = '插件描述'
    supported_platforms = ['windows', 'osx', 'linux']
    author = '作者'
    version = (1, 0, 0)
    file_types = {'epub', 'mobi'}
    on_postprocess = True
    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

跨平台构建配置

#!/usr/bin/env python
# 跨平台构建配置
"""
处理不同平台的构建差异
"""
import os
import sys

# 平台检测
iswindows = re.search(r'win(32|64)', sys.platform)
ismacos = 'darwin' in sys.platform
islinux = not ismacos and not iswindows and not isbsd and not ishaiku

# 平台特定配置
if iswindows:
    # Windows 特定设置
    from setup.vcvars import query_vcvarsall
    env = query_vcvarsall()
    win_path = env['PATH']
    os.environ['PATH'] = merge_paths(env['PATH'], os.environ['PATH'])
elif ismacos:
    # macOS 特定设置
    ENV = dict(
        FONTCONFIG_PATH='@executable_path/../Resources/fonts',
        FONTCONFIG_FILE='@executable_path/../Resources/fonts/fonts.conf',
        SSL_CERT_FILE='@executable_path/../Resources/resources/mozilla-ca-certs.pem',
    )
elif islinux:
    # Linux 特定设置
    os.environ['LD_LIBRARY_PATH'] = os.path.join(PREFIX, 'lib')

国际化支持系统

#!/usr/bin/env python
# 国际化系统
"""
处理多语言翻译和本地化
"""
import json
import os
from collections import defaultdict

def serialize_msgid(text):
    '''按照 GNU POT 格式序列化字符串'''
    if not text:
        return 'msgid ""n'
    # 转义反斜杠和引号
    escaped = text.replace('\', r'\').replace('"', r'"')
    ans = ['msgid ""']
    lines = escaped.splitlines()
    for line in lines:
        trailer = '"' if line is lines[-1] else r'n"'
        ans.append(f'"{line}{trailer}')
    return 'n'.join(ans)

class TranslationManager:
    """翻译管理器"""
    def __init__(self):
        self.translations = defaultdict(dict)
    
    def add_translation(self, language, key, value):
        """添加翻译"""
        self.translations[language][key] = value
    
    def generate_pot_file(self):
        """生成 POT 模板文件"""
        pot_content = []
        pot_content.append('msgid ""')
        pot_content.append('msgstr ""')
        pot_content.append('"Content-Type: text/plain; charset=UTF-8\n"')
        
        for key in sorted(self.translations['en'].keys()):
            pot_content.append('')
            pot_content.append(serialize_msgid(key))
            pot_content.append('msgstr ""')
        
        return 'n'.join(pot_content)

这些代码展示了 Calibre 的核心架构,包括跨平台启动器、扩展构建系统、插件架构和国际化支持。项目采用模块化设计,每个组件都有清晰的职责分离,使得维护和扩展变得容易。FINISHED QEHhY4oFma5gLUWjolaPoAWVwAn3V7aQMaT4L47PbMQ=

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:alixiixcom@163.com