Files
UHD_Media_Tool/packages/contracts/src/api/episode-mapping.ts
T
rootandClaude Opus 5.5 550ac285f4 feat(copy): 处理状态的「入库」改为「整理」,术语表与 check:copy 同步
真正入库取决于媒体服务器有没有扫到,本工具只负责整理(元数据、NFO 与图片、按规则归到目录)。
界面与面向用户的服务端文案里「已入库 / 未入库 / 部分入库 / 入库失败 / 入库中 / 入库后 / 原地入库…」
改为「已整理 / 未整理 / 部分整理 / 整理失败 / 整理中 / 整理后 / 原地整理…」;文件管理快速筛选「已整理」、
目录副行「n 个已整理 / 未整理」、季卡片「已整理 x/y」。代码标识符不改,「Emby 已有」这类媒体服务器状态保留。
glossary 加「整理」口径条目;check:copy 拦处理状态语境的「入库」搭配,其它线待替换的文件暂列 TERM_PENDING。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
2026-10-06 17:54:28 +08:00

84 lines
3.0 KiB
TypeScript

import { IdParam } from "../common.ts";
import * as em from "../episode-mapping.ts";
import { ep } from "./shared.ts";
// 集数映射(docs/plan/episode-resolution.md 批次 4):作品的映射规则增删改、模拟预览。
// 写入后立即按作品重算已绑定资源(返回受影响数量);待处理 episode_mapping 的确认 / 忽略走 /decisions/{id}/resolve 的选项。
export const episodeMappingApi = {
episodeMapping: {
listRules: ep({
method: "get",
path: "/media-entities/{id}/episode-mapping-rules",
scope: "read",
summary: "作品的集数映射规则(含停用的与停用原因)",
params: IdParam,
response: em.EpisodeMappingRuleList,
}),
createRule: ep({
method: "post",
path: "/media-entities/{id}/episode-mapping-rules",
scope: "organize.execute",
summary: "新建集数映射规则并按作品重算(同作品 + 季 + 发布组只能有一条启用的规则)",
params: IdParam,
body: em.EpisodeMappingRuleCreate,
response: em.EpisodeMappingRuleWriteResult,
}),
updateRule: ep({
method: "patch",
path: "/episode-mapping-rules/{id}",
scope: "organize.execute",
summary: "修改 / 停用 / 启用集数映射规则并按作品重算",
params: IdParam,
body: em.EpisodeMappingRuleUpdate,
response: em.EpisodeMappingRuleWriteResult,
}),
deleteRule: ep({
method: "delete",
path: "/episode-mapping-rules/{id}",
scope: "organize.execute",
summary: "删除集数映射规则并按作品重算",
params: IdParam,
response: em.EpisodeMappingRuleWriteResult,
}),
preview: ep({
method: "post",
path: "/media-entities/{id}/episode-mapping/preview",
scope: "read",
summary: "模拟预览:近期资源的原始季集 → 当前结果 → 套用草稿规则后的结果(纯读)",
params: IdParam,
body: em.EpisodeMappingPreviewInput,
response: em.EpisodeMappingPreview,
}),
},
episodeGroups: {
list: ep({
method: "get",
path: "/media-entities/{id}/episode-groups",
scope: "read",
summary: "作品可选的季集结构:TMDB 剧集组列表与当前选择",
params: IdParam,
response: em.EpisodeGroupList,
}),
seasons: ep({
method: "get",
path: "/media-entities/{id}/episode-structure",
scope: "read",
summary: "某套季集结构(TMDB 默认季或剧集组)的季卡片与每集,带本地已整理情况(纯读)",
params: IdParam,
query: em.EpisodeStructureQuery,
response: em.EpisodeStructureSeasons,
}),
set: ep({
method: "put",
path: "/media-entities/{id}/episode-group",
scope: "organize.execute",
summary:
"切换作品的季集结构:按 TMDB 原季集原地迁移集单元(引用不动),重建季表,按作品重算已绑定资源并刷新元数据",
params: IdParam,
body: em.EpisodeGroupSetInput,
response: em.EpisodeGroupSetResult,
}),
},
} as const;