Skip to content

feat(directories): 支持只扫描选中的子文件夹 / scan only selected subdirectories - #429

Open
WDonny wants to merge 4 commits into
Solr159:mainfrom
WDonny:feat/directory-scan-scope
Open

WDonny wants to merge 4 commits into
Solr159:mainfrom
WDonny:feat/directory-scan-scope

Conversation

@WDonny

@WDonny WDonny commented Oct 31, 2026

Copy link
Copy Markdown

背景

目前添加目录后会递归扫描目录下的所有子文件夹,无法只挑其中几个。例如一个媒体库目录里既有想收录的番号文件夹,也有临时目录、其它类型的片子,只能整库扫描后再逐个排除。

这个 PR 增加"选择目录时可以只扫描其中部分子文件夹"的能力。使用AI辅助生成,如果大佬不认可的话可以跟我说,我这边直接关闭。

改动

交互

  • 目录选择弹窗(DirectoryPickerModal)新增 selectSubdirectories 模式:每个子文件夹左侧有勾选框,可以边浏览边勾选,底部实时显示"只扫描:A / B",按钮显示已选数量。
  • 新增批量操作:全选、反选、清空三个按钮(列表上方),以及列表头的"全部子文件夹"复选框,作用于当前显示的子文件夹层级,不影响其他目录层级的选择。
  • 不勾选任何子文件夹 = 扫描整个目录(与现有行为完全一致,默认不变)。
  • 添加目录、编辑目录两处都生效;目录列表行会显示"扫描 N 个子文件夹"的标签。
  • 下载目录选择器(DownloaderSettingsView)没有开启该模式,行为不受影响。

后端

  • 新增 directory.scan_scope 列(迁移 202611010001_add_directory_scan_scope.go),存 {"include":["A","B"]},默认 {} 表示全部扫描,老数据无感升级。
  • models.DirectoryScanScope:JSON 列,Includes() 负责归一化。
  • db.normalizeDirectoryScanScope:校验每个选项必须是目录内的相对路径且真实存在,拒绝 ..、绝对路径、普通文件;嵌套选择自动收敛到父级,避免重复扫描。
  • db.CreateDirectoryWithScope / db.UpdateDirectoryWithScope:原 CreateDirectory / UpdateDirectory 保留为薄封装,调用方无需改动。
  • directory.walkAndReconcileVideoFiles:改为按选中的子目录逐个 WalkDir,文件位置仍然相对目录根,因此播放、缩略图、JAV 关联、删除清理逻辑都不受影响。
  • API:POST /directories、PATCH /directories/:id 支持 scan_include: ["A","B"];改范围会和改路径一样等正在进行的扫描结束,然后重新扫描。

兼容性

  • 不传 scan_include 时行为与改动前完全一致。
  • 数据库升级是加列 + 默认值,已有目录自动是"扫描全部"。

测试

  • internal/db/directory_scan_scope_test.go:范围归一化、拒绝越界路径、保存/清空。
  • internal/directory/directory_scan_scope_test.go:遍历根计算、嵌套收敛、越界拒绝。
  • internal/api/directory_scan_scope_api_test.go:创建/更新接口的 scan_include 契约。
  • web/tests/features/directories/directoryScanScope.test.js:勾选 UI 与参数传递。
  • 手工端到端:起真实服务,目录下放 A/B/C 三个子目录各 1–2 个文件,只勾选 A → files_seen: 2;改勾 A+B → files_seen: 3。

本地已通过 go build ./...、go test ./internal/db/... ./internal/directory/... ./internal/api/ -run 'Directory|ScanScope'、npm run lint、npm run format:check、npm run build。

注:internal/api 的 TestFrontendStaticFileCannotEscapeStaticDirectory 与 internal/ffmpeg 若干用例在 Windows 本地失败(无符号链接权限、伪造 ffmpeg 二进制不可执行),与本次改动无关。

@WDonny

WDonny commented Nov 1, 2026

Copy link
Copy Markdown
Author

问题部分已修改

@WDonny

WDonny commented Nov 1, 2026

Copy link
Copy Markdown
Author

不好意思,检查了一下发现格式有问题,已经改正了

@Solr159

Solr159 commented Nov 2, 2026

Copy link
Copy Markdown
Owner

mark,有空看看

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants