article_image

Calibre 可谓是电子书管理工具中的格式工厂,任何相关功能,总是有求必应;但其图形界面却并不讨喜,一方面要怪罪其设计语言落后——这无可厚非,毕竟 Calibre 是跨平台工具,而且又没问你要一分钱);另一方面,则是因为图形界面难以绕开库管理,意即,你需要先把一本书导入(Import)Calibre 库中,才能接着处理,这直接导致 Calibre 书库体积暴涨。即便后续删除,各个角落的残留,也很不干净。1而诸如转换格式等常见操作,其实根本不需要经过书库,此时就需要一种独立于图形界面的操作方式。

目光自然而然转换 Calibre 自带的命令行工具(Command Line Tool)。其实,我在其他文章中已经多多少少用到 Calibre 命令行工具,惟缺少一次专门的上手简洁;而此次谈及电子书格式转换,所涉案例真实、实用而通用,又补足了另一款格式转换工具 Pandoc 在 MOBI 和 AZW 等流行格式方面的空白2,遂以电子书格式转换为例,浅尝 Calibre 命令行之妙。

格式转换命令简介

Calibre 提供了不少命令行工具,例如之前导入书籍时用的 calibredb,而此次使用的则是格式转换工具 ebook-convert此命令如傻瓜相机般浅白,标准语法如下:

ebook-convert 输入文件路径 输出文件路径 参数
Alt text
Calibre 提供了书籍格式转换命令

就最常见的 EPUB 和 MOBI 两类电子书互相转换而言,甚至都不需要设置参数。而 Calibre 本身容错性又极好,我曾在 UNTAG 会员栏目中提及,即便电子书本身格式有误——例如 HTML 代码没写对——Calibre 也会在格式转换时自动修复,你甚至可以写一个把 EPUB 转换成 EPUB 的小工具,用于修复 Apple Books 等娇贵阅读器打不开的电子书。

Alt text
Calibre 可以自动修复电子书

只要熟悉上述命令,就能用 Calibre 转换单本电子书:网上常见的 MOBI 格式电子书,可以转换为开放的 EPUB 格式,放心存储于本地,不再忧心于用什么特殊的阅读器;如更喜直接批注 PDF,圈圈画画,也可以将电子书转换为 PDF 文档……如此种种。

打包成自动化工具

单条命令或许不难,但实际中,往往需要批量转换电子书;并且转换格式,很可能会成为日常操作。综合考虑,方觉有必要自制自动化工具。所幸我多年以来断断续续维护着一个图片格式转换小工具,种种工程细节已臻完善,故将其稍作改动,换上 Calibre 的命令,即做出一款电子书格式转换工具。下图为 LaunchBar 版的演示,选中书籍(可以多选),运行动作,选择需要转换的格式,即可在原文件边上获得转换好的新书。

Alt text
用 LaunchBar 将 MOBI 电子书转换为 EPUB 格式

如前文所言,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 的语境下,命令行还有更重要的含义:摆脱复杂——且有点落伍——的图形界面,以及令人不悦的库管理。


  1. 例如,即便删除书籍,Calibre 还是会为已删除的书空出序号。
  2. Pandoc 在格式转换方面更加全能,但偏偏难以处理常见的 MOBI 格式,而中文互联网上流传的大量电子书(且不过问来源是否合法),恰恰是 MOBI。

author_avatar

Lawyer, macOS/iOS Automation Amateur