feat(subtitles): 补字幕第 1 步——上传字幕 / zip,识别语言与季集,配对写入视频同目录,历史与撤销

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-10-03 01:08:05 +08:00
1 parent feee481915
commit ef29bd62ce
22 files changed
+1554 -2

No files matched your search

@@ -0,0 +1,32 @@
import { Api, type SubtitleApplyRequest } from "@umt/contracts";
import { route } from "../agent/http.ts";
import type { ServerModule } from "../types.ts";
import { applySubtitles, parseSubtitles, subtitleTargets, subtitleWrites, undoSubtitleWrite } from "./service.ts";
/** 补字幕(docs/plan/subtitles.md):上传 / 在线下载的字幕解析、配对、写入、历史与撤销 */
export function createSubtitlesModule(): ServerModule {
return {
name: "subtitles",
registerRoutes(app, ctx) {
const tag = { tag: "subtitles" };
route(app, Api.subtitles.targets, ({ query }) => subtitleTargets(ctx, query.entityId), tag);
route(app, Api.subtitles.parse, ({ body }) => parseSubtitles(ctx, body.files, body.entityId), tag);
route(
app,
Api.subtitles.apply,
({ body, actorId }) => applySubtitles(ctx, body as SubtitleApplyRequest, actorId),
tag,
);
route(
app,
Api.subtitles.writes,
async ({ query }) => ({ items: await subtitleWrites(ctx, query.entityId) }),
tag,
);
route(app, Api.subtitles.undo, ({ params }) => undoSubtitleWrite(ctx, params.id), tag);
},
registerTasks() {},
};
}
export const subtitlesModule = createSubtitlesModule();