feat(contracts,server,web): files G6–G8 fields and identify S-7 contract

- G6: FileRoot.pendingCount/pendingPartial for download roots (same rule as the
  unidentified filter, recursive, cached 5 min, invalidated by files.changed)
- G7: FileEntry.parsedHint from parseReleasePath (file + parent dirs); the web
  subline uses it and no longer parses names itself
- G8: FileIdentifyCandidate.posterUrl (TMDB poster_path via adapter and
  catalog.lookup, local entities from metadata.posterPath); thumbnails in the
  identify panel
- S-7 contract: FilesIdentifyResult.remoteTaskId/remotePending,
  MediaServerInventory.partial, EventType identify.completed with
  IdentifyCompletedPayload; identify panel (useIdentifyLive) and organize wizard
  merge remote results by root + path, buffering events that beat the response

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-28 20:09:29 +08:00
1 parent fd2f7bc33d
commit abc69886ea
26 files changed
+510 -134

No files matched your search

+3 -3
View File
@@ -280,9 +280,9 @@
| G3 | 目标已存在策略 | `FilesOrganizeRequest` 加 `onConflict: "skip"\|"decision"\|"replace_if_better"`;替换走现有 `replace_with_verify`,旧文件进回收站 | 是 |
| G4 | 命名方式 + 来源 | 请求加 `naming: "template"\|"keep"`;响应每组加 `templateSource: "entity"\|"root"\|"global"` 与目标路径 `segments:[{text, role, bound}]` | 是 |
| G5 | 入库后刷新元数据 | 请求加 `refreshMetadata: boolean`,执行成功后对每个作品排一次 refresh run | 否(前端可在完成后调 `/files/scrape`) |
| G6 | 下载目录待识别计数 | `FileRoot` 加 `pendingCount`(缓存 5 分钟) | 否 |
| G7 | 列表轻量解析 | 待识别视频的 entry 加 `parsedHint`(标题·季集·分辨率,纯字符串解析,不查库) | 否 |
| G8 | 候选海报 | `FileIdentifyCandidate` 加 `posterUrl` | 否 |
| G6 | 下载目录待识别计数 | `FileRoot` 加 `pendingCount`(缓存 5 分钟) | 否(C1-C 已做,另有 `pendingPartial`) |
| G7 | 列表轻量解析 | 待识别视频的 entry 加 `parsedHint`(标题·季集·分辨率,纯字符串解析,不查库) | 否(C1-C 已做) |
| G8 | 候选海报 | `FileIdentifyCandidate` 加 `posterUrl` | 否(C1-C 已做) |
| G9 | 推荐名 | `POST /files/suggest-name {root,path}` → 命名引擎渲染(依赖 `naming-template.md` §8 的引擎);不可信时返回 `null` + 原因 | 是(依赖命名引擎) |
## 16. 实施拆分与估算