diff --git a/apps/server/test/modules.test.ts b/apps/server/test/modules.test.ts index 1cdbc130..47c45dcb 100644 --- a/apps/server/test/modules.test.ts +++ b/apps/server/test/modules.test.ts @@ -53,6 +53,7 @@ describe("ServerModule 骨架", () => { "pi", "schedules", "search", + "subtitles", "browser", "desktop", "mcp", diff --git a/packages/contracts/src/subtitles.ts b/packages/contracts/src/subtitles.ts index 9fcc8125..4fe5b522 100644 --- a/packages/contracts/src/subtitles.ts +++ b/packages/contracts/src/subtitles.ts @@ -120,5 +120,23 @@ export const SubtitleApplyResult = z.object({ }); export type SubtitleApplyResult = z.infer; +/** 表 subtitle_write 的行(0064) */ +export const SubtitleWriteRow = z.object({ + id: Id, + mediaEntityId: Id, + videoLocationId: Id.nullable(), + subtitleAssetId: Id.nullable(), + libraryRootId: Id, + relativePath: z.string(), + language: z.string(), + source: SubtitleSource, + sourceName: z.string(), + sourceRef: z.string().nullable(), + backupPath: z.string().nullable(), + actor: z.string().nullable(), + createdAt: Timestamp, + undoneAt: Timestamp.nullable(), +}); + export const SubtitleWritesQuery = z.object({ entityId: Id }); export const SubtitleWritesResponse = z.object({ items: z.array(SubtitleWriteView) }); diff --git a/packages/contracts/test/db-sync.test.ts b/packages/contracts/test/db-sync.test.ts index 21452a47..357a20da 100644 --- a/packages/contracts/test/db-sync.test.ts +++ b/packages/contracts/test/db-sync.test.ts @@ -77,6 +77,7 @@ const ROWS: Record ReconcileRun: { row: C.ReconcileRun }, Secret: { row: C.Secret, dbOnly: ["ciphertext", "nonce", "authTag"] }, ScrapeRecord: { row: C.ScrapeRecordRow }, + SubtitleWrite: { row: C.SubtitleWriteRow }, ServerMapping: { row: C.ServerMapping }, Settings: { row: C.SettingEntry }, // deleted_at:软删除只在服务端过滤(已删站点不出 API);capabilities 由类型 ∩ 站点定义算出(IA-2) @@ -246,6 +247,7 @@ const ENUMS: Record = { ScheduledJobRunStatus: C.ScheduleRunStatus, ScrapeRecordStatus: C.ScrapeStatus, ScrapeRecordTrigger: C.ScrapeTrigger, + SubtitleWriteSource: C.SubtitleSource, ScrapeRecordMode: C.ScrapeMode, PiUpstreamAuthKind: C.PiAuthKind, PiUpstreamStatus: C.PiUpstreamStatus, diff --git a/packages/db/test/schema.test.ts b/packages/db/test/schema.test.ts index 03f29eb6..a888dee6 100644 --- a/packages/db/test/schema.test.ts +++ b/packages/db/test/schema.test.ts @@ -126,6 +126,8 @@ const EXPECTED_TABLES = [ "site_request_count", // SCR-2 刮削记录(0058,替代 0057 media_scrape) "scrape_record", + // 补字幕写入历史(0064) + "subtitle_write", ].sort(); /** 不走 entityTable() 的表:追加型/引擎自有表,没有 uuid id + created_at/updated_at 三件套 */ @@ -146,6 +148,8 @@ const NON_ENTITY_TABLES = [ // 进程心跳:instance_id 主键 / 只追加的采样 "process_heartbeat", "process_heartbeat_sample", + // 补字幕写入历史:只有 created_at / undone_at + "subtitle_write", // 单行配置(id = 1) "mcp_server_config", // 一次性凭据:只记创建 / 用掉的时间