Commit Graph
100 Commits
Author SHA1 Message Date
rootandClaude Opus 5.5 c532060c83 feat(organize): 文件级标题粗核,混合包里明显不是本作品的视频降为待确认
- 同一批视频里文件名标题与作品标题 / 原名 / 别名明显不符(没有足够共同词)的排除为 title_mismatch,不按本作品命名入库;
- 只在同批至少一个文件对得上作品时才判断,剧集只看带 SxxEyy 的文件,用户逐文件指定过的不核;
- title_mismatch 算「本该入库却被排除」:记录部分完成、开待处理、Move 不移除下载任务。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 23:33:41 +08:00
rootandClaude Opus 5.5 b40716d74f fix(organize): 不是视频的文件移入回收站并开待处理,不留在媒体库
- 收尾判定 NOT_VIDEO 后,已拷 / 搬进库的新文件和它的附属文件移入回收站(登记 trash_item),开待处理;
- 附属文件结果改为跳过 main_failed(不再写成功却不登记);
- 已结束记录重放时补做,可重入;原地入库不动原文件,洗版替换照旧回滚。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 23:28:35 +08:00
rootandClaude Opus 5.5 1c8c5d2fb7 fix(organize): 非洗版替换新建资产;复用缺失位置时更新状态与事实
- 目标路径已有位置且本次是「替换」(向导 / 待处理选替换),或旧位置属于别的作品时,退役旧位置(没有别的位置时资产退役)
  并新建资产,size / hash / delivery / 版本信息都是新文件的(复用洗版分支的处理);
- 复用之前判为缺失 / 不可用的位置时,位置恢复可用、资产恢复 active,大小 / 校验 / 版本信息换成这次入库的文件。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 23:25:41 +08:00
rootandClaude Opus 5.5 b7f9eb82ad fix(scrape): 平铺目录判断里资产没有作品时按别的作品算(修类型错误)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 23:23:17 +08:00
rootandClaude Opus 5.5 89aa70bb9c fix(scrape): 平铺目录只刮本作品视频、图片按视频名命名;图片扩展名按实际类型;取消时记录不停在进行中
- 作品重刮对电影传入该作品已入库的视频,不给同目录别的电影写本作品 NFO;
- 电影目录里有别的作品的视频时海报 / 背景图写 <视频名>-poster / -fanart,不写目录共用的 poster.jpg;
- 图片扩展名按下载到的 MIME,URL 认不出或与内容不符时以内容为准;
- 任务被取消时记录收尾为失败 scrape_canceled,保留已写文件结果。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 23:21:52 +08:00
rootandClaude Opus 5.5 cdf62dbf02 feat(scrape): 入库后自动刮削缺省开启,没排上时在整理记录上记「未刮削(原因)」
- scrape_record 状态加 skipped(迁移 0074);目标不在媒体库、库根只登记、作品没有 TMDB id 也没有本地元数据、排队失败时
  留一条挂在整理记录上的「未刮削」记录(同原因只记一次),设置关闭不记;
- 缺省开启 scrapeAfterImport,只对有 TMDB id 或本地元数据的作品排;
- 已结束记录重放与收尾同一口径补排刮削(按整理记录幂等);
- 整理详情「整理后刮削」显示未刮削原因,并列出失败与非预期跳过(缺元数据、认不出集号)的文件。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 23:19:28 +08:00
rootandClaude Opus 5.5 8c4c7d028a feat(scrape): 多集文件写多个 episodedetails 块,综艺日期期数按播出日期对集
- 多集文件(文件名 E01-E02 或覆盖多个集单元)按 Kodi 约定在一个 NFO 里每集写一块,MP 只写首集,偏离登记在 nfo-deviations.json;
- 综艺按日期命名的期数按本地季表或 TMDB 季详情的播出日期对上集,写季号、集号与 aired,不再 scrape_no_episode 跳过;
- 认不出集号、集数待确认的跳过让记录记部分完成(已存在 / 没变 / 被人改过仍算完成)。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 23:13:47 +08:00
rootandClaude Opus 5.5 0085e45ca7 chore(release): v0.3.27
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:49:03 +08:00
rootandClaude Opus 5.5 871031d5ed fix(scrape): 没有 TMDB id 的作品季 / 集缺元数据时照旧写占位 NFO
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:37:14 +08:00
rootandClaude Opus 5.5 5b023ad682 fix(acquisition): 同一种子被别的计划占用而取消的计划不让位,避免 B/C 两线合并后取消 → 重评 → 再取消的空转
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:23:52 +08:00
rootandClaude Opus 5.5 15d7f2ec2f merge: fix/b-download
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:23:04 +08:00
rootandClaude Opus 5.5 1c2fff694b fix(download): 卡住 / 异常恢复后自动关闭事项(L2),补下载卡死修复测试
stalled → 恢复下载 / 完成、failed / missing → 恢复正常时,关闭同一任务 open / awaiting_user 的 download_stalled / download_failed 事项(resolved,system:download-sync);Agent 调查中的由其自行核实关闭。
新增 download-sync-recovery 测试覆盖 removed 行复活、同 hash 第二个计划、imported 回退、多轮缺席、事项自动关闭。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:20:08 +08:00
rootandClaude Opus 5.5 d96f0ff19f fix(download): 连续 3 轮查不到才判移除(M1)
qB 列表与按 hash 都查不到时先记 missing_since / missing_count,连续 MISSING_CONFIRM_ROUNDS(3) 轮才判 removed;中途重新出现或只是去掉管理标签即清零。相关测试改为同步多轮后再断言移除。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:20:08 +08:00
rootandClaude Opus 5.5 cba5de731b fix(download): removed 行再次提交 / 接管时复活,同 hash 第二个订阅计划取消(H1、M3/M6)
- 提交遇到同 (实例, hash) 的 removed 行:清 removed_at、状态回到 queued / submitting、改挂新计划、generation+1;
- 接管(adopt)冲突时 removed 行同样复活为 adopted 行;
- 完成事件幂等键按 generation 换代,复活后完成仍能触发整理;
- 订阅计划遇到任务行已挂着别的计划:本计划取消(torrent_in_use_by_plan:<计划>)并释放 Slot 预留,不再留下没有任务的 submitted 孤儿;手动计划仍经 import_plan_id 挂到已有任务。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:20:08 +08:00
rootandClaude Opus 5.5 2159765949 fix(download): 已入库任务不被 qB 中间态改回(H2)
importing / imported 只由整理侧推进:checkingResumeData / queuedDL / checkingUP / moving 等中间态只更新原始字段,不改回 queued / downloading / completed,completed_at 不重写;这期间也不做无进展判定。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:20:08 +08:00
rootandClaude Opus 5.5 3904abc472 feat(db): download_task 增加缺席记录与代数字段(迁移 0067)
missing_since / missing_count 记录 qB 里连续查不到的起点与轮数;generation 记录 removed 行复活次数,用于完成事件幂等键换代。contracts DownloadTask 同步为可选字段。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:20:08 +08:00
rootandClaude Opus 5.5 b3555c04b5 merge: fix/e-scrape
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:17:16 +08:00
rootandClaude Opus 5.5 fe32520643 merge: fix/d-organize
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:11:22 +08:00
rootandClaude Opus 5.5 0f22902c17 merge: fix/c-acquisition
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:11:22 +08:00
rootandClaude Opus 5.5 e6bc630a4d merge: fix/a-episode
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:11:22 +08:00
rootandClaude Opus 5.5 132f150901 docs(scrape): 按现状改写 MP 对照 §10,运行手册写覆盖方式、自动重刮与缺元数据处理
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:04:57 +08:00
rootandClaude Opus 5.5 4306bff6d3 feat(web): 刮削设置与对话框加「更新」覆盖方式,内容没变的跳过不逐条列出
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:04:57 +08:00
rootandClaude Opus 5.5 37cf0a398e feat(identity): 改 TMDB 映射后清旧字段、full 刷新并自动更新重刮
- setEntityIdentity:TMDB 映射变化时同事务清掉作品及季 / 集单元的 tmdb 来源字段(人工覆盖 / 锁定保留,
  海报背景图不再保留旧作品的),退役没锁的 IMDb 映射,提交后排 full 刷新
- refreshMetadata:NFO 相关字段(作品或季 / 集)有变化时调 scheduleEntityRescrape,评分票数变化不触发

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:04:57 +08:00
rootandClaude Opus 5.5 dbbf39eda4 feat(scrape): 覆盖方式加「更新」并设为缺省,季集缺元数据不写占位,作品类型判定统一
- 每次写入在 scrape_record.files[].hash 记 sha256;update 模式只覆盖本工具写过且没被改过的文件,
  被改过的跳过(scrape_user_modified),内容没变不重写(scrape_unchanged),旧记录无 hash 按修改时间兜底;
  迁移 0070 给 scrape_record.mode 加 update,设置缺省改为 update(旧值照旧有效)
- 季 / 集单元缺元数据时按 TMDB id 现取季详情补齐;仍缺跳过(scrape_metadata_missing)并记 partial,不写占位 NFO
- scrapeKindOf 统一作品类型判定,合集 / 其他类作品 NFO 根元素为 <movie>;TMDB 映射按作品类型过滤 entity_type
- 兜底异常记 scrape_internal_error 并保留已写文件结果
- 新增 scheduleEntityRescrape(刮削过的作品延后排 update 重刮,排队记录合批防抖)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 21:04:57 +08:00
rootandClaude Opus 5.5 fa834a10bd test(e2e): 常规剧集纵切按新建作品 full 刷新后的季表断言 S1 集单元
自动识别新建作品后会排一次 full 元数据刷新,S1 集单元全部来自 TMDB 季详情并转正式,
不再停留在「E02 临时」。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:59:52 +08:00
rootandClaude Opus 5.5 0744be5c68 整理:卡住记录巡检重投、库根离线暂停、排除视频开待处理、Move 后补移除 qB 任务
- 巡检(挂在"补提交与补入库"):running 且无活跃 verifyAndImport 运行超过 30 分钟的记录以 record:<id>
  重新入队(迁移 0069 记 requeue_count / requeued_at),重投 3 次仍卡住 → 未完成文件记失败、记录收尾、
  开 organize_stalled 待处理
- executeRecord 库根离线 / 建目标目录失败不再抛错耗尽重试:记录保持 running 写原因、开待处理
  (library_root_offline:<根> 复用规划期同一事项),任务按等待收尾;离线记录每 5 分钟重投、不计上限,
  恢复后清原因并关闭离线事项
- 排除的待确认视频统一开 organize_excluded 待处理,记录原因 excluded_unresolved
- Move 后移除 qB 任务抽成 removeMovedDownload:重放已结束记录与巡检都会对 move 成功但未移除的下载任务再试;
  修正"下次同步重试"的误导日志

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:59:06 +08:00
rootandClaude Opus 5.5 70935f4c17 整理:被排除的待确认视频不算成功
季集待确认 / 没有季目录 / 命名失败而被排除的视频(excluded:episode_unresolved / no_target_dir /
naming_failed)让整理记录从 succeeded 降为 partial;样例、过小、已在库等预期跳过不受影响。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:59:06 +08:00
rootandClaude Opus 5.5 4532587ad5 fix(acquisition): 计划幂等键只挡在途 / 已完成,失败 / 取消的旧计划让位
acq:{slot}:{release} 原先对 failed / cancelled 也冲突,站点 Cookie 修好、下载器恢复、
重置订阅后同一资源对该收录版本永不再建计划。现在在收录版本行锁内查旧计划:
- reserved / submitted / completed:照旧挡住;
- failed / cancelled / expired:旧计划幂等键改名为 …:retired:{id} 让位,再插新计划(同一事务,唯一约束兜底);
- 用户明确不要的(download_removed、cancelled_by_user)和整理阶段失败(organize:*)仍挡住;
- failed 的按该资源已失败次数冷却(30 分钟起翻倍,封顶 6 小时),冷却中写延后 retry_cooldown 并排到冷却结束重评,
  避免持续失败时每轮都建计划、开待处理。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:47:48 +08:00
rootandClaude Opus 5.5 8c10c12bd7 fix(acquisition): 闸门挡住的资源写延后并排重评;并发预算不计 stalled;清理空转延后行
- 自动化开关 / 下载器 / 预算 / 缓存卷挡住时,除候选记录(改为 deferred)外写 slot_deferral,
  原因区分 gate:automation / gate:downloader / gate:budget / gate:cache,并排该收录版本重评;
  电影收录版本与已满足的剧集收录版本也会被重评(scheduleSlotRetry,不推迟已排得更早的)。
- 重评时间按延后次数退避:30 分钟起翻倍、封顶 6 小时;预算释放 / 缓存卷恢复没有统一事件,不做事件触发。
- 并发预算:stalled 任务不占名额;已预留计划只算还没建下载任务的,不与任务重复计。
- 延后行清理:资源过期 / 不可评估 / 集数待确认时清该资源的延后;订阅完成(含 stopAfter)清其收录版本的延后;
  订阅暂停 / 取消后重评跳过时清对应延后。
- continuous-series e2e:三集被接收后 once 订阅即完成、延后行随之清掉,改以候选评估记录断言"另一版本延后"。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:47:23 +08:00
rootandClaude Opus 5.5 4d24edd94c fix(acquisition): 集数待确认的资源在订阅侧写候选记录
评估跳过 episode_unresolved 时,给仍在追踪的收录版本各写一条 skipped 候选评估
(原因 episode_unresolved),作品「为什么选 / 不选」与订阅记录能看到"集数待确认"。
确认后重发评估按 (收录版本, 资源) 覆盖;换算到别的季不再进入原收录版本时,
先清掉旧的待确认记录,不留陈旧原因。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:46:40 +08:00
rootandClaude Opus 5.5 93ca5eef2c docs(runbook): 说明整理向导的季集发送规则与新建作品刷新
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:38:50 +08:00
rootandClaude Opus 5.5 b02b4a500f fix(identity): 自动识别新建作品后排一次元数据刷新
bindAuto 经 createEntityFromTmdb 新建作品时,事务提交后入队 full refreshMetadata
(幂等键 refreshMetadata:created:<作品>,与人工指定 / 整理接管同一做法)。新建档没有季表时
资源按原号放行(unverified),刷新补齐季表后重算为换算结果。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:38:50 +08:00
rootandClaude Opus 5.5 c16f8a51e9 fix(organize-wizard): 整理向导只发用户改过的季集,不再绕过集数映射
- 行上新增 episodeTouched / mappedFor:只有行内改季集、批量季号、集号偏移、弹窗指定季号的行才发季集;
  未改动的预填只作展示,交给服务端按最终作品映射
