当前位置: 首页 > news >正文

NAS玩家必备:用Node.js脚本批量整理Calibre-Web图书信息(附完整代码)

NAS玩家必备:用Node.js脚本批量整理Calibre-Web图书信息(附完整代码)

作为一名NAS深度用户,你是否也遇到过这样的困扰——辛辛苦苦收集的电子书资源导入Calibre-Web后,作者信息混乱、分类标签缺失,手动整理几百本书籍简直是一场噩梦?今天我们就来解决这个痛点,通过Node.js脚本实现图书信息的批量自动化处理。

1. 环境准备与基础配置

在开始编写脚本前,我们需要确保运行环境配置正确。以下是基础环境检查清单:

  • Node.js环境:建议安装LTS版本(如v18.x)
  • 依赖库安装:运行npm install axios cheerio fs安装必要模块
  • Calibre-Web访问权限:确保拥有管理员或编辑权限

提示:建议在Docker容器中运行Node.js脚本,避免污染NAS主机环境

配置完成后,我们可以通过以下命令验证环境:

node -v npm list axios cheerio fs

2. 获取Calibre-Web API接口信息

Calibre-Web虽然没有官方API文档,但我们可以通过浏览器开发者工具捕获请求。具体操作流程如下:

  1. 使用Chrome打开Calibre-Web界面
  2. 按F12打开开发者工具
  3. 进入"Network"选项卡,勾选"Preserve log"
  4. 手动编辑一本书籍信息,观察产生的网络请求

关键需要捕获的请求信息包括:

参数类型说明示例值
Headers认证和CSRF令牌x-csrftoken,Cookie
Payload请求体结构{pk: 123, name: "title", value: "新书名"}
URLAPI端点地址/ajax/editbooks/title

获取到这些信息后,我们可以构建如下的配置模板:

const config = { baseUrl: 'http://your-nas-ip:8083', headers: { 'x-csrftoken': 'your_csrf_token', 'Cookie': 'your_session_cookie', 'Content-Type': 'application/x-www-form-urlencoded' }, bookEditEndpoint: '/ajax/editbooks/title' }

3. 批量获取图书ID列表

要实现批量操作,首先需要获取目标图书的ID列表。这里提供两种高效获取方式:

方法一:通过列表页API获取

const getBookIds = async () => { const listUrl = `${config.baseUrl}/ajax/search/do?search=` const response = await axios.get(listUrl, {headers: config.headers}) return response.data.data.map(book => book.id) }

方法二:从导出文件中提取

  1. 先在Calibre-Web中导出图书列表为CSV
  2. 使用以下代码解析:
const fs = require('fs') const parse = require('csv-parse').parse const getIdsFromCsv = (filePath) => { const data = fs.readFileSync(filePath) return new Promise((resolve, reject) => { parse(data, {columns: true}, (err, records) => { if(err) reject(err) resolve(records.map(r => r.id)) }) }) }

4. 核心脚本编写与功能实现

现在我们可以编写完整的批量处理脚本了。以下是一个支持多种修改类型的增强版脚本:

const axios = require('axios') const fs = require('fs').promises class CalibreWebBatchEditor { constructor(config) { this.config = config this.rateLimit = 500 // 请求间隔毫秒 } async editBooks(ids, field, value) { for(const id of ids) { try { const payload = new URLSearchParams() payload.append('pk', id) payload.append('name', field) payload.append('value', value) await axios.post( `${this.config.baseUrl}${this.config.bookEditEndpoint}`, payload, {headers: this.config.headers} ) console.log(`成功更新图书ID ${id} 的 ${field}`) await new Promise(r => setTimeout(r, this.rateLimit)) } catch (error) { console.error(`处理ID ${id} 时出错:`, error.message) } } } } // 使用示例 (async () => { const editor = new CalibreWebBatchEditor(config) const ids = await getBookIds() await editor.editBooks(ids, 'authors', '统一作者名') })()

这个脚本类支持以下扩展功能:

  • 速率限制:避免请求过载服务器
  • 错误处理:单条失败不影响整体流程
  • 多种字段修改:支持title/authors/tags等任意字段

5. 高级功能扩展

对于更复杂的需求,我们可以进一步扩展脚本功能:

批量添加分类标签

async function addTags(ids, tags) { const currentTags = await getCurrentTags() // 需要实现获取现有标签 const newTags = [...currentTags, ...tags] await editor.editBooks(ids, 'tags', newTags.join(',')) }

基于规则的自动化处理

const rules = [ { condition: book => book.title.includes('扫描版'), actions: [ {field: 'tags', value: '扫描文档'}, {field: 'comments', value: '自动标记为扫描版'} ] } ] async function applyRules(books) { for(const book of books) { for(const rule of rules) { if(rule.condition(book)) { for(const action of rule.actions) { await editor.editBook(book.id, action.field, action.value) } } } } }

6. 实战技巧与避坑指南

在实际使用过程中,我总结了几个关键注意事项:

  1. 会话时效性:Calibre-Web的会话通常1-2小时失效,建议:

    • 实现自动重新登录功能
    • 或在脚本开始时检查会话有效性
  2. CSRF令牌更新:每次页面刷新后需要重新获取CSRF令牌

  3. 批量操作建议

    • 每次处理不超过100本书
    • 重要操作前先备份数据库
    • 可以先在少量图书上测试
  4. 性能优化

    • 使用Promise.all实现有限并发
    • 添加进度显示功能
// 带进度显示的示例 const withProgress = (items, processFn) => { let completed = 0 const total = items.length return Promise.all(items.map(async item => { await processFn(item) completed++ console.log(`进度: ${completed}/${total} (${Math.round(completed/total*100)}%)`) })) }

7. 完整脚本整合与部署

将上述功能整合后的完整脚本结构如下:

/calibre-batch-editor ├── config.js # 配置文件 ├── editor.js # 核心编辑类 ├── rules.js # 自动处理规则 ├── utils.js # 工具函数 └── main.js # 主入口文件

部署时可以考虑:

  • 使用PM2守护进程
  • 设置定时任务自动运行
  • 配合Web界面实现可视化操作

以下是一个简单的Docker运行示例:

FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . CMD ["node", "main.js"]

在实际项目中,我发现最实用的功能其实是批量标准化作者名称和添加系列信息。通过正则表达式和字符串处理,可以自动从书名中提取系列信息,大幅提升整理效率。比如将"[某某系列03]书名"自动拆分为系列和纯书名。

http://www.jsqmd.com/news/529252/

相关文章:

  • 文献阅读:FActBench: A Benchmark for Fine-grained Automatic Evaluation of LLM-Generated Text
  • IEEE TGRS | 中国矿业大学提出 O² 系列:首个面向遥感的实时旋转目标检测 Transformer
  • 深入解析C#中的MethodImpl同步特性:实例与静态方法的线程安全实践
  • 十大头部个人养老年金产品综合评测榜单 2026年个人养老年金选购指南 - 科讯播报
  • Elasticsearch 入门全景:核心概念与典型应用场景速览
  • RTL8812AU开源驱动全功能配置指南:从基础安装到高级渗透测试应用
  • APatch故障诊疗指南:从入门到精通的10个实战方案
  • 终极指南:BthPS3驱动让PS3手柄在Windows上完美蓝牙连接
  • 23种路径规划算法解决机器人导航核心难题
  • 3个被误解的暗黑2增强插件:重新认识PlugY的真正实力
  • 手性介质模拟:在COMSOL里玩转“扭曲“的电磁场
  • 2023年全国30米土地利用数据实战:从下载到ArcGIS可视化全流程指南
  • 盘点超景深工业显微镜十大品牌,购买要点全详解
  • Nociceptin (Orphanin FQ);FGGFTGARKSARKLANQ
  • 丹青识画与YOLOv8协同实战:画作中特定元素的检测与定位
  • AlienFX-Tools:硬件控制的开源革新方案
  • 4步实现Axure本地化:提升原型设计效率的界面汉化指南
  • Inpaint-web:浏览器里的AI图像修复魔法,告别专业软件依赖
  • 深度解析SDXL VAE FP16精度修复:如何实现AI图像生成的显存革命
  • 龙虾Claw实战扫描件证件信息智能提取与自动归档管理场景应用
  • 构建企业级网络准入控制体系:PacketFence解决方案深度解析
  • 如何通过3步注册解锁Jasmine全部潜力?
  • 如何通过开源IT资产管理平台实现企业基础设施的智能化管控
  • OmenSuperHub:惠普游戏本的开源硬件控制解决方案
  • 5个高效工具助你构建企业级Tesseract.js OCR应用
  • 如何突破Java串口通信的跨平台瓶颈?jSerialComm全方位技术解析
  • GHelper:华硕笔记本用户的轻量级控制神器
  • 【困惑度 计算和可视化】
  • Tao-8k模型在不同硬件平台的部署对比:从GPU到边缘设备
  • 3大突破:res-downloader网络资源获取全场景解决方案