Releases: AhJxs/so-novel-rs
Releases · AhJxs/so-novel-rs
Release list
v0.3.6
Changelog
[0.3.6] - 2026-07-12
主题:Markdown 导出 + URL 直接下载 + Tasks 删除 toast 反馈(32 commits,
详见 CHANGELOG_ALL.md)。
Added
- Markdown 导出格式:
ExportFormat::Markdown+MdExporter
(YAML front matter + H1 书名 + TOC + 章节锚点);desktop settings、
webFORMAT_OPTIONS、CLI--format markdown、library.md扩展名过滤按钮
全链路打通 - URL 直接下载(SearchPage header「下载链接」按钮):弹 Dialog 自动粘贴
剪贴板 + 「粘贴」兜底按钮;按 URL origin / hash / port 匹配书源,复用
open_range_dialog走选章下载流程 - Tasks 删除 toast 反馈:
DeleteTaskResult枚举(Ok/
StillRunning/Missing),prompt_delete.on_ok按结果推
success / warning toast match_source_by_url测试矩阵:锁定 query / hash / port 三个易踩点的
匹配敏感性,防止后续回归
Changed
- Library 移除
notifywatcher:改用手动「刷新」按钮 + 加载态,避免
watcher 在打包后的 Windows 资源占用 + 资源刷新双触发问题 - ExportFormat 三端对齐:
Markdown在 desktop settings / web
FORMAT_OPTIONS/ CLI--format一致暴露'md'
Fixed
- Dialog-stack pop race:URL 匹配成功后
open_range_dialog通过 flag
延迟到下一帧弹出,避免与正在关闭的 URL Dialog 栈冲突 download_path默认值:fallback'./downloads'改带./前缀,
与显式配置统一路径解析语义- Export 新代码 clippy nits + md i18n key 补全 + 2 个缺失测试(review 反馈)
mod tasks可见性:提升到pub(crate),让DeleteTaskResult跨模块
可见(之前需在 model 内重组才能导出)
v0.3.5
Changelog
[0.3.5] - 2026-07-11
主题:模块重组 + 业务层抽离 + Web 多语言适配(49 commits,详见
CHANGELOG_ALL.md)。
Added
- Web API 多语言:错误响应按 per-request locale 翻译
(Accept-Language → AppConfig.language →enfallback),
全局无 mutation;新增稳定数字错误码表(38 个,1xxx-5xxx),
前端 dispatch 由 substring 匹配改为按codeId数字码 - AppError / DaoError 根类型 + AppResult 别名:业务层错误统一形态;
AppConfig拆 6 个 sub-struct + validate + singleton /api/healthJSON 端点 + Docker Compose 编排- Crawler 性能:章节边下边写(消除批量 syscall)+
tokio::sync::Notify
立即唤醒 drain_loop(TOC / 搜索 / 详情 / 更新检查) - Observability:关键 public fn 加
tracing::instrument+ rust-doc - Pedantic lint 套件(
unwrap_used/expect_used/panic强制 justify)
Changed
- 重大模块重组:
gpui_app→desktop,app→desktop::model,
download_task→core::download_task,util→utils,persistent→db
core/业务层抽离(Phase 3.0–3.9,10 个子阶段):search / sources /
bootstrap / download_task / library / update / async_progress / web helpers /
cli runtime 等与 GUI 解耦,三端共享- 大文件按职责拆分:所有 400+ LOC 的 monolithic 文件拆成 focus 子文件
(crawler / export / parser / web / desktop 等 14 处) - Web SSE 本地化:所有 error / reason 字段从硬编码中文 /
format!("{e:#}")
改为按 locale 翻译的稳定文案;3 个新错误码变体 zh-HK→zh-TW全量重命名:消除 locale tag 漂移- Logger 默认切回 Text(JSON 通过
RUST_LOG_FORMAT=json启用) README.md项目结构精简
Fixed
- Web 错误响应泄漏内部 cause(anyhow / thiserror 完整链曾被拼进 500 body)
- 起点站 cookie 通过
GET /api/settings泄漏(改返脱敏PublicSettings) - SSE 错误事件泄漏内部错误细节(统一走 ErrorCode 翻译)
- 前端把后端 envelope 当 opaque 文本(改为解析
code / codeId / message) - 346 个 build warning + 0 个 clippy warning under
-D warnings
v0.3.4
Changelog
[0.3.4] - 2026-07-04
Added
- CLI
--help多语言:so-novel-rs --help/-h/ 子命令 help
现在按~/.sonovel/config.toml [global].language显示三种语言
(zh-CN / zh-TW → zh-HK / en)。locales/app.yml新增Cli:命名空间
(~25 个 leaf key);src/cli/args.rs新增build_localized_command(lang)
手搓本地化的clap::Command树(因 clap 4 顶层about/long_about/
after_help无 public setter,无法 derive 后 mutate) search --help/sources list --help等必填 positional 子命令的
help 也能正确路由到子命令 help(src/cli/mod.rs::parse_or_help_fallback
剥掉--help后允许 required-arg-missing 走 help 分发)- 顶层
Examples:区按 locale 切语言;zh-TW通过crate::i18n::locale_for
映射到zh-HK查 app.yml(Language::as_str()仍返回zh-TW,仅 i18n
查表层用zh-HK)
Changed
src/main.rs128 行 → 18 行 + 新建src/startup/模块:把 mode
判定 / Windows console attach / tracing init / cfg-gated 分发拆到
startup/{mod,web}.rs;main.rs 只剩 crate attribute + 3 行main()LaunchModeenum 取代原is_web/is_cli两个 boolean 的隐式
precedence;detect(args) -> LaunchMode是唯一的 mode 入口run_web改名startup::web::run;parse_arg_value改为
pub(super)仅 startup 模块内可见(仍只被--host/--port两处调用)attach_parent_consoleWindows Win32 调用原样搬到startup::mod.rs,
cfg gate 同步迁移- "feature not enabled" 的 bail 提示(如
--no-default-features --features gui跑--web)移到对应run函数内部,与 cfg gate 紧贴 init_tracing()仍在dispatch里调用、但仅对非 CLI 模式(CLI 内部
仍按--verbose自决),保持"CLI 默认静默、GUI / Web 始终有日志"原行为
避免tracing_subscriber::init()双 init panic- 三个构建目标全部 clean:
cargo build(默认 features)、
cargo build --no-default-features --features web(Docker 路径)、
cargo build --no-default-features --features gui - 全部 370 个 lib 测试仍 pass,无新增 / 删除
Fixed
- CLI
so-novel-rs --help在config.toml language = "en"/"zh-TW"
时仍输出简体中文(之前 help 文案硬编码中文,与 UI 语言不一致) - release 打包的
so-novel-rs.exe双击启动 GUI 时会额外弹出一个黑色
控制台窗口(与 gpui 主窗口一起出现)。根因:src/startup/mod.rs::dispatch
对LaunchMode::Gui调用了attach_parent_console(),Explorer 双击
场景下AttachConsole(ATTACH_PARENT_PROCESS)失败 →AllocConsole()
fallback 在运行时分配新 console。修复:Gui arm 仅init_tracing(),
不调 attach_console(windows_subsystem = "windows"已在 PE 层保证
进程启动时无 console;Web arm 行为不变,仍 attach 以保证 Explorer 双击
启动 Web 时日志可读) - release 打包的
so-novel-rs.exe跑--help/-V/ 任意 CLI 子命令
时完全没有 stdout 输出。根因:同上 release build 是 GUI subsystem,
Windows 默认把 stdio 关到 NUL(即使从 cmd 跑也无效),CLI arm 原本不调
attach_parent_console→ 写入直接被丢掉。修复:CLI arm 在cli::run()
之前先调attach_parent_console()(cmd / bash 有父控制台时直通父
终端;Explorer 双击无父控制台时AllocConsole()让用户看到帮助进
console 窗口;行为与 Web arm 对齐)
v0.3.3
Changelog
[0.3.3] - 2026-06-25
Added
- CLI 模式正式可用:
so-novel-rs search/download/sources三个子命令
共享 GUI 的 parser / crawler / export。-v, --verbose打开 tracing,
-q, --quiet抑制逐章 / 失败源 dump,脚本管道友好 sources list / enable <ID> / disable <ID>子命令;写回
~/.sonovel/sources_config.json,跟 GUI / Web 共享同一文件download --from <N> / --to <N>章节范围下载(1-based,闭区间;
to越界静默截断)- TTY 原地进度行(搜索 / 下载统一走
crate::util::tty::print_in_place_line) - Ctrl-C 接到
CancelToken,crawler 走Cancelled事件干净退出(不再硬杀进程) - 搜索走
search_streaming + tokio::spawn流式进度(参考
[[streaming-search-lesson]]memory)
Changed
src/cli.rs549 行 →src/cli/7 文件模块拆分(参照
src/config/的子模块拆分模式):args/mod/search/
download/sources/util/tests--help/--version全量中文化(disable_help_flag+
SetTrue手动分发,避开 clap 默认英文 help 文本;详见src/cli/args.rs
注释)- 抽出
crate::util::tty::print_in_place_line(TTY 进度行 helper,
从src/cli/helpers.rs提到src/util/tty.rs,与formatting::truncate
等通用工具并列) src/cli/helpers.rs改名src/cli/util.rs(util名跟src/util/
顶级工具目录呼应,区分"CLI 内部粘合层" vs "cross-cutting 工具")- TTY 原地进度行退出时补
\n,Windows 控制台 prompt 不再卡住要按 Enter
(见src/cli/search.rs:154-160的 Windows console 坑说明) - 搜索失败源 dump:≤3 条全打、>3 条压成
top 3 + N more;--quiet完全跳过 - Web 模式默认 host 改回
127.0.0.1(loopback only)以匹配
so-novel-rs --web默认行为
Fixed
fix(search): clear search state when rule set changeschore(rules): update 梦书中文 domain tomcxs.lafeat(sources): make URL column a clickable Link- Windows console prompt 在 in-place 进度模式退出后不再卡住(详见上方"Changed")
fix(cli/download): 未传--source时按 URL 自动匹配书源(origin 比较),
而非硬取第一个源;匹配不到再回退到首源fix(cli/search):--json模式不再在 stderr 打印搜索进度条,
保持 stdout 仅含 JSONfix(main):attach_parent_console失败时回退AllocConsole
自行分配控制台,从 Explorer 启动 CLI/Web 模式不再无控制台可用fix(Dockerfile): 运行阶段补装 GPUI 运行时共享库(libxcb.so.1等),
修复error while loading shared libraries启动失败
Documentation
- 新增
docs/CLI.md:CLI 完整用法(子命令参数、进度行为、
JSON 输出、范围校验、常见工作流、注意事项、故障排查) - 新增
docs/WEB.md:Web 模式部署、API 端点、Docker
多架构镜像、反向代理(SSEproxy_buffering off等坑)、打包脚本 - 新增
docs/BOOK_SOURCES.md:6 套书源说明 +
Cloudflare 绕过(CloudflareBypassForScraping容器)+ 排查指引 - 新增
docs/CHANGELOG.md+docs/CHANGELOG_ALL.md
两份变更日志;release workflow 用body_path: docs/CHANGELOG.md自动上传
到 GitHub Release - 新增
Dockerfile(多阶段 + tini init + 非 root
用户uid 1000+ data dir/home/so-novel/.sonovel)+.dockerignore - 新增
.github/workflows/docker-release.yml
(BuildKit 多架构镜像推ghcr.io/ahjxs/so-novel-rs:<tag>+:latest)
v0.3.2
[0.3.2] - 2026-06-24
Added
- 5 条 post-Phase-4 修复(搜索状态清理、书源域更新、URL 链接点击等)
AppModel加ListCache防搜索重复结果
Changed
src/config/loader.rs917 行 → 5 个子模块(defaults/paths/
toml_io/types/tests)- tracing 初始化延迟到
--verbose触发,默认零输出 - Web 模式默认 host 改回
127.0.0.1(loopback only)
Fixed
fix(search): clear search state when rule set changeschore(rules): update 梦书中文 domain tomcxs.la