- 改选作品后,按旧作品映射的预填清空(未映射的解析值保留);补识别刷新未改动行的预填
- 识别结果新增 episodeUnresolved(集数待确认),向导里该行未决,需填季集或排除
- pg 测试:向导整理 `[ANi] X - 25` 不带季集 → S02E13,显式季集按用户值

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:38:50 +08:00
rootandClaude Opus 5.5 00045a24cb docs(plan): 梳理待办第一波 5 路并行分工
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:30:07 +08:00
rootandClaude Opus 5.5 5e1bd5d350 docs(plan): 系统梳理——五块能力审视、交接点漏洞与分级待办
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:21:05 +08:00
rootandClaude Opus 5.5 6b19cede62 chore(release): v0.3.26
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:08:42 +08:00
rootandClaude Opus 5.5 7793c7b3bc feat(agent): 集数待确认的智能体兜底——查看上下文 / 模拟 / 写规则三个能力,写入前强制模拟,接后台调查与授权内恢复
能力 ID 的域名允许单个下划线分词(episode_mapping)。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 20:08:20 +08:00
rootandClaude Opus 5.5 45a114263b feat(episode-mapping): 映射规则接口与模拟预览、待处理确认 / 忽略、作品页集数映射分区与订阅摘要
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 19:28:09 +08:00
rootandClaude Opus 5.5 fe597187dd feat(organize): 整理、季包选文件、刮削、文件管理识别统一套用集数映射;单集沿用资源判定,待确认文件不按原号入库
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 18:46:04 +08:00
rootandClaude Opus 5.5 691671a1d2 feat(identity): 识别接入集数解析——映射规则表、规范季集写回解析结果、待确认不建单元并开待处理、规则失效停用、按作品重算
迁移 0066_episode_mapping。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-03 18:03:32 +08:00
rootandClaude Opus 5.5 7b9939e0a0 feat(domain): 集数解析纯函数——规则、原号校验(滞后放行)、绝对集号与播出日期换算、建议规则
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 17:18:43 +08:00
rootandClaude Opus 5.5 111cbddb36 docs(plan): 集数解析与映射计划;版本号更新到 v0.3.25
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 17:09:51 +08:00
rootandClaude Opus 5.5 4fb2440639 chore(release): v0.3.25
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 11:43:08 +08:00
rootandClaude Opus 5.5 c30a758a74 feat(subtitles): 字幕库验证码由智能体视觉接管;字幕站原站视图下载当前字幕
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 11:43:08 +08:00
rootandClaude Opus 5.5 023063edf4 docs(subtitles): SubHD 复测通过,验证码二三层兜底暂缓
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 11:27:47 +08:00
rootandClaude Opus 5.5 227f7ea4f9 chore(release): v0.3.24
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 02:42:05 +08:00
rootandClaude Opus 5.5 3c46b6d40a fix(sandbox): 7z-wasm 默认导出兼容 deno check
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 02:31:34 +08:00
rootandClaude Opus 5.5 59b3680f35 feat(subtitles): 字幕站(SubHD、字幕库)在线搜索与下载;rar / 7z 解压;验证码与页面解析在沙箱里
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 02:28:29 +08:00
rootandClaude Opus 5.5 92d456d123 chore(release): v0.3.23
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 02:06:23 +08:00
rootandClaude Opus 5.5 a3cdcc7796 fix(sandbox): 文案标点
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 01:54:10 +08:00
rootandClaude Opus 5.5 eeec91e892 feat(sandbox): 不可信字节在沙箱子进程里解析(撤销权限、超时与内存强杀);种子、文件预览、字幕解析迁入
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 01:44:31 +08:00
rootandClaude Opus 5.5 1a76d2d700 chore(release): v0.3.22
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 01:30:32 +08:00
rootandClaude Opus 5.5 4b11c2466e test: 登记 subtitle_write 表、来源枚举与 subtitles 模块
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 01:18:34 +08:00
rootandClaude Opus 5.5 ef29bd62ce feat(subtitles): 补字幕第 1 步——上传字幕 / zip,识别语言与季集,配对写入视频同目录,历史与撤销
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 01:08:05 +08:00
rootandClaude Opus 5.5 feee481915 chore(release): v0.3.21
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 00:54:04 +08:00
rootandClaude Opus 5.5 c29dbb4376 feat(sites): 公开 BT 站详情(简介、文件清单、bgm 条目);修 AniBT 资源 ID 带 - 时判非法
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 00:43:25 +08:00
rootandClaude Opus 5.5 06ba0711e2 chore(release): v0.3.20
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 00:26:32 +08:00
rootandClaude Opus 5.5 e3dc4250cc style: 格式化
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 00:16:01 +08:00
rootandClaude Opus 5.5 dcf4840c7a test: 能力目录计数含起草巡检
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 00:15:15 +08:00
rootandClaude Opus 5.5 1e47c6af1e style: 整理导入顺序
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 00:05:53 +08:00
rootandClaude Opus 5.5 7c4ad901d9 feat(agent): 用对话起草巡检(schedule.draft_check + 起草巡检 Skill + 计划页入口与对话卡片)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 00:04:31 +08:00
rootandClaude Opus 5.5 8eb8a68295 feat(web): 站点按类型分组、列表模式修样式、下掉自定义 RSS 源与索引器入口;智能体会话分对话 / 自动巡检两栏
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 23:56:27 +08:00
rootandClaude Opus 5.5 8da8679a04 chore(release): v0.3.19
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 23:49:15 +08:00
rootandClaude Opus 5.5 d1f4dec472 test(sites): 憨憨真实详情摘录补下载 / 标题行
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 23:39:12 +08:00
rootandClaude Opus 5.5 653bdcb976 fix(sites): 憨憨详情页按真实结构解析豆瓣块与 MediaInfo
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 23:29:19 +08:00
rootandClaude Opus 5.5 df22200bfd chore(release): v0.3.18
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 23:19:24 +08:00
rootandClaude Opus 5.5 b2cdf0e106 fix(sites): 站点开代理但没填代理地址时沿用容器 HTTPS_PROXY;内置公开 BT 站默认开代理
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 23:08:04 +08:00
rootandClaude Opus 5.5 364b24bc33 fix(web): 发现页海报圆角用设计 token
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 22:36:26 +08:00
rootandClaude Opus 5.5 b42543e6f3 chore(release): v0.3.17
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 22:34:58 +08:00
rootandClaude Opus 5.5 ed083fd138 feat(subscriptions): 按 MP 收敛订阅默认值与表单
- 定时主动搜索默认关(DEFAULT_SEARCH_INTERVAL_HOURS = 0),新建 / 手动照常各搜一次,之后靠 RSS 与站点快照
- 多版本自动补全系统缺省改为关
- 表单:基础页 = 作品与范围、下载、洗版;收录版本、优先级、自动补全折叠到进阶页「多版本」
- 对照文档 §7.3 记录落实范围

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 22:34:48 +08:00
rootandClaude Opus 5.5 709414778e feat(identity): 豆瓣 / bgm.tv 辅助信息源与发现页
- adapters/meta:bgm.tv 官方 API(条目 / 搜索 / 每日放送)与豆瓣移动版接口(条目 / 实时热门)
- 识别升级链:豆瓣条目缓存没有时在线查;AniBT 的 bgm ID、公开 BT 站标题搜 bgm → 名称 + 年份匹配 TMDB(季条目去季名与年份)
- 条目缓存 30 天,查不到 6 小时负缓存;测试进程缺省不出外网
- 发现页:bgm 每日放送、豆瓣热门电影 / 剧集,点条目匹配 TMDB 作品

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 21:30:16 +08:00
rootandClaude Opus 5.5 b8876542b8 feat(sites): 内置公开 BT 站 Nyaa / 蜜柑 / AniBT / AnimeGarden / 萌番组
- 新专用解析器(spiders/public.ts):RSS / Torznab / JSON API,搜索 + 最新列表 + 按资源 ID 取种子或磁力
- 手写定义(definitions/public.ts,public: true),并入内置定义表;定义视图按 public 标为 public_bt
- 添加站点:公开 BT 站可从内置站一键添加(专用适配器、默认定时抓取、默认不进搜索集合),手填 RSS 保留
- 样例取自 2026-10-02 公开接口,截前两条

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 21:19:19 +08:00
rootandClaude Opus 5.5 9cdf492291 fix(sites): OurBits 详情页按 BBCode 解析简介
OurBits 的简介在 div.ubbcode 里是未渲染的 BBCode(站点前端脚本渲染),按 HTML 取文本后
[quote] / [img] / [url] 原样留下、换行全被合并。extractDetailPage 遇到 ubbcode 容器且内容带 BBCode 标记时,
改用 pageFromBbcode 取简介 / 截图 / MediaInfo(换行保留),发布者、文件、标签与页面上的外部 ID 照旧。
覆盖层补 fileListPath(viewfilelist.php),与憨憨一样按需取文件列表。脱敏样例 OURBITS_DETAIL_PAGE + 测试。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 20:59:41 +08:00
rootandClaude Opus 5.5 ee128e0b3f feat(downloads): 下载器单独的水位与保种天数
- contracts DownloaderPolicy(存 downloader_instance.settings.policy):硬阈值 / 恢复水位 / 清理目标 / 保种天数,
  不填用全局 cache / retention
- volumeThresholds:卷的生效水位 = 各实例「自己的值 ?? 全局」取最小;decideVolume、阈值清理、手动恢复、
  首页卷信息、定时清理检查都改用它;cleanupCandidates 保种天数按实例
- 保存时校验合并全局后 恢复 < 硬阈值、清理目标 ≤ 恢复
- 下载器设置表单新增四项(留空用全局)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 20:51:04 +08:00
rootandClaude Opus 5.5 ff79554a09 chore(release): v0.3.16
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 20:43:06 +08:00
rootandClaude Opus 5.5 135c50048f feat(downloads): 多下载器路由:默认下载器、站点指定下载器、别名
照 MP(chain/download/submission.py:明确指定 or 站点下载器 or 默认):
- 迁移 0063:downloader_instance.is_default(至多一个,唯一索引)、site.downloader_instance_id
- pickInstance:明确指定 > 站点指定 > 默认 > 第一个可用;自动下载(gates)与手动下载共用
- 设置:下载器名称改称别名,新增「设为默认下载器」;站点编辑新增「下载器」选择
- 测试 downloader-routing.test.ts

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 20:32:29 +08:00
rootandClaude Opus 5.5 64e1dfb1d2 fix(sites): 按真实列表页修正 OurBits / 彩虹岛 / 憨憨 解析
2026-10-02 用真实账号各抓一次列表页与用户页(只读)核对:
- OurBits:标题列嵌套 table.torrentname 有 5 个 td,td:nth-child(n) 先命中嵌套格子,
  大小全为 0、发布时间 N/A;改为只匹配行的直接子单元格。副标题原取成标签块,改为标签之后的正文;
  新增标签与列表页 IMDb / 豆瓣 ID(label.imdb_rate / douban_rate 的 data 属性)
