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;