轻云浏览器
7.30M · 2026-02-08
Calibre 是一款功能强大的电子书管理器。它能够查看、转换、编辑和编目所有主流电子书格式,还可以与电子书阅读器设备通信。Calibre 能够从互联网获取图书元数据,下载新闻并转换为电子书以便阅读。它是跨平台的,可以在 Linux、Windows 和 macOS 上运行。
访问 calibre-ebook.com 下载适合您操作系统的安装包:
克隆仓库:
git clone
cd calibre
设置开发环境:
python setup.py develop
构建依赖项:
python setup.py build_dep
启动 Calibre 图形界面:
calibre
使用命令行工具转换电子书:
ebook-convert input.epub output.mobi
启动内容服务器:
calibre-server
Calibre 包含多个命令行工具:
calibre - 主图形界面程序ebook-viewer - 电子书查看器ebook-edit - 电子书编辑器ebook-convert - 格式转换工具calibredb - 数据库管理工具calibre-server - 内容服务器calibre-customize - 插件管理工具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'])
/*
* 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;
}
#!/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=