article_image

经过 《巴别图书馆计划(一)》 的讨论,Calibre 与 DEVONthink 这两大数据库之间的藩篱,已经通过文件链接 item link 得以翻越1,嗜好阅读之人,终得在 Calibre 统一管理、搜索读过的所有书籍。

不过,这套方法有赖于将 DEVONthink item link 索引到 Calibre,2手动操作难免令人不悦,读者越是嗜书如命、其 DEVONthink 数据库越是汗牛充栋,此刻的整理工作越是近乎愚公移山。

在初次凿通 Calibre 和 DEVONthink 之后,我并未立即开始一锄一铲地创建链接,而是继续磨刀晒网,设计了本文的批量索引脚本,既可以批量索引现有书籍,也能够每次添加新书都自动索引。可惜 Calibre 不允许同时运行脚本和 Calibre 主程序,故无法用动图或视频直观显示添加过程。

Alt text
将 DEVONthink 书籍批量索引到 Calibre

动作使用

注意,Calibre 数据库被设计成不能同时由两个进程来读取,故使用本文动作时需要保持 Calibre 关闭,索引完毕后再打开 Calibre。

本文脚本用 AppleScript 写成,可以直接用系统自带脚本编辑器打开,不做任何修改即可运行,也可以嵌入 Automator、LaunchBar、Alfred、Keyboard Maestro 乃至 Shortcuts 等主流自动化工具中,免去手动建立链接的苦差;有志者还可以结合 DEVONthink 自动化,从而每逢新书入库,就自动在 Calibre 中生成条目。无论以何种方式索引,本文都可以在 Calibre 中创建带有链接的书籍条目,点击即可跳到对应的 DEVONthink 文件。

Alt text
点击链接直达 DEVONthink 文件

在批量索引或自动索引之前,你需要先在 Calibre 中创建一个自定义的栏目(column),在此存放 DEVONthink 的 item link。方法是:在 Calibre 的设置中,找到“Preferences - Add your own columns”,点击“Add custom column”以创建新的栏目,并将其命名为 uuid——可以是别的名字,只要你记得修改自动化动作中的相应代码。紧接着,将这个栏目的格式设置为 HTML,这样得到的链接才是一个超链接,可以直接点击。

Alt text
在 Calibre 中创建栏目

批量索引现有书籍

读到此文的诸位,如果正好在用 DEVONthink,估计其中都有所积累。在任何涉及跨应用协作的话题中,“数据迁移”都是那个阿喀琉斯之踵,只要稍微想想迁移之辛苦,任何好工具、好方法或好流程都要黯淡几分。

我当然也不乐意手动搬运数据。为此,下面这个 AppleScript 脚本就应运而生,你只需打开 DEVONthink,选中需要索引到 Calibre 的书籍,随后在系统脚本编辑器(或其他你喜欢的自动化工具)中运行本文脚本即可。

Alt text
选中文件,运行脚本

索引后的书籍都会以文件名为书名,同时已经附上了 DEVONthink item link,此时已经可以点击链接打开这些书籍。

自动索引新书

书籍信息的同步并不能一劳永逸。常常四处搜罗新书的读者大概懂得个中辛苦:新入库的书籍,可能一时匆忙忘了添加到 Calibre,事后还得对照一下 DEVONthink 和 Calibre 中的书单,看看哪里有缺漏再补上。这种仰赖“好记性”的书籍管理,太容易丢三落四,背离了使用 Calibre 统一管理书籍——节省力气——的初衷。

因此,在解了现存书籍的燃眉之急后,不妨未雨绸缪,设计一套自动从 DEVONthink 索引书籍条目至 Calibre 的流程,让新书自动加入 Calibre。方才我们用过的脚本可以继续效力,只是这次不再依靠脚本编辑器或单独的自动化工具,而是直接使用 DEVONthink 自动化——Smart Rules。

Alt text
设置 Smart Rules 以自动索引 DEVONthink 书籍到 Calibre

如上图所示,这一规则将监测所有 Inbox 收件箱中的 PDF 文件,并将其信息索引到 Calibre。索引部分所用的脚本修改自其前一节,你无需再做改动;如果想改变监控的文件夹,或者需要改变监控条件(比如想排除论文类 PDF,只索引书籍 PDF),可以在“Search in”开始的部分自行调整。