- 彩虹岛:font.subtitle 去掉前面的 div.tag 与末尾徽标,标签单独取
- 憨憨:新增列表标签(span.tag,不含促销)
- 纯数字 IMDb ID 补成 tt + 7 位(imdbIdOf)
- 用户页核对:下载量为 0 是站点实际显示(VIP),解析正确;上传量四站与页面一致
- 脱敏样例 sites-2026.ts + 定义测试;差分登记 23 条有意偏离(新增 labels、OurBits 副标题)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 20:16:27 +08:00
rootandClaude Opus 5.5 cac1833f53 chore(release): v0.3.15
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 18:35:41 +08:00
rootandClaude Opus 5.5 9856ed8d5e docs(porting): 订阅 MP 场景对照(第 7 节,待讨论)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 18:22:37 +08:00
rootandClaude Opus 5.5 147c6b1947 fix(sites): 不再单独显示 VIP 标签
等级里已经体现 VIP,各站 vip 判定也不一致(同为 VIP 等级,有的站是 true、有的是 null)。
卡片、列表、登录结果、站点概况去掉 VIP 显示,数据字段保留。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 18:20:52 +08:00
rootandClaude Opus 5.5 f5bc6e9c40 fix(scrape): 整理后刮削照 MP 对作品目录刮,集只刮本次整理的文件
原地入库逐个文件排刮削,单文件刮削只写该集,剧集根目录(tvshow.nfo、海报、季海报)与季目录
(season.nfo)没有元数据。照 MP ScrapingChain.scrape_metadata_event:按作品目录分组,目录元数据照常
初始化,集只刮本次文件;复制 / 移动同样改为只刮本次文件(此前刮整个作品目录)。

- 迁移 0062:scrape_record.videos(null = 目录下全部)
- queueScrape 支持 videos;同目录排队中还没开始的刮削合成一批(有一方刮全部则刮全部)
- 作品详情「重新刮削」与文件管理刮削不变(目录下全部)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 18:20:52 +08:00
rootandClaude Opus 5.5 501b4eb403 docs: 待办收尾,补测试与代码布局约定
- 待办:任务恢复边界、注册断言、测试装配去重、大文件拆分、MP 对照 6.4 已完成并移除;
  BrowserService 类拆分与超长函数写明暂缓原因;真实环境验收列出所需条件;
  continuous-series 偶发超时改为观察项(已核实不是业务竞争)
