这些年书没看几本,到处搜刮整理的电子书资源却达到了惊人的 1T 多,检索和查找书籍成了一个头疼的问题。书可以不看,但不能没有,于是开启了庞大的电子书整理之旅。

1. 下载

所有书籍资源都存放在百度网盘里,想靠百度那点小水管不知道要下载到何年马月,于是充值了 SVIP,期间却因为各种文件名过长、违规资源等等导致了很多文件下载失败,修复路径以及在线解压再下载等手段,陆陆续续花了 2 天时间才下载好,但也舍弃了不少“违规”资源,多少还是有一点遗憾。

2. 解压和清理

下载完后用 C# 写了个控制台应用递归遍历解压了各类 zip 以及清理了空文件夹和脏文件(比如百度网盘生成的 .downloading 文件),然后利用 dupeGuru 扫描清理了重复文件。

3. 导入 Calibre

Calibre-Web 的运行依赖于 Calibre 生成 metatde.db 的数据库配置文件,所以先在电脑上安装 Calibre,然后在群晖里新建一个文件夹用于 Calibre 应用目录,最后作为远程文件夹挂载到本机供 Calibre 使用,切记赋予这个文件夹 Everyone 读写权限。

所有书籍导入 Calibre 是一个极度漫长的过程,耗时数十个小时,因为每本书都需要读取元数据生成封面等信息,暂时没有找到快速导入的方法。此外在以 从文件夹和子文件夹添加书籍 方式批量导入书籍时,提示 多文件图书? 对话框,不同的选项,结果也不同:

原始文件夹如下,共 6 本书籍,其中 3 本是包含多种格式(mobi + epub + azw3):

  • 选择 ,导入了 4 本
  • 选择 ,成功导入了 6 本

从结果看,选择“否”之后导入了全部书籍,是我们想要的结果,官方是这样描述这个功能的:

Calibre 假设每个文件夹包含一本书。一个文件夹中的所有电子书文件都假定是同一本书,只是格式不同。

4. 安装 Calibre-Web

网上流行的一些教程都是推荐 technosoft2000/calibre-web 这版 Docker 镜像,功能全面。但经过我安装测试后发现了一些问题,比如单独进行格式转换或者邮件推送 Kindle 是没问题的,但是两者一旦结合,转换并推送 Kindle 时就会失败,翻看了源码,发现在处理邮件发送时,获取待发送的书籍路径多了一层,导致找不到文件。此外还有豆瓣获取元数据的 API 失效,经常卡死,镜像作者也指出没有时间维护了,遂放弃。最终选择了 linuxserver/calibre-web,并完美解决了各种问题。

群晖 Docker 创建容器很简单,基本一路 Next 就可以跑起来了,也可以参考这篇教程

linuxserver/calibre-web 前期使用正常,除了每次启动容器有点慢,整体还是可以的,后期随着 calibre 升级到 v6,群晖内核不支持了,导致格式转换报错,于是选择了 johngong/calibre-web,一个国人维护的版本,很多功能都集成了,开箱即用。

5. 添加格式转换功能

linuxserver/calibre-web 版本镜像没有书籍转换功能,需要在创建容器时新增环境变量 DOCKER_MODS=linuxserver/calibre-web:calibre,切记一定是创建容器时添加,如果创建后再添加,大概率会失败。
启动后登录 Calibre-Web,在权限管理 -> 扩展程序配置 -> Calibre 电子书转换器路径 填写 /usr/bin/ebook-convert,保存即可。

johngong/calibre-web 版本自带,无需额外设置。

6. 设置正确的时区

新增环境变量 TZ=Asia/Shanghai 重启容器即可。
johngong/calibre-web 版本自带,无需额外设置。

7. 添加新的豆瓣 API

新版 Calibre-Web(0.6.14)移除了 douban-api,国内不科学上网的话无法搜索书籍的元数据,网上找到一个解决方案:calibre-web-douban-api,复制 src/NewDouban.pycalibre-web/cps/metadata_provider/ 目录下,重启项目即可。
也可以直接下载后通过 Docker 的卷映射挂载到 /app/calibre-web/cps/metadata_provider/NewDouban.py 目录即可,效果是一样的。
如果遇到搜索元数据时容器卡死,可以删除 /app/calibre-web/cps/metadata_provider/ 下其他源,只保留我们新增的这个豆瓣源,然后重启容器即可。

Ps. johngong/calibre-web 版本设置 ENABLE_DOUBAN_SEARCH=true 环境变量即可。
最新版 johngong/calibre-web 需要把 usr/local/calibre-web/app/cps/metadata_provider 下所有搜刮器删除然后使用新的豆瓣搜刮器,执行下 wget -P /usr/local/calibre-web/app/cps/metadata_provider https://raw.githubusercontent.com/fugary/calibre-web-douban-api/main/src/NewDouban.py 或者也可使用上面提到的卷映射,效果是一样的,最后重启容器即可。参考

8. 开启在线阅读功能

linuxserver/calibre-web 版本默认没有开启该功能,前往 权限管理 编辑对应用户权限,勾选 查看书籍 选项即可。
johngong/calibre-web 版本自带,无需额外设置。

9. 配置 Kindle 推送

首先进行 SMTP 邮件服务器设置,具体可以参考邮箱服务商的帮助文档,比如我用的 QQ。然后前往亚马逊管理我的内容和设备 -> 首选项,获取对应设备的 Kindle 邮箱地址,并设置发件人白名单。最后在 Calibre-Web 里 接收书籍的Kindle邮箱地址 填写即可。
Ps. 国内的推送服务还能使用 2 年,到时候估计得切到美区了。

10. 更新的注意事项

所有版本的 calibre-web 都不推荐在网页内自动更新程序,可能会出现莫名其妙的问题。其实更新容器也很简单,我们只要导出容器设置文件(端口设置、环境变量等都会保留),然后删除容器,更新镜像后通过导入配置文件重新创建容器,所有资料和配置都还在,分分钟就搞定了,当然也可以使用 Watchtower 来自动更新 Docker 镜像与容器。

11.database disk image is malformed

更新元数据时不当的操作可能会导致数据库损坏,后续所有的保存都会提示 database disk image is malformed ......,此时可以尝试使用 SQLite Expert Professional 5metadata.db 进行修复,然后使用修复后的 db 文件覆盖替换就行。