【开源自推】一款 在window上可以更舒适地 阅读本地小说和管理本地小说文件 的阅读软件

市面上window端阅读小说的软件

  • 个人阅读体验不是很好(如 目录和正文的拆分和显示,更偏向于实体书而不是 大屏幕的网文小说)
  • 以.txt形式进行小说的本地管理和打开也不是很方便

于是我也根据一些核心需求 另外搓了个本地小说阅读软件:


【亮点】

对比市面上一般的 window 端小说本地阅读软件,本软件除了常见的小说章节解析、目录解析、最近阅读以外,还有以下亮点:

1. 自定义 .nov 文件格式,方便本地小说文件管理和编辑

.nov 是基于 txt 的自定义格式,是一个有显眼专属图标的文本格式,既能像普通文件一样直接双击打开,也能用记事本随手编辑。

:pushpin: 解决了什么痛点?

  • 本地小说以 .txt 存在为主,容易和其他文本文件混在一起,分不清谁是谁
  • 主流 Windows 阅读器需要导入文件才能打开,不符合轻量化使用习惯
  • txt转化为epub虽然能够解决前两个问题,但是由于下载的小说难免存在错别字或排版问题,所以经常需要人工轻量级修订, 而 .epub 格式十分复杂,想要修改起来十分十分麻烦

:sparkles: 本软件的方案:

痛点 解决方案
小说 和其他.txt文件混在一起分不清 :white_check_mark: .nov 使用专属小说图标,一眼认出
打开需要导入,不够轻量 :white_check_mark: 双击 .nov 直接阅读,无需额外导入
.epub 编辑订正困难 :white_check_mark: .nov 本质是纯文本,记事本即可轻松编辑订正

2. 悬浮目录支持多列显示,支持分卷、分页,方便上千章节的小说的跳转

从底部唤出的目录面板,一行显示多个章节,且所在的分卷、分页划分一目了然。

:pushpin: 解决了什么痛点?

  • 网文动不动上千章,但是几乎所有window阅读软件只针对章节较少的实体书进行设计:一行通常只显示一个章节,作为读者目录跳转非常不方便
  • 很多小说明明有分卷,但本地阅读器基本都不显示,难以有一个更明晰的目录视角

:sparkles: 本软件的方案:

痛点 解决方案
一行只显示一个章节,大屏空间浪费 :white_check_mark: 一行显示多个章节,充分利用电脑大屏幕,跳转更方便
缺少分卷/分页划分 :white_check_mark: 支持按分卷信息划分
:white_check_mark: 即使小说没有分卷,也自动按章节数分页

3. 长段落自动拆分,阅读更舒适

对于长段落,会自动拆分成长短不一的分段,从而得到更好的阅读体验。

:pushpin: 解决了什么痛点?

  • 不少网文排版粗糙,五六七八行文字揉成一团,密密麻麻的,阅读不是很舒适
  • 一些偏老派写法的传统实体风格小说,习惯使用长句长段进行描写,阅读比较拗口难懂

:white_check_mark:通过自动拆解长段落,使段落长短错落有致,从而提高读者的阅读浏览体验。


4. 更多细节功能

  • 键盘 左右键 翻章节,上下键 滚动页面,回车键 唤出目录
  • 深度用户:config.py 里可以自定义更多字体、字号、颜色、间距,怎么习惯怎么来

【使用】

  • 打开 .nov 小说:从 Realease里下载 NovReader_Setup.exe 后安装即可
  • .txt 转化为 .nov: 单个文件 直接修改文件格式后缀为 .nov即可
    多个文件 可以下载Realease里面的 TxtToNov.bat批量修改
  • 绑定NovReader为默认的.nov打开程序:部分window版本由于安全原因,安装后不能自动绑定成功, 需要手动打开.nov文件的右键菜单,选择属性,修改打开方式为NovReader即可

开源地址:GitHub - Super-Cookie/NovReader · GitHub
下载地址:在Releases里下载
非商用AGPL-3.0协议,欢迎Star

似乎就是一个文本浏览器,不过最大的雷点就是那个.nov格式…

能满足需求的场景就行了

作为一个本地小说阅读器,肯定是要文本解析为主啊,你还想怎么发挥?
难道有亿万用户的并发场景?
市面上 对小说文本数据的解析,以及软件内各种不同的交互和显示的逻辑都做得不太好,导致我的阅读体验和文件管理体验都不是很好,这才自己动手了

至于.nov我在说明里面有提到
其实它就是个类似.md的文本格式 这里是方便我区分是不是本地小说罢了以及方便编辑
.md你能接受 .nov你为什么就不能接受?

恩恩,有道理

这么小一个软件,还弄个setup?直接一个exe发布不好么。

主要是为了绑定.nov的默认程序为本程序

如果是单独的exe我也编译过,我之前还另外配置了一个bat专门拿来绑定.nov,但是也是一直绑定不了没搞懂哪里有问题

所以不使用独立的exe的原因是:单独的exe即使配合bat也无法绑定.nov的默认程序为本程序, 那至少能够用户选择.nov的打开方式时 能直接找到本程序,所以无奈只能选择exe_setup 安装的方式,这种方式能够使得.nov的打开方式里能够直接选择本程序

看网上说好像是win11的安全性问题升级了?没有签名的不能直接绑定某类型的文件?

没有安装器的话,就不能把 exe 复制到固定的路径并且写注册表啊。普通的绿色软件一般都做不到文件关联。

话说,你这种本地阅读软件,可以试试“云软盘”或者“openlist + rclone”这些挂载盘,就可以几个人一起阅读了。你上传到云软盘的文件,别人也可以直接阅读。

最近云软盘的群里有好多人拿云软盘存 Obsidian 笔记和 epub/pdf 书籍。

绿色软件可以是可以用另外的bat来写绑定方式 但是也只能写入打开方式 不能绑定文件格式
不能一步到位的情况下,用户除了下载绿色exe,还要运行bat后写入打开方式,然后再手动设置默认, 安装配置太繁琐了
如果使用 exe_setup,用户安装后,只需要手动绑定默认即可


而且绿色软件还有一个问题,就是一旦路径被移动,打开方式那里不会被更新,对于一个需要绑定某种文件格式作为打开方式的软件,不是很合适
(即使你手动重新选择,还是原本的路径,只能用bat来覆盖或者第三方软件修改路径和图标,很麻烦太不符合直觉了)


挂载盘 本来就支持 我这个对比市面上的txt小说阅读软件
区别之一就是 可以双击打开本地的文件(如.nov)
而不需要先导入软件后才能查看这么不灵活

其实是可以的,我之前有个工具就是利用cmd脚本来实现修改注册表并且未特定的文件类型(比如我这里的是.dfc)设置默认打开方式的
以下是脚本部分,做个参考吧

@echo off
setlocal

set "SCRIPT_DIR=%~dp0"
set "DROPFLOW_EXE=%SCRIPT_DIR%dropfloww.exe"

if not exist "%DROPFLOW_EXE%" set "DROPFLOW_EXE=%SCRIPT_DIR%dropflow.exe"
if not exist "%DROPFLOW_EXE%" set "DROPFLOW_EXE=%SCRIPT_DIR%..\target\release\dropfloww.exe"
if not exist "%DROPFLOW_EXE%" set "DROPFLOW_EXE=%SCRIPT_DIR%..\target\release\dropflow.exe"

if not exist "%DROPFLOW_EXE%" (
    echo Could not find dropfloww.exe or dropflow.exe.
    echo Put this script next to the executable, or run cargo build --release first.
    echo.
    pause
    exit /b 1
)

echo Registering DropFlow workflow association:
echo   %DROPFLOW_EXE%

set "PREVIOUS_PROGID="
for /f "tokens=1,2,*" %%A in ('reg query "HKCU\Software\Classes\.dfc" /ve 2^>nul') do (
    if /i "%%B"=="REG_SZ" set "PREVIOUS_PROGID=%%C"
)
if not defined PREVIOUS_PROGID (
    for /f "tokens=1,2,*" %%A in ('reg query "HKCR\.dfc" /ve 2^>nul') do (
        if /i "%%B"=="REG_SZ" set "PREVIOUS_PROGID=%%C"
    )
)

set "BACKUP_PROGID="
for /f "tokens=1,2,*" %%A in ('reg query "HKCU\Software\Classes\DropFlow.Workflow\Backup" /v PreviousProgId 2^>nul') do (
    if /i "%%B"=="REG_SZ" set "BACKUP_PROGID=%%C"
)

if not defined BACKUP_PROGID (
    if defined PREVIOUS_PROGID (
        if /i not "%PREVIOUS_PROGID%"=="DropFlow.Workflow" (
            reg add "HKCU\Software\Classes\DropFlow.Workflow\Backup" /v PreviousProgId /d "%PREVIOUS_PROGID%" /f >nul
            echo Saved previous .dfc association: %PREVIOUS_PROGID%
        )
    )
)

reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dfc" /f >nul 2>nul
reg add "HKCU\Software\Classes\.dfc" /ve /d "DropFlow.Workflow" /f >nul
reg add "HKCU\Software\Classes\DropFlow.Workflow" /ve /d "DropFlow Workflow" /f >nul
reg add "HKCU\Software\Classes\DropFlow.Workflow\shell" /ve /d "open" /f >nul
reg add "HKCU\Software\Classes\DropFlow.Workflow\shell\open" /ve /d "Run workflow" /f >nul
reg add "HKCU\Software\Classes\DropFlow.Workflow\shell\open\command" /ve /d "\"%DROPFLOW_EXE%\" \"%%1\" %%*" /f >nul
reg add "HKCU\Software\Classes\DropFlow.Workflow\shell\edit" /ve /d "Edit with Notepad" /f >nul
reg add "HKCU\Software\Classes\DropFlow.Workflow\shell\edit\command" /ve /d "notepad.exe \"%%1\"" /f >nul
reg add "HKCU\Software\Classes\DropFlow.Workflow\shellex\DropHandler" /ve /d "{86C86720-42A0-1069-A2E8-08002B30309D}" /f >nul

call :refresh_associations

echo Done.
echo.
pause
exit /b 0

:refresh_associations
echo Refreshing Explorer file association cache...
powershell -NoProfile -ExecutionPolicy Bypass -Command "Add-Type -Namespace Win32 -Name Shell -MemberDefinition '[DllImport(\"shell32.dll\")] public static extern void SHChangeNotify(int wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);'; [Win32.Shell]::SHChangeNotify(0x08000000, 0, [IntPtr]::Zero, [IntPtr]::Zero)" >nul 2>nul
ie4uinit.exe -show >nul 2>nul
exit /b 0

还有恢复部分

@echo off
setlocal

echo Removing DropFlow workflow association.

set "BACKUP_PROGID="
for /f "tokens=1,2,*" %%A in ('reg query "HKCU\Software\Classes\DropFlow.Workflow\Backup" /v PreviousProgId 2^>nul') do (
    if /i "%%B"=="REG_SZ" set "BACKUP_PROGID=%%C"
)

reg delete "HKCU\Software\Classes\DropFlow.Workflow" /f >nul 2>nul
reg delete "HKCU\Software\Classes\Applications\dropflow.exe" /f >nul 2>nul
reg delete "HKCU\Software\Classes\Applications\dropfloww.exe" /f >nul 2>nul
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dfc" /f >nul 2>nul

if defined BACKUP_PROGID (
    reg add "HKCU\Software\Classes\.dfc" /ve /d "%BACKUP_PROGID%" /f >nul
    echo Restored previous .dfc association: %BACKUP_PROGID%
) else (
    reg add "HKCU\Software\Classes\.dfc" /ve /d "txtfile" /f >nul
    echo Restored .dfc association to txtfile.
)

call :refresh_associations

echo Done.
echo.
pause
exit /b 0

:refresh_associations
echo Refreshing Explorer file association cache...
powershell -NoProfile -ExecutionPolicy Bypass -Command "Add-Type -Namespace Win32 -Name Shell -MemberDefinition '[DllImport(\"shell32.dll\")] public static extern void SHChangeNotify(int wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);'; [Win32.Shell]::SHChangeNotify(0x08000000, 0, [IntPtr]::Zero, [IntPtr]::Zero)" >nul 2>nul
ie4uinit.exe -show >nul 2>nul
exit /b 0

问题是,如果这个绿色软件的 exe 移动了位置怎么样啊?这个绑定就失效了。

如果不想失效就需要禁止移动 exe, 这似乎失去了绿色软件的 portable 特性。

在run一次脚本呗,总不可能每次使用完都要移动一次吧。
不过如果要考虑放在U盘等非固定路径,使用setup也需要再“安装”一次才能重写绑定路径。
而且如果是使用脚本来写入注册表,也更加透明吧,使用者知道脚本干了什么


而且绿色软件的特性也不只是portable,还包括不再其他地方放置数据,写注册表等
不过因为要修改打开方式和绑定文件关联,所以修改注册表也是必要的,不过可以通过脚本移除,也算是广义绿色(单exe,即删即卸)。