Skip to content

Commit e46058c

Browse files
committed
update
update
1 parent fb6b88c commit e46058c

24 files changed

Lines changed: 15435 additions & 6586 deletions

.github/workflows/build.yml

Lines changed: 172 additions & 222 deletions
Large diffs are not rendered by default.

BUILD_GITHUB_ACTIONS.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# GitHub Actions PySide6 构建说明
2+
3+
`/.github/workflows/build.yml` 已改为纯 PySide6 Windows x64 构建流程。
4+
5+
## 构建内容
6+
7+
- 根目录:`NFOEditor.exe` 及其 `_internal` 运行库。
8+
- `tools/cg_crop/`:独立图片裁剪工具。
9+
- `tools/cg_rename/`:独立批量改名工具。
10+
- `tools/cg_dedupe/`:独立查重工具。
11+
- `tools/cg_photo_wall/`:独立照片墙工具。
12+
13+
## CI 验证
14+
15+
1. 拒绝安装或打包 PyQt5、PyQt6、PySide2。
16+
2. 编译全部 Python 文件并运行单元测试、pyflakes。
17+
3. 使用 Qt offscreen 平台实际创建并关闭五个顶层窗口。
18+
4. 使用 PyInstaller 6.21.0 构建 Windows x64 onedir 应用。
19+
5. 检查每个应用的 exe、PySide6 内容、`qwindows.dll`、offscreen/minimal 插件及 XML/图标资源。
20+
6. 启动每个冻结后的 exe,确认 6 秒内不会因缺 DLL、Qt 插件或导入异常而退出。
21+
7. 生成 ZIP 和 SHA-256 文件。
22+
8. 普通分支、PR 和手动运行只上传 Actions Artifact;推送 `v*` 标签时发布或更新 GitHub Release。
23+
24+
## 本地复现
25+
26+
```powershell
27+
python -m venv .venv
28+
. .\.venv\Scripts\Activate.ps1
29+
python -m pip install -r requirements-build.txt
30+
python scripts/qt_source_smoke.py
31+
.\scripts\build_windows.ps1
32+
.\scripts\check_windows_artifact.ps1 -Root dist/NFOTools -RunSmokeTests
33+
```
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# 修改摘要
2+
3+
## 性能
4+
- 新增 `NFODiskIndex`,使用 SQLite 保存 NFO 解析结果。
5+
- `LoadFilesThread` 不再每次解析全部 NFO;只解析新增或修改过的文件。
6+
- `LoadFilesThread` 不再在线程中创建 `QTreeWidgetItem`,改为发普通数据到主线程。
7+
- UI 列表改为 `addTopLevelItems()` 批量添加。
8+
9+
## 文件监控
10+
- 移除根目录实时监控触发整库刷新。
11+
- 只监听当前选中的 NFO 和当前文件夹。
12+
- 新增 `.nfo_editor_events.jsonl` 事件队列,用于和外部组件通信。
13+
14+
## 交互
15+
- 清空筛选不再重新加载文件夹。
16+
- 状态栏显示解析数和缓存命中数。
17+
18+
19+
## 组件整合
20+
- 纳入 `cg_crop.py``cg_rename.py``cg_photo_wall.py``cg_dedupe.py`
21+
- 四个组件从 PyQt5 import 改为 PySide6 import。
22+
- `cg_rename.py` 接入 `nfo_editor_events.py`
23+
- 任务开始/结束更新主程序状态栏。
24+
- 修改 NFO 后发送 `nfo_changed`
25+
- 重命名文件夹后发送 `refresh_list`
26+
- PyInstaller spec 已加入组件和图标。
27+
28+
## v2
29+
- 修复从主窗口打开照片墙时重复 `os.walk + parse_nfo` 的性能问题。
30+
- `nfo_editor.show_photo_wall()` 改为先创建空照片墙窗口,再调用 `load_from_editor_cache(self)`
31+
- `cg_photo_wall.py` 新增 `load_from_editor_cache()`,直接复用主窗口 `nfo_files``nfo_cache`
32+
- 修复照片墙筛选只作用于当前渲染窗口的问题。
33+
- 修复照片墙 resize 时滑动窗口索引错位导致图片加载错的问题。
34+
- SQLite 索引清理更保守:已存在但解析失败的文件会保留旧索引,不会被误删。

FIX_REPORT_QT6.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Qt6 重构修复说明
2+
3+
本包是在原 `nfo_editor_qt6.zip` 基础上进行的逻辑修复版。
4+
5+
## 重点修复
6+
7+
- 根目录 NFO 保护:根目录中的 NFO 不再触发整个媒体库目录的移动或删除。
8+
- 安全移动:禁止移动到原位置、自身子目录及覆盖同名目标;跨盘移动失败时优先保留可恢复副本。
9+
- NFO 安全保存:使用同目录临时文件和原子替换,降低写入中断导致文件损坏的风险。
10+
- 元数据保留:编辑演员时保留仍存在演员的 `role``thumb``type` 等子节点;编辑标签不再清空 `genre`
11+
- 选择状态修复:取消切换文件时恢复原选择;筛选、排序、重载后不再持有已销毁的树节点。
12+
- Qt6 统一:`cg_crop.py``cg_dedupe.py` 已由 PyQt5 迁移为 PySide6,入口统一使用 `app.exec()`
13+
- 查重异步化:完整扫描与匹配转入后台线程,避免 GUI 主线程同步等待线程池。
14+
- 查重路径修复:父目录与子目录同时加入时只扫描一次;CD1/CD2 标记可识别父目录,且仅在存在不同碟片编号时排除。
15+
- 部分匹配修复:相似值按连通分量合并,避免 A≈B、B≈C 时漏掉 C。
16+
- 照片墙批次隔离:旧批次回调不会再污染筛选、翻页或重新渲染后的新页面。
17+
- 批量重命名:按最深层目录优先处理;所选根目录可更新 NFO,但不会被重命名。
18+
- 线程退出:关闭主窗口、查重和重命名窗口时,避免直接销毁仍在运行的 QThread。
19+
- 图片保存:poster/thumb 先全部编码成功再提交;失败时恢复原文件,且不再生成 `-poster-poster.jpg`
20+
- 设置对话框:校验或保存失败时不再错误关闭。
21+
22+
## 验证结果
23+
24+
已执行:
25+
26+
```bash
27+
python -m compileall -q .
28+
pyflakes *.py
29+
python -m unittest discover -s tests -v
30+
```
31+
32+
当前共 6 项纯逻辑回归测试通过,覆盖 XML 元数据保留、原子保存、移动冲突保护、嵌套扫描根去重、CD1/CD2 判定和文件选择确定性。
33+
34+
## 验证边界
35+
36+
本次环境未安装 PySide6、PySide6-Fluent-Widgets 和 winshell,因此未进行 Windows 下的完整 GUI 点击与打包运行测试。建议首次运行时先使用一份媒体库副本,重点验证移动、回收站删除、批量重命名及照片墙快速切换。

0 commit comments

Comments
 (0)