Calibre 可谓是电子书管理工具中的格式工厂,任何相关功能,总是有求必应;但其图形界面却并不讨喜,一方面要怪罪其设计语言落后——这无可厚非,毕竟 Calibre 是跨平台工具,而且又没问你要一分钱);另一方面,则是因为图形界面难以绕开库管理,意即,你需要先把一本书导入(Import)Calibre 库中,才能接着处理,这直接导致 Calibre 书库体积暴涨。即便后续删除,各个角落的残留,也很不干净。1而诸如转换格式等常见操作,其实根本不需要经过书库,此时就需要一种独立于图形界面的操作方式。
目光自然而然转换 Calibre 自带的命令行工具(Command Line Tool)。其实,我在其他文章中已经多多少少用到 Calibre 命令行工具,惟缺少一次专门的上手简洁;而此次谈及电子书格式转换,所涉案例真实、实用而通用,又补足了另一款格式转换工具 Pandoc 在 MOBI 和 AZW 等流行格式方面的空白2,遂以电子书格式转换为例,浅尝 Calibre 命令行之妙。
格式转换命令简介
Calibre 提供了不少命令行工具,例如之前导入书籍时用的 calibredb
,而此次使用的则是格式转换工具 ebook-convert
。此命令如傻瓜相机般浅白,标准语法如下:
ebook-convert 输入文件路径 输出文件路径 参数
就最常见的 EPUB 和 MOBI 两类电子书互相转换而言,甚至都不需要设置参数。而 Calibre 本身容错性又极好,我曾在 UNTAG 会员栏目中提及,即便电子书本身格式有误——例如 HTML 代码没写对——Calibre 也会在格式转换时自动修复,你甚至可以写一个把 EPUB 转换成 EPUB 的小工具,用于修复 Apple Books 等娇贵阅读器打不开的电子书。
只要熟悉上述命令,就能用 Calibre 转换单本电子书:网上常见的 MOBI 格式电子书,可以转换为开放的 EPUB 格式,放心存储于本地,不再忧心于用什么特殊的阅读器;如更喜直接批注 PDF,圈圈画画,也可以将电子书转换为 PDF 文档……如此种种。
打包成自动化工具
单条命令或许不难,但实际中,往往需要批量转换电子书;并且转换格式,很可能会成为日常操作。综合考虑,方觉有必要自制自动化工具。所幸我多年以来断断续续维护着一个图片格式转换小工具,种种工程细节已臻完善,故将其稍作改动,换上 Calibre 的命令,即做出一款电子书格式转换工具。下图为 LaunchBar 版的演示,选中书籍(可以多选),运行动作,选择需要转换的格式,即可在原文件边上获得转换好的新书。
如前文所言,Calibre 也可以修复原书,改正一些较为明显的代码笔误,故我也考虑了转换前后格式相同的情况,此时新文件会以 -2
结尾,现于原文件旁,以免覆盖。动作完全由 Shell 脚本组成,代码附在后面,可以轻松移植;其中 {"mobi", "epub", "pdf"}
部分存储了预设导出格式,你可以照着这个格式,继续添加其他常用的输出格式。
#!/bin/sh
PATH=$PATH:/usr/local/bin/
echo "$# arguments passed"
read -r -d '' applescriptCode1 <<'EOF'
tell application "System Events"
set activeApp to name of first application process whose frontmost is true
activate
set formatList to {"mobi", "epub", "pdf"}
choose from list formatList
return result
end tell
EOF
fformat=$(osascript -e "$applescriptCode1")
idx=0
for f in "$@";do
if [[ "${f##*.}" =~ "$fformat" ]]; then
ebook-convert "$f" "${f%.*}-2.$fformat"
else
ebook-convert "$f" "${f%.*}.$fformat"
fi
let idx=$idx+1
done && afplay "/System/Library/Sounds/Submarine.aiff" && osascript -e "tell application \"LaunchBar\" to display in notification center \"Converted $idx ebooks\" with title \"Calibre Convertor\""
小结
命令行并非是“just another way”,其自有全然不同于图形界面的价值。
命令行或其他代码交互方式之于自动化玩家,如同砂糖之于烘焙:不可或缺。而在 Calibre 的语境下,命令行还有更重要的含义:摆脱复杂——且有点落伍——的图形界面,以及令人不悦的库管理。