From 0085e45ca7d205831875ff611b8241df9ae96d61 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 3 Oct 2026 21:49:03 +0800 Subject: [PATCH] chore(release): v0.3.27 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei --- CHANGELOG.md | 33 +++++++++++++++++++++++++++++++++ README.md | 2 +- apps/server/deno.json | 2 +- apps/web/package.json | 2 +- deno.json | 2 +- docs/plan/README.md | 2 +- docs/plan/system-review.md | 33 ++++++--------------------------- packages/adapters/deno.json | 2 +- packages/agent/deno.json | 2 +- packages/contracts/deno.json | 2 +- packages/db/deno.json | 2 +- packages/domain/deno.json | 2 +- packages/mapping/deno.json | 2 +- packages/tasks/deno.json | 2 +- packages/testkit/deno.json | 2 +- 15 files changed, 52 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a314ae75..5d7f7454 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,39 @@ ## [Unreleased] +## [0.3.27] - 2026-10-03 + +按 2026-10-03 系统梳理(`docs/plan/system-review.md`)修第一批:静默卡死、刮削准确度、集数映射漏口。迁移 `0067`、`0069`、`0070`。 + +### 修复(集数映射) +- 整理向导只发用户改过的季集,未改的交给服务端按作品映射;集数待确认的行需填季集或排除才能执行。之前向导把预填季集当人工指定,绕过了映射。 +- 自动识别新建作品后排一次元数据刷新;之前季表为空,绝对集号只能按原号放行。 + +### 修复(下载) +- 同一种子被移除过、再次提交或接管时复活旧任务,不再永远停在「已提交」;复活后完成照常触发整理。 +- qB 重启 / 重新校验 / 移动时不再把「整理中」「已入库」改回下载状态,缓存清理不再漏掉这批任务。 +- qB 连续 3 轮查不到才判任务已移除。 +- 同一种子已被别的计划占用时取消本计划并释放预留,不留孤儿计划。 +- 下载卡住 / 出错的待处理在恢复后自动关闭。 + +### 修复(获取) +- 被自动化开关、下载器、预算、缓存卷挡住的资源写延后并按退避(30 分钟起,最长 6 小时)重评,电影与已满足的剧集也会重评。 +- 卡住的下载不占并发名额。 +- 失败 / 取消的旧计划让位,同一资源可重新计划(失败按次数冷却);用户移除、手动取消、整理失败、种子被占用的仍不重下。 +- 集数待确认的资源在订阅侧写候选记录,能看到原因;订阅完成、暂停、资源过期时清掉对应延后。 + +### 修复(整理) +- 卡在「执行中」的整理记录由巡检重投(最多 3 次,超过转失败并开待处理)。 +- 库根离线时不耗尽重试,记录等待并开待处理,恢复后自动继续。 +- 有视频因集数待确认等被排除时记录为部分完成,Move 不删 qB 任务,并开待处理。 +- Move 后删除 qB 任务失败会重试。 + +### 修复(刮削) +- 改 TMDB 映射后清掉旧作品的 TMDB 字段与图片、退役未锁定的旧 IMDb,完整刷新后自动重刮,不再新旧混写。 +- 季 / 集缺元数据时先按 TMDB id 现取补齐,仍缺跳过并记部分完成,不再写占位并报成功;没有 TMDB id 的作品照旧写占位。 +- 新增覆盖方式「更新」并设为缺省:只覆盖本工具写过且没被改过的文件;元数据刷新有变化时自动排更新重刮。 +- 合集 / 其他类作品的 NFO 根元素改为 ``;兜底异常记内部错误并保留已写文件结果。 + ## [0.3.26] - 2026-10-03 ### 新增 diff --git a/README.md b/README.md index 08b700bd..48066102 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 内部使用、Agent 自动化优先的媒体整理入库平台。需求基线见 [media_automation_requirements_architecture_v0.7.md](media_automation_requirements_architecture_v0.7.md)。 -当前版本 v0.3.26,本机测试环境已部署;各版变化见 [CHANGELOG.md](CHANGELOG.md)。业务逻辑以 MoviePilot v3 为参考,逐项对照见 [MoviePilot v3 对照](docs/porting/moviepilot-v3-comparison.md)。正在推进的计划与待办见 [docs/plan](docs/plan/README.md),开发与发布约定见 [CLAUDE.md](CLAUDE.md)。 +当前版本 v0.3.27,本机测试环境已部署;各版变化见 [CHANGELOG.md](CHANGELOG.md)。业务逻辑以 MoviePilot v3 为参考,逐项对照见 [MoviePilot v3 对照](docs/porting/moviepilot-v3-comparison.md)。正在推进的计划与待办见 [docs/plan](docs/plan/README.md),开发与发布约定见 [CLAUDE.md](CLAUDE.md)。 ## 功能 diff --git a/apps/server/deno.json b/apps/server/deno.json index 02aa6c2f..ee943a84 100644 --- a/apps/server/deno.json +++ b/apps/server/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/server", - "version": "0.3.26", + "version": "0.3.27", "exports": { ".": "./src/main.ts" }, "tasks": { "dev": "deno run -A --watch --env-file=../../.env src/main.ts", diff --git a/apps/web/package.json b/apps/web/package.json index 818ebb54..51e0343a 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@umt/web", - "version": "0.3.26", + "version": "0.3.27", "private": true, "type": "module", "scripts": { diff --git a/deno.json b/deno.json index f7bd37e3..a4eae9e8 100644 --- a/deno.json +++ b/deno.json @@ -1,5 +1,5 @@ { - "version": "0.3.26", + "version": "0.3.27", "workspace": [ "./packages/adapters", "./packages/agent", diff --git a/docs/plan/README.md b/docs/plan/README.md index 1c8b882f..a30c114c 100644 --- a/docs/plan/README.md +++ b/docs/plan/README.md @@ -17,7 +17,7 @@ ## 当前状态 -- 版本 v0.3.26,本机测试环境已部署。 +- 版本 v0.3.27,本机测试环境已部署。 - 开发与发布约定见仓库根 [CLAUDE.md](../../CLAUDE.md)。 ## 待办 diff --git a/docs/plan/system-review.md b/docs/plan/system-review.md index 5d04b912..464482ba 100644 --- a/docs/plan/system-review.md +++ b/docs/plan/system-review.md @@ -61,21 +61,10 @@ 每批改动局部、带回归测试,按「计划 → 子代理实现 → 协调者验收」推进。 -**T0 集数映射补丁**(刚上线功能的漏口,改动最小) -1. 整理向导只发用户改过的季集(`touched`),未改的交给服务端映射;待确认行在向导里标为未决。 -2. 自动识别新建作品时排一次 `refreshMetadata`(刷新后已有逻辑会重算待确认 / 放行资源)。 -3. 评估跳过 `episode_unresolved` 时写候选记录,订阅矩阵能看到原因。 +**已完成(v0.3.27)**:T0 集数映射补丁、T1 静默卡死、T2 刮削准确度 1~3 与作品类型判定(见 CHANGELOG)。剩余: -**T1 静默卡死**(数据面稳定性,局部改动) -1. 下载:提交 upsert 遇到 removed 行时复活;同步不覆盖 importing / imported;连续多轮缺席才判移除。 -2. 整理:巡检 running 且无活跃任务超过 N 分钟的记录,重新入队;库根离线改为开待处理而不是耗尽重试。 -3. 获取:gates 不过时写延后并排重评,并发不计 stalled;幂等键只对在途 / 已完成生效;同 hash 已绑别的计划时结束或关联本计划。 - -**T2 刮削准确度** -1. 改身份:清该作品 tmdb 来源字段 → 排刷新 → 刷新完成后重刮(更新模式)。 -2. 集 / 季元数据缺失时按 TMDB id 现取季详情;仍缺就记 skipped / partial,不写占位。 -3. 覆盖策略加"更新本工具写过且未被改动的文件"(记写入 hash),作为缺省;元数据刷新有变化时自动排这种重刮。 -4. 统一作品类型判定(修 `` 根元素);多集文件写多个 ``。 +**T2 刮削准确度(剩余)** +- 多集文件写多个 ``(需 Kodi / Jellyfin 真机确认)。 **T3 获取正确性** 1. 订阅总带一个自己的收录版本(没有就建)。 @@ -89,21 +78,11 @@ 3. 快照失败、TMDB 查询复查耗尽开待处理。 **T5 可见性** -- qB 离线、下载目录读不到容量、整理排除视频、自动刮削没排上:都开待处理或在记录上标原因;卡住事项恢复后自动关闭。 +- qB 离线、下载目录读不到容量、自动刮削没排上:开待处理或在记录上标原因(整理排除视频、卡住事项自动关闭已在 v0.3.27 完成)。 **T6 真机验收** - 一套 Emby / Jellyfin 实例验 NFO 识别;补动画 / 公开 BT / 绝对集号的真实样本;在 4380 按四个场景(PT 追更剧、ANi 番、综艺、电影洗版)端到端追到 NFO。读部署库需要用户放行(自动模式把它归为生产数据读取)。 -## 执行(第一波,5 路并行) +## 执行 -按文件归属切线,互不改同一文件;每路独立 worktree(`/opt/umt-wt/<线>`)、分支、测试库容器(端口 5544x)。迁移编号预分配,协调者按 A→E 顺序合并到 main,合并后跑全量 ci 再发布。 - -| 线 | 内容 | 主要文件 | 迁移号(如需要) | 测试库端口 | -| --- | --- | --- | --- | --- | -| A 集数补丁 | T0-1 向导只发改过的季集;T0-2 自动新建作品排刷新 | `apps/web/.../organize-wizard/`、`file-manager/{organize,identify}.ts`、`sources-identity/service/resolve.ts` | 0071 | 55441 | -| B 下载卡死 | T1-1 复活 removed 行、不覆盖 importing/imported、多轮缺席才判移除;同 hash 第二个计划 | `acquisition-organize/services/downloads.ts`、`packages/mapping/src/download.ts` | 0067 | 55442 | -| C 获取卡死 | T0-3 待确认写候选记录;T1-3 挡住写延后并排重评、并发不计 stalled、幂等键放开 failed/cancelled | `acquisition-organize/services/{acquisition,evaluate-autofill,subscriptions}.ts` | 0068 | 55443 | -| D 整理卡死 | T1-2 running 记录巡检重投、库根离线开待处理;排除视频不算成功;Move 后删 qB 任务失败可重试 | `acquisition-organize/{index,handlers}.ts`、`services/organize-{exec,finalize}.ts`、`packages/mapping/src/organize.ts` | 0069 | 55444 | -| E 刮削准确度 | T2-1 改身份清字段 + 刷新 + 重刮;T2-2 缺集元数据不写占位;T2-3 更新模式(写入 hash);T2-4 作品类型判定统一 | `services/{scrape,scrape-input}.ts`、`packages/domain/src/scrape`、`sources-identity/service/{identity-admin,metadata}.ts` | 0070 | 55445 | - -第二波(第一波合并后):T3 获取正确性、T4 识别准确度、T5 可见性、多集 NFO、真机验收。 +第一波(T0、T1、T2)已用 5 路并行完成并发布 v0.3.27:每路独立 worktree、分支、测试库容器,迁移号预分配,协调者合并后跑全量 ci。合并时发现一处两线交叉(种子被占用而取消的计划会被「失败可重试」规则立即重建),已修。下一波沿用这种做法:T3 获取正确性、T4 识别准确度、T5 可见性、多集 NFO、真机验收。 diff --git a/packages/adapters/deno.json b/packages/adapters/deno.json index 7f707b77..b9ec5d0e 100644 --- a/packages/adapters/deno.json +++ b/packages/adapters/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/adapters", - "version": "0.3.26", + "version": "0.3.27", "exports": { ".": "./src/index.ts", "./fsworker": "./src/fs/fsworker.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/agent/deno.json b/packages/agent/deno.json index 78884d20..3fab8342 100644 --- a/packages/agent/deno.json +++ b/packages/agent/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/agent", - "version": "0.3.26", + "version": "0.3.27", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/contracts/deno.json b/packages/contracts/deno.json index ae2012c9..584d3df8 100644 --- a/packages/contracts/deno.json +++ b/packages/contracts/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/contracts", - "version": "0.3.26", + "version": "0.3.27", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/db/deno.json b/packages/db/deno.json index be5f32d2..45d8e5d1 100644 --- a/packages/db/deno.json +++ b/packages/db/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/db", - "version": "0.3.26", + "version": "0.3.27", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/domain/deno.json b/packages/domain/deno.json index bf53436c..6aa87d96 100644 --- a/packages/domain/deno.json +++ b/packages/domain/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/domain", - "version": "0.3.26", + "version": "0.3.27", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/mapping/deno.json b/packages/mapping/deno.json index c8ba538f..07dddbd6 100644 --- a/packages/mapping/deno.json +++ b/packages/mapping/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/mapping", - "version": "0.3.26", + "version": "0.3.27", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/tasks/deno.json b/packages/tasks/deno.json index e85002d3..2603c9d8 100644 --- a/packages/tasks/deno.json +++ b/packages/tasks/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/tasks", - "version": "0.3.26", + "version": "0.3.27", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/testkit/deno.json b/packages/testkit/deno.json index 9c259105..681272d6 100644 --- a/packages/testkit/deno.json +++ b/packages/testkit/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/testkit", - "version": "0.3.26", + "version": "0.3.27", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run",