Skip to content

分享最近的改动和bug #285

@yu45020

Description

@yu45020

我按照个人喜好来做了一点点修改 (版本1.6.10)

一边用一边修bug,代码在这,暂时能用,没发现问题🤣。

Bug修复

启动时设置写入竞争/损坏

  • 问题: 多次调用 save-setting 可能会损坏 setting.json(如启动时或切换语言时)。
  • 修复: 合并写入 (Coalesce writes);最后一次写入优先,但会保留缺失的设置。先写入 setting.json.tmp,然后重命名。
  • 复现: 在设置页面,Trim Title RegExp 总是为空,因为并发保存。
  • 补丁: code

7z的UTF-8编码与特殊文件名

  • 问题: 非ASCII名称和以 - 开头的文件名在导致7z解压失败。
  • 修复: 给7z参数添加 -sccUTF-8--;输出解码为UTF-8。
  • 复现: 用日文子文件夹和名为 -abc.jpg 的文件压缩文件夹。调用7z时失败。
  • 补丁: code

扫描时重复文件处理

  • 问题: 扫描(Scan)与强制重建(Forced Rebuild)时重复文件处理不一致。
  • 修复: 发现重复时,使用数据库中的文件路径验证其存在性。如果不存在,则视为已迁移;否则作为新文件添加。
  • 复现: 将文件复制到两个文件夹;扫描和强制重建结果不同。
  • 补丁: code

其他小修复

  • resultLists 可能为undefined code
  • callback 可能为undefined code
  • collectionList 可能不是数组 code1, code2

其他

  • getBookInfoFromHentag 中,使用 category: categoryOption.value[data.category-1](索引从0开始)。code .

改进

并行扫描/重建/补丁,限速与中止

  • 内容: 对读取压缩包和写入封面缩略图进行并发控制;批量数据库提交;可中止任务。

  • 设计:

    • 文件分批处理;每批内:
      • 启动多个 7z (-mmt=1) 进程将文件加载到内存。
      • 用单独队列写入封面到磁盘。
      • 每批结束时提交数据库。
    • 中止控制器可取消正在进行的任务。
    • 设置页面新UI:并发读取(解压文件)和写入(封面缩略图)。默认值保守(读=4或最大CPU,写=2或最大CPU)。
    • 扫描时检查书籍是否存在;若缺失则分配“缺失”类别。
  • 结果:

    • 强制重建含360文件(43.3GB)的库。App/dbs/cover文件夹在SSD;库文件夹在7200rpm CMR HDD。

      时间(s)
      4 2 21.77
      4 4 19.36
      6 4 14.13
      8 2 15.90
      8 4 11.36
      8 8 11.28
      16 4 11.10
      16 16 11.84
    • 更高的扫描/读取值未必提升性能,因封面写入和数据库提交成为瓶颈。

    • 在HDD上扫描28,521文件(2.68TB):8读/4写≈2816s,4读/2写≈2732s。

  • 注意: 某些杀毒软件会在进程退出后并行重新扫描所有被操作的文件,导致磁盘持续高负载。如Norton用 aswidsagent.exe 扫描所有被7z操作的文件,且无法关闭。长时间运行时建议将大型库文件夹加入白名单。

  • 补丁:

启动加速(SQL)

  • 内容:loadBookListFromDatabase 中用SQL查询替换JS循环。
  • 结果: 28,521文件:启动时间从3.61s降至0.39s。
  • 补丁: code

分片封面文件夹

  • 内容: 用封面哈希前两位十六进制分256子文件夹;文件名为 sha256(imageBuffer).webp
  • 原因: 单一大目录导致枚举和清理变慢。
  • 方法:
    • 新路径:cover/<hh><hash>.webp<hh>为哈希前两位。
    • 数据库存储封面哈希,迁移简单。
  • 补丁 code

更快的库树

  • 内容: 用二分查找构建文件夹树。
  • 方法:
    • 路径排序和索引。
    • 计算并缓存上下界索引。
    • 用二分查找列出指定文件夹下所有书籍。
  • 结果: 点击文件夹显示所有书籍时,数据库有28K行时新方法比旧方法快约2秒。
  • 补丁: FolderTree.vue

新分类搜索模式

  • 内容:cat:category$ 在搜索对话框筛选分类。
  • 原因: 现有设计用 category$,会包含标题匹配分类名的书籍。
  • 补丁: code

新UI功能

标签更新内置浏览器

Image

设置:移除缺失记录

  • 内容: 按钮移除数据库缺失记录和未引用封面文件。
  • 原因: 现有设计每次扫描库时移除缺失记录,库文件夹配置错误时易误删。
  • 设计:
    • 按钮在设置→高级。
    • 点击后验证数据库所有书籍是否存在,标记缺失项,并缓存所有未被引用的封面缩略图。
    • 弹窗显示缺失书籍数、未引用封面数、数据库真空选项和确认按钮。
  • 补丁
Image

设置:库文件夹管理

  • 内容: 设置页可添加/移除库文件夹。
  • 原因: 现有设计只允许单一库根,新设计便于管理多个库文件夹。
  • 设计:
    • 设置页General标签显示库文件夹,带管理按钮。
    • 管理库标签页可添加/移除文件夹。
    • setting.json 新增 'libraries': [path string]
    • 更新 scanLibraryFilesWithExclude 支持多库文件夹。
  • 补丁:
Image

侧边栏:文件夹树/作者/社团/Parody标签

  • 内容: 文件夹树支持多库文件夹;新标签页快速访问作者、社团、恶搞。
  • 原因:
    • 旧文件夹树只允许一个库文件夹,管理多库不便。
    • 主窗口有标签/作者快捷方式,但不支持全库。
  • 设计:
    • 文件夹树:
      • 顶部“All”节点显示所有书籍。
      • 展开/收起所有节点按钮。
      • 仅有一个子文件夹且无文件时收起顶层节点。
    • 作者/社团/Parody标签页:
      • 点击标签显示所有作者/社团/恶搞。
      • 点击项在主窗口显示书籍。
      • 按En/Jp/Zh/数量排序。
      • 按En/Jp/Zh搜索。
  • 补丁: FolderTree.vue
Image

移动文件:移动文件对话框

  • 内容: 新对话框选择文件移动目标文件夹。
  • 原因: 子文件夹多时难以选择目标。
  • 设计:
    • 用系统文件管理器(ipcMain.handle('select-folder'))选文件夹。
    • 文件可移动到任意文件夹,不限于库文件夹。
  • 补丁:

UI微调

  • 缺失文件分配“缺失”状态 code
  • E-Hentai风格分类标签,保留 tag-failednon-tag code
  • “缺失”分类用于缺失文件。每次扫描都验证文件存在。code
  • No Tag Only 过滤器
  • 书籍详情(编辑标签)列出默认标签 code
  • 鼠标前进/后退导航 code
    • home UI:
      • a. 后退按钮:
        • 当前页为首页时重置(同原行为)
        • 否则返回上一页
      • b. 前进按钮:如有下一页则前进
    • bookdetail UI:
      • a. 后退按钮:关闭书籍详情UI
      • b. 前进按钮:如有则查看下一个书籍详情
  • Electron ≥ 30后设置页UI对齐
  • 默认隐藏评论

环境

  • Windows 11
  • 应用版本:1.6.10
  • 上游版本:23dc690c(2025年8月8日)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions