chore(release): v0.3.27

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-10-03 21:49:03 +08:00
1 parent 871031d5ed
commit 0085e45ca7
15 files changed
+52 -40

No files matched your search

+33
View File
@@ -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 根元素改为 `<movie>`;兜底异常记内部错误并保留已写文件结果。
## [0.3.26] - 2026-10-03
### 新增
+1 -1
View File
@@ -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)。
## 功能
+1 -1
View File
@@ -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",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@umt/web",
"version": "0.3.26",
"version": "0.3.27",
"private": true,
"type": "module",
"scripts": {
+1 -1
View File
@@ -1,5 +1,5 @@
{
"version": "0.3.26",
"version": "0.3.27",
"workspace": [
"./packages/adapters",
"./packages/agent",
+1 -1
View File
@@ -17,7 +17,7 @@
## 当前状态
- 版本 v0.3.26,本机测试环境已部署。
- 版本 v0.3.27,本机测试环境已部署。
- 开发与发布约定见仓库根 [CLAUDE.md](../../CLAUDE.md)。
## 待办
+6 -27
View File
@@ -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. 统一作品类型判定(修 `<tvshow>` 根元素);多集文件写多个 `<episodedetails>`。
**T2 刮削准确度(剩余)**
- 多集文件写多个 `<episodedetails>`(需 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、真机验收。
+1 -1
View File
@@ -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",
+1 -1
View File
@@ -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",
+1 -1
View File
@@ -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",
+1 -1
View File
@@ -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",
+1 -1
View File
@@ -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",
+1 -1
View File
@@ -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",
+1 -1
View File
@@ -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",
+1 -1
View File
@@ -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",