至于具体流程,我提供一个例子,当然诸位不需要照搬:一般来说,PDF 格式的文件既可能是书籍,也可能是论文,还包括剪藏为 PDF 格式的网页,因此最好在索引前做个分拣——书籍以外的 PDF,我们可能并不需要索引到 Calibre。相较其他格式,唯书籍可能需要 OCR 之后才能够正常复制、读取3,此时有个取巧方法,就是创建一个专门的文件夹,用于存放 OCR 过的 PDF,而 DEVONthink 监控的对象也设为这个文件夹。如此一来,进入专用文件夹的都是书籍,而书籍都经过 OCR,且都会自动索引到 Calibre。

至此,我们已经通过批量索引和自动索引两套动作,实现了 DEVONthink 和 Calibre 书籍的连通。

条分缕析

本文所用动作,主要基于 Calibre 的命令行工具打造。Calibre 自带了 calibredb 命令,能够嵌入各家自动化工具,不打开 Calibre 即可添加各类书籍信息。本文动作就用到它分别创建了书籍条目、附上了 item link。

第一条命令用于创建空书籍(empty book),相当于只创建了一个条目,但是并没有把书籍源文件存入 Calibre。这正为我们所需,因为源文件在 DEVONthink 中,只需要索引书籍信息即可,不用也不能触及源文件。该命令如下:

calibredb add --empty --title "书名"

--empty 参数即表示创建空书籍,书名 部分可以自己定义,本文提供的脚本会自动获取 DEVONthink 书名并填充进去。除了通过 --title 设定书名,Calibre 命令行也可以设置作者、出版社乃至出版年份等信息,不过考虑 Calibre 可以通过 ISBN 一举获得各项书籍元数据,我们就没必要再写个脚本一一设置。试着运行一下添加书籍的命令(再次提醒,使用 Calibre 命令行时需要关闭 Calibre),再打开 Calibre,即可看到刚刚入库的新书。

Alt text
索引新书籍的命令

另一条命令用于为现有书籍添加 item link 信息。之前的命令不能添加用户自定义信息,而 item link 恰恰是我们自行创建的,所以还需要本命令填补空缺。运行完毕命令后,目标书籍就会附上 DEVONthink item link,至此即可实现点击跳转。

calibredb set_custom uuid 949 '链接的 HTML 代码'
Alt text
添加链接信息的命令

考虑到目的是“可点击的链接”,我们得把整段带有 DEVONthink item link 的 HTML 代码加进 Calibre,方能实现点击效果。点开任意一本 Calibre 书籍的元数据页面(选中书籍后按下快捷键 E 可快速编辑元数据),可以看到其中的链接均存储为 HTML,所以在添加信息时也需要遵循这个格式。当然,这一切本文动作都已经料理完毕,诸位不必从零再捯饬一遍。

Alt text
Calibre 中的链接格式

至于拼接各条命令、拼装 AppleScript 和 Shell 脚本等枝枝节节,启发性不强,并不值得在此大书特书。毕竟诸君赏光打开此文,好比来我家作客,做菜招待是分内之事,介绍几样特色食材也能活跃气氛,兴许还能鼓动宾客回家一试身手;可一旦就着烹饪话题,锅碗瓢盆、柴米油盐、炸炒炖煮说个没完,那就扫兴了。此刻读罢文章,读者若酒足饭饱,或者跃跃欲试,都足以让我额手称庆。

小结

系列文章开篇就表明,希望用 Calibre 统一管理尽可能所有的书籍;因此,本文方法并不是专门为 DEVONthink 设计的,只是 DEVONthink 刚好有 item link,弗需先自己造一套链接系统,于是系列文章就以其为切入。借助其他支持文件链接的软件,比如 PDF 阅读器 Skim,大概也可以用类似的思路统一索引到 Calibre。可以总结出一个经验结论:

不管你用什么阅读工具,凡举数据和软件分离,并且能够找到稳固可靠的文件链接——无论是用阅读器本身还是第三方工具——就可以由 Calibre 集中管理。

DEVONthink 固然提供了很好的现成工具,但它毕竟不是随处可买的便宜榔头,令其先行,不过是先抛出一个操作量较少的例子,方便诸位了解整个流程。在下一篇文章中,我将介绍一套更通用的方法,可以将任何文件夹中的书籍索引到 Calibre。


  1. DEVONthink item link 的核心部件是 UUID,即 Universally Unique Identifier(通用唯一识别符),相当于文件永不变更的身份证号码,为强调 item link 的唯一性,行文中经常以此代彼、呼之 UUID。
  2. 索引的只是书籍信息,书籍源文件仍然在 DEVONthink 数据库中,全无体积占用之忧。这正是“索引”(Index)之意,有别于搬迁整个文件的“导入”(Import)。
  3. DEVONthink 本身的 OCR 功能需要 Pro 版本。

author_avatar

Lawyer, macOS/iOS Automation Amateur