- CLAUDE.md:test/support、contracts api/ 与整理服务的文件布局、起子进程的测试进串行组
- lessons 第 26 条:检查命令不接管道

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 17:40:43 +08:00
rootandClaude Opus 5.5 8bec4bad5d refactor: 拆分大文件(contracts 端点、整理服务、浏览器纯函数、整理弹窗来源)
- contracts/src/api.ts 2733 行 → api/*.ts 13 个领域文件 + shared.ts;api.ts 按原顺序合并 Api。
  新旧对比:354 个端点内容与顺序一致,分组键与对外导出一致
- acquisition-organize/services/organize.ts 2645 行 → organize-types / -plan / -exec / -finalize / -records,
  organize.ts 保留为汇总入口,外部引用不变
- browser/service.ts 类外的纯函数(视图映射、原因文案、坐标换算、图片尺寸、出口代理)移到 session-view.ts,
  service.ts 照旧转出
- organize-wizard:来源解析 useResolvedSource 移到 source.ts,FormSelect 移到 form-select.tsx

只挪位置不改逻辑;typecheck、lint、test:all、web build、server 编译与编译产物自检通过。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 17:40:43 +08:00
rootandClaude Opus 5.5 c9e8120fc6 test: server 测试共用建库与假引擎,sse-pg 归入串行组
- 新增 apps/server/test/support/{pg,engine}.ts:测试库地址、可用性探测、schema 咨询锁、
  建 schema + 加锁迁移 + 删除、可选去重的假引擎;6 份 harness 改用它(acquisition-organize 与
  file-manager 原先迁移不加锁,并行下有冲突隐患,一并修正)
- sse-pg 起子进程,并行下子进程启动超时,归入 serial
- 修正 b61335e 挪动 / 改名测试后遗留的 import 排序与格式(当时 lint 检查经管道被吞掉退出码)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 17:40:43 +08:00
rootandClaude Opus 5.5 7cc3742d31 chore: 发布前检查在途任务;断言核心任务都由业务模块注册
- release.sh 替换容器前列出引擎里未结束的任务(任务名@版本、状态),有则停下,
  --allow-inflight 放行(新版本只认领自己注册的任务版本)
- modules.test:生产模块装配下每个核心任务都由业务模块正式注册,不落到空壳兜底
- 刮削 / 任务入队的关联写回与引擎查询异常两处边界已在 v0.3.14 修复并有故障注入测试
  (test/acquisition-organize/enqueue-recovery.test.ts)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 17:18:07 +08:00
rootandClaude Opus 5.5 b61335eaf6 test: 测试按行为命名、server 测试统一到 test/、PG 测试分组并行
- server 的 src/modules/*/__tests__ 挪到 test/<模块>/;e2e 去掉 eN- 前缀,
  w5a2 / v2 / search2 / *-dh1 / *-md1 / *-md2、web 的 agui3 / search2、domain 的 id2 / id3 改为按行为命名
- vitest 分三组:unit、pg(真实 PG + 假引擎,文件并行,最多 6 个)、serial(真实引擎 / worker / e2e,串行);
  pg 组用例超时放宽到 60s(迁移类用例并行时排队等 schema 锁)。server 测试 615s → 约 350s
- CLAUDE.md 补测试约定;待办补 harness 去重与 continuous-series 偶发超时(疑似 Slot 评估竞争)
- ADR-004 补充:维持 Deno,记录实际只用到 --allow-run 白名单

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 16:54:04 +08:00
rootandClaude Opus 5.5 b343dddbf6 docs: 清理过程文档,CHANGELOG 补齐 0.3.8–0.3.14
- 删除 docs/plan 下 00–18 的计划、评审、验收、发布记录与升级证据,docs/spikes 与 spikes 验证代码
  (保留 spikes/movieclaw-src 本地克隆),以及 4 份一次性审查 / 调研;全部可在 ceb66f8 查到
- MP 对照移到 docs/porting/moviepilot-v3-comparison.md;经验教训改为 docs/plan/lessons.md(补第 25 条)
- docs/plan/README.md:文档放哪、当前状态、待办
- 引用改写:代码注释指向在维护的文档,其余注明已删除与 git 位置;清掉原有 6 个失效链接
- README 开头改为当前状态与入口;CHANGELOG 补齐 0.3.8–0.3.14 与工程变更

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 16:08:09 +08:00
rootandClaude Opus 5.5 11ca2f01ff chore: 一键检查、发布脚本与开发环境约定
- deno task test:all(scripts/test-all.sh):逐包跑完再汇总,连不上测试库直接失败,
  web 用 Node 跑 vitest;deno task ci 改用它
- deno task release(scripts/release.sh):工作区不干净、CHANGELOG 无本版条目即拒绝;
  打 tag、构建、只替换 app、核对健康接口版本
- deno task dev:up:起开发库并迁移到最新;开发 API 端口改 4390(4380 留给本机部署版)
- CLAUDE.md:命令、提交与发布约定、文档放哪

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 16:08:09 +08:00
rootandClaude Opus 5.5 ceb66f8c77 feat: v0.3.8–v0.3.14 工作区汇总(依赖升级、整理来源、手动入库、原地入库等)
生产 v0.3.8~v0.3.13 均由 8013196 加工作区修改构建部署,此前未提交;本提交补齐源码,
并含未部署的 v0.3.14 原地入库。中间各版本源码状态未保存,无法逐版拆分,详见
docs/plan/17-full-upgrade.md 与 docs/plan/18-organize-release.md。

