| name | calibre-drafts-api |
| description | Use when submitting, canceling, or reviewing Calibre metadata draft operations through the drafts API, including update, delete, and metadata search requests. Covers book ID rules, field update semantics, dangerous delete safeguards, and review workflow constraints. |
Calibre 书籍草稿 API
用于向本地 Calibre 配套服务提交待审核元数据草稿;生效需管理员审核。
配置
配置文件路径:~/.config/calibre-drafts-api/config.json
首次使用前,检查配置文件是否存在:
cat ~/.config/calibre-drafts-api/config.json
若不存在,提示用户创建:
mkdir -p ~/.config/calibre-drafts-api
cat > ~/.config/calibre-drafts-api/config.json << 'EOF'
{
"base_url": "http://localhost:3000"
}
EOF
配置说明
| 字段 | 必填 | 说明 | 示例 |
|---|
base_url | 是 | Calibre API 服务基址,不包含 /api 后缀 | http://localhost:3000 |
常见配置示例
# Docker Compose 部署(默认)
{"base_url": "http://localhost:3000"}
# 直接运行后端
{"base_url": "http://localhost:8080"}
# 生产环境
{"base_url": "https://calibre-api.example.com"}
地址使用规则
- 配置的
base_url 不应包含尾随的 /api
- 所有接口路径由
base_url + /api/... 拼接
- ✅ 正确: 配置
http://localhost:3000,使用 http://localhost:3000/api/drafts/update
- ❌ 错误: 配置
http://localhost:3000/api,导致 http://localhost:3000/api/api/drafts/update
何时使用
使用此技能当:
- 需要批量提交 Calibre 书籍元数据更新草稿
- 需要提交删除书籍的待审核请求
- 清理垃圾标签、补全缺失元数据
- 搜索在线元数据(豆瓣等源)以获取正确的书籍信息
- 撤销已提交的待审核草稿(更新或删除)
- 调用本地 Calibre 配套服务的草稿 API
不使用此技能当:
- 只读访问 Calibre 书库(使用
calibre-library 技能)
- 直接修改 Calibre 数据库(不推荐,应通过官方 API)
ID 约定(重要)
updates[].id(POST /api/drafts/update):Calibre 书籍 ID(字符串,与书库/API 中书籍主键一致)。
ids(POST /api/drafts/delete、POST /api/drafts/cancel):书籍 ID 的数组,与上相同;不是草稿表主键或其它内部 ID。
批量更新草稿
- 方法/路径:
POST /api/drafts/update
- Content-Type:
application/json
请求体结构
updates: 数组,每项含 id(书籍 ID 字符串)与 data(要修改的字段对象)。
字段更新规则(必须遵守)
| 字段类型 | 包含字段 | 不传 / null | [] 或 "" | 非空值 |
|---|
| Tags | tags | 不更新 | 清空全部标签(唯一允许「清空」的字段) | 设为该标签列表 |
| Authors | authors | 不更新 | 拒绝(不可清空作者) | 更新作者列表 |
| 字符串 | title, publisher, comments, isbn | 不更新 | 拒绝(不可清空) | 更新为该值 |
响应示例
{
"code": 200,
"message": "success",
"data": {
"received": 3
}
}
注意事项
- 同一本书多次提交会合并:已有待审核草稿时,新提交会更新该草稿而非新建。
- 只传需要改的字段:未出现的字段表示不更新。
- 违规字段单独忽略:某字段违反规则时该字段被丢弃,其余合法字段仍保存;可查服务端日志确认。
- 批量:一次请求可包含多本书。
更多 JSON 请求示例见 examples.md。
列出草稿
GET /api/drafts?limit=50&offset=0
(完整 URL:{基址}/api/drafts?...)
元数据搜索
- 方法/路径:
GET /api/metadata/search
- 用途: 搜索在线元数据源(如豆瓣),获取书籍的标准元数据信息
查询参数
| 参数 | 类型 | 必填 | 说明 |
|---|
query | string | 是 | 搜索关键词:书名、作者、ISBN 等 |
响应示例
{
"code": 200,
"message": "success",
"data": [
{
"id": "douban:123456",
"title": "三体",
"authors": ["刘慈欣"],
"publisher": "重庆出版社",
"pubdate": "2008-1",
"isbn": "9787536692930",
"tags": ["科幻", "小说"],
"rating": 9.3,
"cover": "https://...",
"comments": "文化大革命如火如荼..."
}
使用场景
- 补全缺失元数据前查询:搜索正确的书籍信息,然后通过
POST /api/drafts/update 提交草稿
- 验证 ISBN:通过 ISBN 搜索,确认书籍信息是否正确
- 查找标准出版信息:获取规范的出版社名称、出版日期等
注意事项
- 搜索结果来自在线源(如豆瓣),需要网络连接
- 返回的是候选列表,需要人工确认选择正确的条目
id 字段(如 douban:123456)是元数据源的内部标识,不是 Calibre 书籍 ID
撤销草稿
- 方法/路径:
POST /api/drafts/cancel
- Content-Type:
application/json
用于撤销已提交、尚未审核通过的草稿:放弃本次待合并的修改,该书不再保留对应待审核草稿。
请求体(与删除接口相同形态;ids 为书籍 ID):
{
"ids": ["123", "456", "789"]
}
ids(必填):要撤销草稿的 Calibre 书籍 ID 列表。
响应:与更新接口类似,data.received 表示处理条数。
提交删除书籍草稿
- 方法/路径:
POST /api/drafts/delete
- Content-Type:
application/json
- 用途: 提交删除书籍的待审核草稿(危险操作,需管理员审核通过后才会真正删除书籍)
删除前二次确认(必须)
在真正调用 POST /api/drafts/delete 之前,必须满足以下条件:
- 已向用户明确重复待删除的 书籍 ID 列表 和 总数量
- 已得到用户对这批 精确 ID 的显式确认
- 如果用户只表达了“删掉这些书”但没有明确确认最终 ID 列表,则先停在预览请求体,不要实际提交
这条规则高于便利性要求。删除草稿一旦审核通过,书籍会被永久删除。
请求体(ids 为书籍 ID):
{
"ids": ["123", "456", "789"]
}
ids(必填):要删除的 Calibre 书籍 ID 列表。
响应:与更新接口类似,data.received 表示处理条数。
重要说明:
- 这是危险操作,提交后会创建"删除书籍"的待审核草稿
- 审核通过后,书籍将从 Calibre 书库中永久删除
- 删除前请确认书籍 ID 正确,误删除可能无法恢复
- 如果需要撤销删除草稿,使用
POST /api/drafts/cancel
与 cancel 的区分:
POST /api/drafts/delete - 提交"删除书籍"的草稿
POST /api/drafts/cancel - 撤销任何类型的待审核草稿(包括删除草稿)
Checklist
调用前:
调用后:
常见错误
| 错误 | 后果 | 正确做法 |
|---|
| 未创建配置文件 | 请求失败,找不到服务地址 | 首次使用前检查并创建 ~/.config/calibre-drafts-api/config.json |
配置的 base_url 包含 /api 后缀 | 路径重复(如 /api/api/drafts) | base_url 应为 http://localhost:3000,不包含 /api |
误以为 /api/drafts/delete 是删除草稿 | 理解错误 | 该接口是提交删除书籍草稿,不是删除草稿记录 |
| 未确认就提交删除书籍草稿 | 可能误删重要书籍 | 删除前仔细确认书籍 ID,删除草稿需管理员审核 |
传 authors: [] | 请求被拒绝 | Authors 不可清空,需要非空数组 |
传 "" 清空字符串字段 | 字段被忽略 | 字符串字段(title、publisher 等)不可清空,只有 tags: [] 可清空 |
| 误用草稿表 ID | 找不到书籍 | id 和 ids 均为 Calibre 书籍 ID,不是草稿记录内部 ID |
| 误用元数据源 ID | 找不到书籍 | 元数据搜索返回的 id(如 douban:123456)不是 Calibre 书籍 ID |
| 忘记 Content-Type | 请求失败 | 必须设置 Content-Type: application/json |
| 重复提交同一书 | 草稿被合并而非新建 | 同一书多次提交会更新现有草稿,这是预期行为 |
传 null 值 | 字段被忽略 | null 等同于不传,表示"不更新该字段" |
| 直接使用搜索结果 | 可能信息不准确 | 元数据搜索返回候选列表,需人工确认后再提交草稿 |
| 未做二次确认就直接提交删除草稿 | 误删风险极高 | 先重复 ID 列表和数量,得到显式确认后再提交 |
与书库只读技能的关系
浏览/搜索书库仍用 calibre-library(只读)。本技能仅描述草稿写入、撤销与删除 HTTP 契约;调用前需确认服务已启动且基址正确。