dsh-novel-reader 📖
在 DeepSeek Harness Web 界面中摸鱼看小说的插件。
在等待模型运行的间隙,把小说 txt 导入进来,用一个可拖动、可调整大小的悬浮窗
分页阅读——窗口小到不挡聊天界面,还能一键切换成"纯文字透明模式"彻底隐形。
🚀 安装
方式一:从 GitHub 安装(推荐,无需构建授权)
本插件是预构建分发(lib/ 构建产物已随仓库发布,无需 prepare 脚本,
也不会触发 pnpm 的构建授权提示):
dsh plugin --profile web add github:1024483906-pixel/dsh-novel-reader
参考官方文档 打包与安装插件:
分发预构建产物(而非源码 + prepare 脚本)时,用户不需要做任何构建授权。
方式二:本地路径安装(开发用)
cd D:\dsh插件
node D:\dsh\node_modules\@deepseek-ai\dsh\lib\bin.js plugin --profile web add link:./dsh-novel-reader
以上任意方式安装后,重启 DSH(如 D:\dsh\restart-dsh.ps1),刷新
http://127.0.0.1:3080,右下角出现 📖 悬浮球即安装成功。
也可以把 dsh-novel-reader/ 目录复制到任意位置,再用 link:<绝对路径> 安装。
✨ 功能特性
📚 小说管理
- txt 导入:点击悬浮窗标题栏 → 书架 →
导入新书,用浏览器文件选择器选择本地
.txt 小说(UTF-8),自动上传并加入书架。
- 书架切换:导入多本后,点标题栏
书 打开书架,当前书 📖 高亮,点击即可切换。
- 独立进度:每本书的阅读进度、字号、窗口位置/大小、透明模式状态各自独立保存,
切换书目互不干扰,重启 DSH 后自动恢复。
📖 阅读体验
- 字幕条式阅读:窗口默认为约两行高的迷你字幕条,放在角落不挡视线;拖动四边/
右下角拖柄可任意放大,变成舒适的多行阅读窗。
- 多方式翻页:
- 鼠标滚轮滑动逐行翻页
- 方向键
↑/↓ 逐行、←/→ 整页
- 底栏
上一页 / 下一页 按钮
- 页码显示:底栏显示
第 X / Y 页(按当前窗口大小计算的"一屏一页"),读到
末尾显示"已到末尾"。
- 字号调节:
A− / A+ 按钮,或 Ctrl + = / Ctrl + - 快捷键,范围 12–32px。
🧭 章节与搜索
- 章节导航:点标题栏
章 打开章节列表,自动识别常见的章节标题格式:
第X章 / 第X节 / 第X回 / 第X卷 / 第X部 / 第X集 / 第X篇 / Chapter N,
当前章节高亮,点击一键跳转。
- 全文搜索:
Ctrl+F 或点标题栏 搜 打开搜索条,输入关键词回车搜索
(大小写不敏感,最多 200 条结果,带上下文片段),↑上 / ↓下 在结果间循环跳转。
🎨 透明模式
点标题栏 透 开启:窗口背景、边框、标题栏、底栏全部消失,只剩下文字悬浮在
界面上,彻底不挡内容。该模式下:
- 拖动文字即可移动位置
- 双击文字或按
Esc 退出透明模式
- 支持滚轮/方向键继续翻页阅读
- 透明模式下显示的行数(窗口高度一致的前提下)与普通模式相同,切换不跳动
🖱️ 窗口控制
- 标题栏拖动移动位置;窗口四边(上/下/左/右)+ 右下角拖柄均可拖动调整大小
(最小 140×90,约一行高)
- 窗口默认出现在页面右下角,打开后自动收进视口边缘
- 拖动窗口/悬浮球不会打断阅读进度(拖动结束后不会误触发翻页或重置)
📸 截图预览
悬浮球与书架
字幕条阅读与章节搜索
透明模式
📖 快速上手
- 点击右下角 📖 悬浮球 → 阅读器展开
- 标题栏点
书 → 导入新书 → 选择一本 .txt 小说
- 滚轮滚动开始阅读;
章 跳章节;Ctrl+F 搜内容;透 进入透明模式
- 看完合上——进度自动保存,下次打开接着读
⌨️ 快捷键一览
| 按键 | 功能 |
|---|
↑ / ↓ | 上一行 / 下一行 |
← / → | 上一页 / 下一页 |
Ctrl+F | 打开搜索 |
Ctrl+= / Ctrl+- | 增大 / 减小字号 |
Esc | 关闭搜索/章节/书架;退出透明模式 |
💾 数据存储
书籍与进度存储在 $DSH_HOME/novel-reader/($DSH_HOME 通常是
D:\dsh\.dsh,以环境变量为准):
novel-reader/
├── books/<id>.txt # 导入的小说原文(UTF-8)
├── books/<id>.chapters.json # 章节索引(自动解析,可重建)
├── books.json # 书架元数据
└── progress.json # 每本书的进度/窗口偏好
数据只保存在本地,不会上传任何书籍内容。
🗑️ 卸载
node D:\dsh\node_modules\@deepseek-ai\dsh\lib\bin.js plugin --profile web remove dsh-novel-reader
重启后生效;$DSH_HOME/novel-reader/ 下的书籍数据会保留(如需删除请手动清理)。
🧱 项目结构
dsh-novel-reader/
├── package.json # 插件清单(dsh.bundle / dsh.client 声明)
├── cordis.patch.yml # 插件注册行
├── lib/
│ ├── index.js # 主机半体:HTTP 路由 + 数据持久化(Node)
│ ├── client.js # 浏览器半体:悬浮窗 UI(手写 bundle,零构建依赖)
│ ├── store.js # 纯函数数据层:章节解析 / 全文搜索 / 原子写入
│ └── *.test.js # node:test 单元测试
└── README.md
- 主机半体:Cordis 插件,注册
/novel/books /novel/upload /novel/content
/novel/chapters /novel/search /novel/progress 六个路由,文本与状态
原子写入磁盘。
- 浏览器半体:注册进 DSH 的
shell.overlay 槽位,纯 React.createElement
手写,不依赖构建工具链,跟随 DSH 客户端模块系统加载。
- 测试:
cd dsh-novel-reader && node --test lib/(14 个用例:章节解析、
全文搜索、存储读写、路径穿越防护等)。
📄 License
MIT