- v0.3.8 全面升级:Deno workspace 依赖、Router 8 / Vite 8、camofox 1.18.0 / Node 24、
  PostgreSQL 18.6、备份客户端 18.6、演示 qB 5.2.4
- v0.3.9 媒体整理:分类规则、整理来源与目录快照(0059)、文件管理整理入口
- v0.3.10 手动下载与入库:独立手动下载、详情页资源下载、TMDB / Local 元数据兜底
  (metadata.resolve_organize)、正常多版本 / 一次性洗版(0060)
- v0.3.11 搜索详情与桌面黑边修复
- v0.3.12 列表分页、搜索历史、首页概况
- v0.3.13 统一整理弹窗与队列
- v0.3.14 原地入库(0061,未部署)

同批审计修复:
- 刮削入队:确认原记录存在后才删重放产生的新记录;写回 run 关联失败时保持 queued,
  由处理器补关联(对齐 MP 先登记、只在入队失败时记失败)
- 识别升级链只在结果更确定时采用,不再用 no_match 顶替原有歧义候选
- bluray_dir 资产以原盘目录本身为刮削根(MP 同做法)
- metadata.resolve_organize 登记到入库排障 Skill 与能力地图
- db/src/types.ts 按迁移重新生成;contracts 整理动作枚举顺序与数据库对齐
- 测试:原地入库用例改为直接查记录表;domain 测试模板补 version
- 前端:通知铃铛弹层与用户菜单统一样式;站点卡片共用卡头、底栏贴底、分页间距

依赖升级证据只提交摘要文件,registry-snapshot.json 移至 .local/(SHA-256 记于文档)。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 15:47:17 +08:00
rootandClaude Fable 5.1 8013196e3f chore(release): v0.3.7
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-01 00:28:04 +08:00
root a9511a75f6 Merge branch 'id3'
Co-Authored-By: Claude Fable 5.1 <[email protected]>

# Conflicts:
#	CHANGELOG.md
2026-10-01 00:15:49 +08:00
rootandClaude Opus 5.5 bca9ecb6cf docs(identity): ID-3 escalation chain, triggers and list IDs
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-01 00:15:20 +08:00
rootandClaude Opus 5.5 3d5a50b30a feat(identity): escalate ambiguous/no_match via site detail-page IDs (ID-3)
Fetch the detail page (cached, rate-limited, per-site hourly cap
identity.detailIdsPerSiteHour) for search results, subscription-related
candidates, pool enrich and manual re-identify; resolve IMDb/TMDB via TMDB,
douban via cached douban subjects (site detail info block / META-2 snippets).
No identity_unresolved decisions for releases with site IDs.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-01 00:15:20 +08:00
rootandClaude Opus 5.5 cba214e93e feat(sites): extract douban IDs from list rows (audiences) (ID-3)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-01 00:15:20 +08:00
rootandClaude Opus 5.5 a6d655d2ce feat(identity): trust site-provided IMDb/TMDB IDs in scoring (ID-3)
MatchOptions.trustedIds: a candidate fetched by a site-given ID is at least
multi_evidence even when titles differ; year/type conflicts stay candidates.
Differential group site-ids-* against MP search/result.py _match_source.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-01 00:15:20 +08:00
root 44f7c88be6 Merge branch 'scr2'
Co-Authored-By: Claude Fable 5.1 <[email protected]>

# Conflicts:
#	CHANGELOG.md
#	apps/server/src/modules/file-manager/routes.ts
2026-10-01 00:09:01 +08:00
rootandClaude Opus 5.5 c29e6a12d3 docs(scrape): SCR-2 就地刮削运行手册与 MP 差分表
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-01 00:08:17 +08:00
rootandClaude Opus 5.5 d8ae5e179c feat(web): 文件管理「刮削…」对任意目录可用,候选选择与刮削结果(SCR-2)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-01 00:08:17 +08:00
rootandClaude Opus 5.5 87bf33b42b feat(scrape): 任意目录就地刮削,按路径识别作品,每次刮削一条记录(SCR-2)
- POST /files/scrape 改为对目录 / 视频文件刮削:已登记用作品,否则按路径识别(本地 + TMDB),
  认不准返回候选,选定后再提交;未登记直接用 TMDB 字段,addToLibrary 顺手建作品
- 作品详情重新刮削、入库后自动刮削改为对作品目录刮削,同一实现
- 迁移 0058_scrape_record 替代 media_scrape;GET /files/scrape-records
- 与 MP ScrapingChain 的文件布局差分(7 个场景,3 处登记偏离)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-01 00:08:17 +08:00
rootandClaude Fable 5.1 e7e202fdc2 Merge branch 'his1'
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-30 23:57:39 +08:00