diff --git a/CHANGELOG.md b/CHANGELOG.md index 29b5f7e4..14668737 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ ## [Unreleased] +### 新增(HIS-1 整理记录对齐 MP 历史记录页) +- 列表加海报、源 → 目标路径、大小、下载器名称;成功不再加徽章,失败 / 部分成功带一句原因。 +- 筛选新增类型(电影 / 剧集 / 未识别)与时间(今天 / 7 天 / 30 天);关键字支持 `*` `?` 通配,并能搜文件名与种子 hash;筛选写进地址栏。 +- 列表上方按状态计数(只列非零项,点一下筛选);「按作品分组」。 +- 删除记录:可选同时删除源文件、媒体库里的文件(移入回收站,可还原;已入库文件同时从媒体库移除;下载器任务不动)。确认框先核对,写清删几个文件、多大、哪些删不了、哪些下载会被重新自动整理。 +- 批量:选择 / 全选、批量删除、批量重新整理(选中记录的源文件一起进整理向导)。行菜单:查看详情、重新整理、让智能体排查、只看这个作品、删除。 +- 详情加海报、大小、下载任务与删除;种子 hash 在「技术信息」。 +- 接口:`GET /organization-records/stats`、`POST /organization-records/delete`;列表查询新增 `kind`、`since`、`organizeOnly`;公开记录新增 `media.posterPath`、`sizeBytes`、`download`(只加字段)。MP 功能对照表见 `docs/runbook/organize.md`。 + ## [0.3.6] - 2026-09-30 ### 新增(SEARCH-4 资源筛选对齐 MP) diff --git a/docs/runbook/organize.md b/docs/runbook/organize.md new file mode 100644 index 00000000..32585504 --- /dev/null +++ b/docs/runbook/organize.md @@ -0,0 +1,65 @@ +# 整理记录(`/console/organize`,HIS-1) + +整理记录页列出每次整理(复制 / 移动 / 硬链接)以及文件管理的改名、删除、还原。HIS-1 按 MoviePilot 历史记录页逐项补齐。 + +实现: +- 列表 / 统计 / 详情:`apps/server/src/modules/acquisition-organize/routes/organization.ts`(筛选 `recordFilters`,通配 `likePattern`);公开字段在 `services/organize.ts` 的 `loadRecordsPublic`。 +- 删除:`apps/server/src/modules/file-manager/record-delete.ts`(复用文件管理删除 `deleteFiles`)。 +- 契约:`packages/contracts/src/organization.ts`(`OrganizationListQuery`、`OrganizationStats*`、`OrganizationDelete*`),端点 `Api.organization.stats / remove`。 +- 前端:`apps/web/app/routes/console/organize.tsx`、`organize.$id.tsx`,`components/organize/`(删除确认框、标题 / 季集小件),批量重新整理走整理向导的 `{ kind: "records" }` 来源。 + +## 与 MP 的对照 + +MP 对照源:`MoviePilot-Frontend/src/views/reorganize/TransferHistoryView.vue`、`components/dialog/TransferHistoryDeleteDialog.vue`、`app/api/endpoints/history.py`、`app/db/models/transferhistory.py`。 + +| MP 功能 | 我们 | 说明 | +| --- | --- | --- | +| 海报 | 新增 | 作品海报(`media.posterPath`),没有时显示首字占位 | +| 标题 / 年份 / 季集 | 已有 | `作品 (年) S01E02`;未识别的显示「未识别 · 源文件名」 | +| 二级分类(华语电影等) | 不做 | 我们没有二级分类;按类型(电影 / 剧集)筛选代替 | +| 源路径 → 目标路径 | 新增 | 列表加「源 → 目标」列(只显示末两段,悬停看全路径);详情「整理前 / 整理后」已有 | +| 存储标签(本地 / SMB…) | 不做 | 只有本地存储,标签不提供信息 | +| 整理方式 复制 / 移动 / 硬链接 | 已有 | 列表「方式」列;文件管理的改名、移入回收站、还原也在这里 | +| 软链接、Rclone 复制 / 移动 | 不做 | 整理服务不支持这几种方式 | +| 大小 | 新增 | 逐文件源大小之和(`sizeBytes`) | +| 状态 成功 / 失败 + 失败原因 | 已有,改 | 加「部分成功」「执行中」;成功不加徽章;失败原因走 `reasons.ts` 一句话,原码进详情「技术信息」 | +| 时间 | 已有,改 | 相对时间,悬停看完整时间 | +| 来源 下载器 / 手动 / 自动 | 新增下载器 | 来源列加下载器名称;详情加「下载任务」一行,种子 hash 进「技术信息」 | +| 关键字搜索(标题、源、目标;`*` `?` 通配) | 已有,补 | 补通配、逐文件的源 / 目标路径、种子 hash | +| 搜「成功」「失败」切状态 | 不做 | 有状态筛选和计数按钮 | +| 状态筛选 | 已有 | | +| 类型筛选 | 新增 | 电影 / 剧集 / 未识别(`kind=movie\|series\|none`) | +| 时间筛选 | 新增 | 今天 / 最近 7 天 / 最近 30 天(`since`)。MP 没有,任务单要求 | +| 统计(总数 / 成功 / 失败) | 新增 | 列表上方一行计数,只列非零项,点一下按该状态筛选(`GET /organization-records/stats`) | +| 分页、每页条数 | 已有(不同) | 游标「加载更多」,MP 手机端同样是触底加载;不做页码与每页条数 | +| 列排序 | 不做 | 按时间倒序;分组模式下按作品聚合 | +| 分组模式(按标题) | 新增 | 「按作品分组」,组头可折叠 | +| 筛选写进地址栏 | 新增 | 状态 / 类型 / 来源 / 时间 / 关键字 / 分组都在 URL,刷新不丢 | +| 单条:重新整理 | 已有,补 | 详情已有;列表行菜单新增。走整理向导(识别 → 选项 → 预览执行) | +| 单条:智能助手整理 | 已有(不同) | 「让智能体排查」:失败 / 部分成功的记录在行菜单和详情里 | +| 单条:删除(只删记录 / 连源文件 / 连媒体库文件 / 全部) | 新增 | 确认框里两个勾选项,先核对再执行,写清删几个文件、多大、哪些删不了、会不会被自动整理再处理 | +| 查看详情 | 已有 | 详情加海报、大小、下载任务、删除按钮 | +| 批量选择 / 全选 | 新增 | 「批量」进入选择模式,表头全选 | +| 批量删除 | 新增 | 同单条删除确认框;删不了的逐条列出,其余照删 | +| 批量重新整理 | 新增 | 选中记录的源文件一起进整理向导;同属一个作品时预选作品 | +| 清空整理记录 | 不做 | 整理记录同时是文件变更的追溯记录;清理按保留期由计划页负责 | + +## 删除 + +`POST /organization-records/delete {ids[≤200], deleteSource, deleteTarget, dryRun}`,scope `organize.execute`。 + +- 文件一律移入回收站,走文件管理删除(`deleteFiles`,mode=trash,`retireAssets=true`):已入库文件同时从媒体库移除(位置 removed、资产 retired、满足的收录版本转需关注 + 待处理)。回收站里能还原。 +- 源文件 = 该记录逐文件结果的 `source_path`(只认执行进程本地视图);媒体库文件 = 成功文件的 `target_path`(相对库根时按库根拼)。已经不在的文件跳过、不拦。 +- 只有复制 / 移动 / 硬链接记录有文件可删;改名、移入回收站、还原类记录只删记录本身。 +- 一条记录的任一文件不能删(做种未满足或下载中 `download_active`、绑定目录 `needs_unbind`、不在登记目录 `outside_roots`、目录离线等),这条记录连同它的文件都不动;还在整理的记录(`running`)不删。其余照删。 +- 文件移入回收站会写一条「移入回收站」整理记录(同文件管理删除),`trashRecordId` 返回它。 +- 下载器里的任务不删(同文件管理删除原则)。 +- 删文件只允许管理员(控制台会话 / DEV key);API Key 只能删记录,删文件 403,需先走 `/files/delete` 的一次性审批。 +- `autoRetry`:下载已完成但没入库(`download_task.status=completed`、本工具管理、没从下载器删除)且删完没有别的整理记录的下载任务数。自动整理扫描(`index.ts` 的补漏)会在几分钟后重新整理它们——与 MP 删失败记录后重新整理一致;已入库(`imported`)的不会。 +- 删除不写增量读取的墓碑(`/organization-records/changes` 不会出现被删的记录);文件变化通过「移入回收站」记录可见。审计 `files.organize_records_delete`。 + +## 已知缺口 + +- 删媒体库文件只删整理记录里的文件,目录里的 NFO、图片与空目录保留(MP 在没有剩余视频时会连目录删掉)。 +- 分组只对已加载的记录生效(同 MP 分组模式)。 +- 统计的「进行中」= 排队 + 执行中;点它时列表只筛执行中。