calibre:// URL Scheme 协议指南:从命令行、文档与外部程序操控 calibre
【免费下载链接】calibreThe official source code repository for the calibre ebook manager项目地址: https://gitcode.com/GitHub_Trending/ca/calibre
calibre 会将自己注册为calibre://URL 协议的系统处理程序,因此你可以在命令行、HTML 文件、Word 文档乃至任何支持超链接的程序中嵌入这类链接,由操作系统自动唤起 calibre 执行指定动作——打开某本书、切换书库、执行搜索、显示图书详情或作者/系列笔记。读完本文,你将掌握 calibre:// 全部七类动作的 URL 语法、参数编码规则、虚拟书库(Virtual library)交互语义,以及这些链接在 calibre 源码中的解析与执行链路,可直接在自己的脚本、网页和文档中落地使用。
一、calibre:// 协议是什么:注册与分发机制
calibre://是一种自定义 URL scheme。calibre 在安装时会在操作系统层面注册为该协议的默认处理器,因此当你执行:
calibre calibre://switch-library/Some_Library操作系统会将这条 URL 交给 calibre 处理:打开(或唤起已在运行的)calibre 主窗口,并切换到一个名为Some Library的书库。
两个关键的语义约定:
- 书库名称 = 书库文件夹名,其中空格用下划线(
_)代替。例如文件夹名为My Books的书库,在 URL 中写作My_Books。 - 特殊值
_表示“当前书库”——即 calibre 此刻正在使用的那个书库,无需关心其具体名称。
从源码看,URL 的解析入口在 src/calibre/gui2/ui.py 的handle_cli_args:程序启动时遍历命令行参数,凡是以calibre://开头的参数都会被urllib.parse.urlparse拆解为(action, path, query)三元组,其中action(动作类型)取自 URL 的 netloc(主机名部分),随后交给handle_url_action分发到各动作处理器。若 URL 格式非法,会被打印为Ignoring malformed URL并跳过,不影响其余参数处理。
值得注意的细节:handle_cli_args还会顺带处理file://路径(作为待添加的书籍文件),这意味着一行命令可以同时携带 calibre:// 链接与书籍文件路径,例如先切换书库再导入书籍。而 URL 动作的实际执行通过QTimer.singleShot(10, doit)延迟到主窗口完全初始化之后进行,确保界面可用。
二、切换书库:switch-library
语法:
calibre://switch-library/Library_Name其中Library_Name为书库文件夹名(空格用下划线代替),_表示当前书库。若书库名称包含 URL 编码困难的特殊字符,可使用十六进制编码(详见第七节):
calibre://switch-library/_hex_-AD23F4BC_hex_-前缀之后的部分是书库名按 UTF-8 编码后、每个字节用两个十六进制字符表示的结果。
源码中的实际处理(src/calibre/gui2/ui.py):decode_library_id负责把 URL 路径中的库标识还原——遇到_hex_-前缀用bytes.fromhex(...).decode('utf-8')解码;然后通过library_broker.path_for_library_id(library_id)将库 ID 换算为书库路径,仅当目标库与当前库不一致时才触发library_moved切换。
由源码派生出的两个实用变体:
calibre://switch-library-by-path/_hex_-<路径十六进制>:直接按书库绝对路径切换。命令行工具--with-library正是利用这一点,将--with-library <路径>翻译成该 URL 后转发给已运行的实例(见 src/calibre/gui2/main.py),且路径同样使用_hex_-前缀编码,规避了路径中空格、中文等字符的 URL 转义问题。- 书库 ID 同样支持
_hex_-前缀:在查看器或书库详情面板中“复制链接”时,calibre 会用'_hex_-' + library_id.encode('utf-8').hex()生成 URL(见 src/calibre/gui2/viewer/init.py),因此真实复制出来的链接通常不是Some_Books而是_hex_-...形式。
三、在 calibre 中展示指定书籍:show-book
语法:
calibre://show-book/Library_Name/book_idbook_id是一个数字。获取某本书 ID 的两种途径:
- 在主界面Book details(图书详情)面板中,悬停
Click to open链接,路径末尾括号中的数字即为该书 ID; - 在 Book details 面板上右键 → Copy link to book,直接复制当前展示书籍的完整链接。
行为语义(源码见 src/calibre/gui2/ui.py):
- 若当前存在活动搜索且目标书不匹配该搜索,calibre 会先清空搜索再选中目标书,确保书可见;
- 若当前选中了虚拟书库,展示时沿用该虚拟书库;若目标书不在该虚拟书库中,则自动清除虚拟书库限制;
- 若目标书因其他限制(如书库基础限制、命名搜索限制)不可见,还会依次应用重置逻辑后重新选择。
带虚拟书库参数的写法:
calibre://show-book/Library_Name/book_id?virtual_library=Library%20Name calibre://show-book/Library_Name/book_id?encoded_virtual_library=hex_encoded_virtual_library_name虚拟书库名中的空格需替换为%20(即标准 URL 编码)。若目标书不在指定的虚拟书库中,该虚拟书库参数会被忽略。encoded_virtual_library参数则允许以十六进制编码形式传递虚拟书库名。源码中get_virtual_library还会将-解释为空(即不使用虚拟书库),参数virtual_library=_表示保留当前虚拟书库不变。
补充说明:show-book动作的执行封装在perform_url_action中——若目标书库与当前书库不同,会先切换书库再执行选中,这正是 URL 链式动作可组合的根基(src/calibre/gui2/ui.py)。
四、在电子书阅读器中打开指定位置:view-book
语法:
calibre://view-book/Library_Name/book_id/book_format?open_at=locationbook_format:书籍格式名,如EPUB、MOBI(大小写不敏感,源码中统一fmt.upper()后处理);location:可选的书中位置。获得此类链接的最简单方式:在阅读器中打开一本书,通过控件菜单Go to → Location(转到 → 位置),界面会给出可复制的链接。
源码中链接的构造逻辑位于 src/calibre/gui2/viewer/init.py:阅读器用link_prefix_for_location_links拼出calibre://view-book/{library_id}/{book_id}/{book_fmt},并追加?open_at=前缀等待填充具体位置。解析端(src/calibre/gui2/ui.py)读取查询参数open_at,将其透传给View动作的view_format_by_id(book_id, fmt.upper(), open_at=at),由阅读器定位到对应位置。
一个典型用途:把书中的某个章节、某个段落位置链接嵌入到个人笔记、批注系统或书签文件中,点击即可直接打开对应书籍并跳转到指定位置。
五、书库内搜索:search
语法:
calibre://search/Library_Name?q=query calibre://search/Library_Name?eq=hex_encoded_queryquery是任意合法的 calibre 搜索表达式(支持字段限定、逻辑组合等完整搜索语法);- 表达式较复杂时,建议先做十六进制编码(第七节)再用
eq参数传递,避免 URL 编码与特殊字符纠缠; - 省略 query 参数等价于清空当前搜索。
虚拟书库的默认行为:默认情况下,若当前选中了虚拟书库,calibre 会先清除它再搜索,以确保搜索范围覆盖全部书籍;若希望保留当前虚拟书库,使用:
calibre://search/Library_Name?q=query&virtual_library=_若想切换到特定虚拟书库后再搜索:
calibre://search/Library_Name?virtual_library=Library%20Name calibre://search/Library_Name?encoded_virtual_library=hex_encoded_virtual_library_name同样地,虚拟书库名中的空格用%20代替。
生成搜索链接:在主界面搜索框中右键,选择Copy search as URL(将搜索复制为 URL),即可把当前搜索条件一键变成可分享的 calibre:// 链接(见 src/calibre/gui2/search_box.py)。
源码处理逻辑(src/calibre/gui2/ui.py)优先读取eq参数(十六进制解码),其次读取q参数,两者都缺省时搜索串置空实现“清除搜索”;虚拟书库参数同样经get_virtual_library归一化,_表示保留现状。
六、打开书籍详情窗口与作者/系列等条目的笔记
6.1 图书详情弹窗:book-details
语法:
calibre://book-details/Library_Name/book_id与show-book不同,该动作在不改变当前书库、不改变当前选中书籍的前提下,直接弹出一个图书详情窗口展示指定书籍(src/calibre/gui2/ui.py)。因此它适合在不打断当前浏览上下文的情况下快速查看某本书的元数据。
补充:calibre://book-details/Library_Name/authors/val_John%20Doe这样的变体形式出现在官方文档示例中,用于按名称定位条目;从show-note的处理逻辑看,book-details与show-note在路径解析上采用同一套库/字段/条目约定,但需要以源码中当前实现为准。
6.2 显示作者/系列等条目的笔记:show-note
语法:
calibre://show-note/Library_Name/Field_Name/id_Item_Id打开一个显示指定条目笔记的窗口。创建这类 URL 最省事的方法:在 calibre 中打开目标笔记,点击窗口中的Copy URL按钮,即可把当前笔记的 calibre:// 链接复制到剪贴板,粘贴到任何需要的地方。
参数说明:
Field_Name:字段名,如authors、tags;- 自定义列:去掉字段名开头的
#,换成下划线。例如自定义列#mytags在 URL 中写作_mytags(源码中field.startswith('_')时还原为'#' + field[1:],见 src/calibre/gui2/ui.py); - 条目既可以按 ID 指定(
id_Item_Id),也可以按名称指定:val_Item_Name(直接放名称,空格用%20)或hex_Hex_Encoded_Item_Name(名称的十六进制编码)。
源码处理细节(src/calibre/gui2/ui.py):按名称指定时,内部通过db.get_item_id(field, item_val)把名称解析为条目 ID,再调用db.notes_for(field, item_id)检查是否存在笔记;无笔记时会打印No notes available for ...提示。底层笔记数据的读写位于 src/calibre/db/notes/exim.py 等模块,而笔记展示窗口实现在 src/calibre/gui2/dialogs/show_category_note.py。
七、URL 参数的十六进制编码规则
这是全书库协议最核心的通用规则(manual/url_scheme.rst 中定义,被书库名、搜索表达式、虚拟书库名、条目名等共用):
- 将参数值先编码为UTF-8 字节;
- 每个字节替换为两个十六进制字符(小写十六进制)。
例如字符串abc的 UTF-8 字节为0x61 0x62 0x63,编码结果为616263。
在 URL 中通过_hex_-前缀(用于路径段,如书库名)或参数名eq、encoded_virtual_library、hex_前缀(用于条目名)来标识“这里是十六进制编码值”。这一机制彻底规避了 URL 编码(百分号转义)对特殊字符(空格、中文、%、&、?等)的限制,因此包含中文、空格等字符的书库名或搜索表达式,用十六进制编码最稳妥。
八、从命令行与外部文档调用
由于 calibre 注册为系统级 URL 处理器,以下场景均可直接使用:
# 命令行:切换书库 calibre calibre://switch-library/Some_Library # 命令行:搜索 calibre "calibre://search/My_Books?q=author:Asimov" # 命令行:打开指定书籍 calibre calibre://show-book/My_Books/1234- 在HTML 文件、Word 文档等超链接载体中放置
<a href="calibre://show-book/My_Books/1234">打开这本书</a>,点击后操作系统会自动唤起 calibre 执行动作; - 若 calibre 已在运行,URL 会通过进程间消息(
send_message/launched:消息机制,见 src/calibre/gui2/main.py)转发给现有实例执行,避免重复启动;这保证了链接的响应速度与单实例语义。
实用提醒:URL 含空格等特殊字符时,命令行中务必整体加引号;书库名、搜索表达式含复杂字符时优先使用十六进制编码形式;show-book中book_id必须是数字,否则会被当作非法参数忽略并打印告警。
九、总结:动作一览表
| 动作 | 语法 | 核心作用 |
|---|---|---|
switch-library | calibre://switch-library/Library_Name | 切换到指定书库,_表示当前库 |
show-book | calibre://show-book/Library_Name/book_id | 在 calibre 中展示指定书籍(必要时清搜索/清虚拟书库) |
view-book | calibre://view-book/Library_Name/book_id/book_format?open_at=location | 在阅读器中打开书籍并定位到指定位置 |
search | calibre://search/Library_Name?q=query/?eq=hex | 执行搜索(默认清虚拟书库,可用virtual_library=_保留) |
book-details | calibre://book-details/Library_Name/book_id | 弹窗显示图书详情,不改变当前书库与选中 |
show-note | calibre://show-note/Library_Name/Field_Name/id_Item_Id | 显示作者/系列/自定义列等条目的笔记 |
| 十六进制编码 | _hex_-…、?eq=…、?encoded_virtual_library=…、hex_… | 以 UTF-8 字节的十六进制形式传递任意参数 |
以上动作的分发与实现均可追溯至 src/calibre/gui2/ui.py 的handle_url_action;链接的生成端散落在阅读器(src/calibre/gui2/viewer/init.py)、书库详情面板(src/calibre/gui2/book_details.py)、搜索框(src/calibre/gui2/search_box.py)与元数据编辑(src/calibre/gui2/actions/edit_metadata.py)等模块,读者可以顺着这些路径继续深入研读。
掌握 calibre:// 协议,你就能把 calibre 无缝接入自己的工作流:从批处理脚本一键切库、在个人知识库中建立“书 → 阅读位置 → 搜索”的深度链接,甚至让网页应用直接唤起桌面端的 calibre 完成指定操作。
【免费下载链接】calibreThe official source code repository for the calibre ebook manager项目地址: https://gitcode.com/GitHub_Trending/ca/calibre
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考