Skip to content
dsh.fish
Bundle

dsh-novel-launcher

在 DSH 界面右下角放一个悬浮球:点开本地书单,选一本用你自己的阅读器打开,窗口自动归位到习惯的位置。支持中文/拼音/首字母搜索。

Source
unsiscon
License
MIT
Updated
Updated yesterday

Readme

# dsh-novel-launcher 📖

**在 DeepSeek Harness 的界面里放一个悬浮球:点开本地书单,选一本用你自己的阅读器打开,窗口自动落在你习惯的位置。**

写代码的间隙看两眼小说,不用切窗口。

---

## 界面预览

点右下角的 📖 悬浮球,展开本地书单 —— 顶部「继续读」直接续上,中间三路搜索,底部一键记住窗口位置:

<img src="screenshots/2-book-list.png" width="380" alt="书单面板:继续读、拼音搜索、书库列表、记住位置 / 设置按钮">

悬浮球常驻在界面右下角,不占布局、不影响写代码:

<img src="screenshots/1-floating-ball.png" width="760" alt="悬浮球常驻在 DSH 界面右下角">

---

## 它做什么

- 🟢 **右下角悬浮球** —— 不占布局,点开点收
- 📚 **本地书单** —— 扫描你的书库文件夹,只列出真正的电子书
- 🔍 **三路搜索** —— 中文(`魔界`)、全拼(`mojie`)、首字母(`mjd`)都能搜到《魔界的女婿》
- ⏯ **继续读** —— 顶部永远显示上次读到哪本、第几章
- 🪟 **窗口归位** —— 打开后自动把阅读器窗口搬到预设位置,顺手收掉上一个旧窗口
- 🎨 **跟随主题** —— 用 DSH 的设计变量,明暗自动适配
- 🌗 **点外部关闭 / Esc / 选书即收起 / 关闭自动清空搜索**

## 它不做什么

- 不抓网络小说、不带阅读器。书是你自己的,阅读器也是你自己的。
- 不上传任何东西,纯本地。

---

## 安装

```bash
dsh plugin --profile web add github:<you>/dsh-novel-launcher
```

装好后重启一次 `dsh web`,刷新浏览器,右下角出现 📖 即可。

> 开发版:把本目录放进 `~/.dsh/profiles/web/node_modules/dsh-novel-launcher/`,
> 再把 `dsh-novel-launcher` 加进 `~/.dsh/profiles/web/package.json` 的
> `dsh.profile.bundles` 列表,重启即可(无需构建 —— 本插件纯 JS)。

## 首次使用

点悬浮球 → 自动进入设置页 → **选一个放书的文件夹** → 保存。完事。

## 设置项

| 设置 | 说明 |
|---|---|
| 书库目录 | 你的电子书放在哪 |
| 阅读器进程名 | 窗口归位用(macOS)。例如 `OmniReader` |
| 阅读器 Bundle ID | 优先用它来打开书,例如 `com.shrek.masterreader` |
| 阅读器 .app 路径 | 可选,填了最优先 |
| 认这些格式 | 默认 `epub, txt, mobi, azw3, pdf, fb2, chm, djvu, rtf, md, html` |
| 窗口归位 | 开书后搬窗口 + 收旧窗(仅 macOS) |
| 拼音搜索 | 用 macOS 系统自带的中文转拼音(仅 macOS) |
| 显示「继续读」 | 自动探测阅读器的本地数据库 |

## 窗口归位(macOS)是怎么工作的

macOS 不允许随便操纵别的程序的窗口,必须拿到「辅助功能」授权。为了拿到一个**稳定可授权的身份**,插件会:

1. 首次启用时用 `osacompile` 把 `assets/window-helper.applescript` 编译成
   `~/Applications/小说窗口助手.app`
2. 你在 **系统设置 → 隐私与安全性 → 辅助功能** 里把它加进去(**只需一次**)
3. 之后每次开书,插件通过 `/tmp` 下的一个小命令文件告诉它做什么模式

这样做而不是直接跑 `osascript`,是因为后者的授权身份挂在 Node 上 ——
**Node 一升级路径就变,授权会静默失效**。用一个独立小程序就没这个问题。

助手只做两件事:记住当前窗口位置 / 把窗口搬回那个位置(并关掉停在那个位置上的旧窗口)。
它**永远不会关掉最前面那个窗口** —— 那是你刚打开的新书。

> 不想授权也完全没问题:关掉「窗口归位」,其他功能照常。

## 跨平台

| 功能 | macOS | Windows / Linux |
|---|---|---|
| 悬浮球 / 书单 / 搜索 / 打开书 | ✅ | ✅(交给系统默认程序) |
| 窗口归位 · 收旧窗 | ✅ | ❌ 自动隐藏该选项 |
| 拼音搜索 | ✅ | ❌ 自动关闭 |

## 数据与隐私

- 配置:`$DSH_HOME/novel-launcher/config.json`
- 窗口位置:`~/Library/Application Support/DSHNovelLauncher/frame.txt`
- 命令文件:`/tmp/dsh-novel-window-cmd.txt`(每次开书覆盖一次)
- 全部只在本机,不联网、不上传。

## 架构

- **Host 半体**(`lib/index.js`):普通 Cordis 插件。扫目录、算拼音(走 `osascript` 调
  macOS 的 `NSString` 转写)、探测阅读器数据库、拉起窗口助手,并注册
  `/novel-launcher/*` 这组同源 JSON 接口。
- **浏览器半体**(`lib/client.js`):`window.__ModuleLoader__.load` 的纯 JS bundle,
  注册进 `shell.overlay` 槽位。
- 两者只用 HTTP 通信,不依赖任何私有 RPC。

## License

MIT

Install

dsh plugin --profile web add github:unsiscon/dsh-novel-launcher#fbabe18b53c86568969b4e79c6bf7125f4aa685b

Profile: web

Source