refactor(cover): 封面生成API从templates_editor解耦到generation路由 (#1359)
CI/CD Pipeline / Validate - Migration (alembic) (push) Successful in 1m52s
CI/CD Pipeline / Validate - Type Check (mypy) (push) Successful in 1m57s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 3m43s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 3m45s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 5m26s
CI/CD Pipeline / Validate - Code Quality (push) Successful in 6m44s
CI/CD Pipeline / Integration Tests (push) Successful in 2m12s
CI/CD Pipeline / Unit Tests (push) Successful in 9m0s
CI/CD Pipeline / Build Staging API Image (push) Successful in 12m38s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 32s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 39s
CI/CD Pipeline / Staging E2E Tests (push) Failing after 1m14s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 2m50s
CI/CD Pipeline / Canary Release to Production (push) Failing after 812h14m47s
CI/CD Pipeline / CI Gate (push) Failing after 812h21m45s
CI/CD Pipeline / Production Browser E2E (push) Failing after 812h21m45s
CI/CD Pipeline / Build Production Worker Image (push) Failing after 812h21m45s
CI/CD Pipeline / Build Production API Image (push) Failing after 812h21m46s
CI/CD Pipeline / PR Build Worker Image (push) Failing after 812h30m45s
CI/CD Pipeline / PR Build API Image (push) Failing after 812h30m47s
CI/CD Pipeline / Frontend Lint (push) Failing after 812h30m47s
CI/CD Pipeline / Check if frontend-only change (push) Failing after 812h30m49s
CI/CD Pipeline / Deploy Production (push) Failing after 812h55m15s
CI/CD Pipeline / Build Production Web Image (push) Failing after 812h55m16s
CI/CD Pipeline / PR Build Web Image (push) Failing after 813h4m15s

Co-authored-by: xiaoxia <dev@xiaoxiajianji.com>
Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
This commit was merged in pull request #1359.
This commit is contained in:
2026-08-13 18:56:00 +08:00
committed by auto-approve-bot
parent 0a00870ab6
commit 17174e2cf5
12 changed files with 182 additions and 100 deletions
+35
View File
@@ -0,0 +1,35 @@
import apiClient from "../client"
export interface GenerateCoverRequest {
asset_ids: string[]
cover_type?: "ai_frame" | "manual" | "upload" | "ai_regenerate"
frame_time?: number
}
export interface GenerateCoverResponse {
plan_id: string
cover: {
scheme?: string
asset_id?: string
frame_time?: number
image_url?: string
thumbnail_url?: string
[key: string]: unknown
}
}
/** AI 生成封面 — 从预览视频中抽帧 */
export async function generateCover(
templateId: string,
data: GenerateCoverRequest,
): Promise<GenerateCoverResponse> {
const response = await apiClient.post<GenerateCoverResponse>(
"/generation/generate-cover",
{ ...data, template_id: templateId },
{
timeout: 300000,
params: { template_id: templateId },
},
)
return response.data
}
+3
View File
@@ -10,3 +10,6 @@ export type {
export { createPreview, getPreviewStatus } from "./preview"
export { confirmGeneration } from "./confirm"
export { generateCover } from "./cover"
export type { GenerateCoverRequest, GenerateCoverResponse } from "./cover"
+2 -18
View File
@@ -1,13 +1,8 @@
/**
* AI 推荐 + 封面生成 API
* AI 推荐 API
*/
import apiClient from "../client"
import type {
AIRecommendRequest,
AIRecommendResponse,
GenerateCoverRequest,
GenerateCoverResponse,
} from "./types"
import type { AIRecommendRequest, AIRecommendResponse } from "./types"
/** AI 推荐片段方案 */
export async function aiRecommendClips(
@@ -17,14 +12,3 @@ export async function aiRecommendClips(
const response = await apiClient.post(`/templates/${templateId}/editor/ai-recommend`, data)
return response.data
}
/** AI 生成封面 */
export async function generateCover(
templateId: string,
data: GenerateCoverRequest,
): Promise<GenerateCoverResponse> {
const response = await apiClient.post(`/templates/${templateId}/editor/generate-cover`, data, {
timeout: 300000, // 封面生成涉及 MediaKit 抽帧,最长 300 秒
})
return response.data
}
+2 -5
View File
@@ -27,9 +27,6 @@ export type {
AIRecommendRequest,
AIRecommendClipItem,
AIRecommendResponse,
GenerateCoverRequest,
GenerateCoverResponse,
CoverResult,
EditPlanClipStatus,
EditPlanClip,
CreateEditPlanClipRequest,
@@ -81,8 +78,8 @@ export {
createClipsFromAssets,
} from "./clips"
// AI 推荐 + 封面生成
export { aiRecommendClips, generateCover } from "./aiFeatures"
// AI 推荐
export { aiRecommendClips } from "./aiFeatures"
// 素材库
export { getMediaAssets, getMediaAsset } from "./mediaAssets"
+1 -23
View File
@@ -244,7 +244,7 @@ export interface GeneratedVideo {
updated_at?: string
}
/* ── AI 推荐 & 封面生成 ── */
/* ── AI 推荐 ── */
/** AI 推荐请求 */
export interface AIRecommendRequest {
@@ -274,28 +274,6 @@ export interface AIRecommendResponse {
confidence: number
}
/** AI 封面生成请求 */
export interface GenerateCoverRequest {
asset_ids: string[]
cover_type?: "ai_frame" | "manual" | "upload" | "ai_regenerate"
frame_time?: number
}
/** AI 封面生成响应 */
export interface GenerateCoverResponse {
plan_id: string
cover: CoverResult
}
/** 封面生成结果 */
export interface CoverResult {
scheme?: string
asset_id?: string
frame_time?: number
image_url?: string
thumbnail_url?: string
}
/* ── 片段 CRUD 相关 ── */
/** 片段状态 */
@@ -5,7 +5,7 @@
import { useCallback, useEffect, useState } from "react"
import { message } from "antd"
import type { CoverConfig, CoverTemplate } from "../types/cover"
import { generateCover } from "@/api/template-editor"
import { generateCover } from "@/api/generation"
import {
fetchCoverTemplates,
createCoverTemplate,
-17
View File
@@ -8,7 +8,6 @@ import {
generateEditPlan,
getGenerationStatus,
aiRecommendClips,
generateCover,
getEditPlanGenerations,
getGenerationTaskResults,
cancelGeneration,
@@ -182,22 +181,6 @@ describe("editPlans API", () => {
})
})
describe("generateCover", () => {
it("should resolve successfully", async () => {
await expect(generateCover("test-planId")).resolves.not.toThrow()
})
it("should reject on API error", async () => {
mockGet.mockRejectedValue(new Error("Network error"))
mockPost.mockRejectedValue(new Error("Network error"))
mockPut.mockRejectedValue(new Error("Network error"))
mockDelete.mockRejectedValue(new Error("Network error"))
mockPatch.mockRejectedValue(new Error("Network error"))
await expect(generateCover("test-planId")).rejects.toThrow()
})
})
describe("getEditPlanGenerations", () => {
it("should resolve successfully", async () => {
await expect(getEditPlanGenerations("test-planId")).resolves.not.toThrow()