From 1d5585e7522aef8eb5ab8fbd950bce8c9d46d049 Mon Sep 17 00:00:00 2001 From: linyq Date: Mon, 18 Nov 2024 18:01:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(v2):=20=E6=B7=BB=E5=8A=A0=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E8=A7=86=E9=A2=91=E5=89=AA=E8=BE=91=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=9A=84=20API=20=E6=8E=A5=E5=8F=A3-=20=E6=96=B0=E5=A2=9E=20St?= =?UTF-8?q?artSubclipRequest=20=E5=92=8C=20StartSubclipResponse=20?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B-=20=E5=AE=9E=E7=8E=B0=20/scripts/start-subcl?= =?UTF-8?q?ip=20=E6=8E=A5=E5=8F=A3=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E8=A7=86=E9=A2=91=E5=89=AA=E8=BE=91=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=20-=20=E6=94=AF=E6=8C=81=E5=BC=82=E6=AD=A5=E5=A4=84=E7=90=86?= =?UTF-8?q?=EF=BC=8C=E8=BF=94=E5=9B=9E=E4=BB=BB=E5=8A=A1=20ID=20=E5=92=8C?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/v2/script.py | 49 +++++++++++++++++++++++++++++++++++- app/models/schema_v2.py | 20 +++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/app/controllers/v2/script.py b/app/controllers/v2/script.py index 94a337b..c50ee0e 100644 --- a/app/controllers/v2/script.py +++ b/app/controllers/v2/script.py @@ -8,14 +8,18 @@ from app.models.schema_v2 import ( CropVideoRequest, CropVideoResponse, DownloadVideoRequest, - DownloadVideoResponse + DownloadVideoResponse, + StartSubclipRequest, + StartSubclipResponse ) +from app.models.schema import VideoClipParams from app.services.script_service import ScriptGenerator from app.services.video_service import VideoService from app.utils import utils from app.controllers.v2.base import v2_router from app.models.schema import VideoClipParams from app.services.youtube_service import YoutubeService +from app.services import task as task_service router = v2_router() @@ -119,3 +123,46 @@ async def download_youtube_video( except Exception as e: logger.exception(f"Download YouTube video failed: {str(e)}") raise + + +@router.post( + "/scripts/start-subclip", + response_model=StartSubclipResponse, + summary="异步请求;开始视频剪辑任务 (V2)" +) +async def start_subclip( + request: VideoClipParams, + background_tasks: BackgroundTasks +): + """ + 开始视频剪辑任务的V2版本API + """ + try: + # 构建参数对象 + params = VideoClipParams( + video_origin_path=request.video_origin_path, + video_clip_json_path=request.video_clip_json_path, + voice_name=request.voice_name, + voice_rate=request.voice_rate, + voice_pitch=request.voice_pitch, + subtitle_enabled=request.subtitle_enabled, + video_aspect=request.video_aspect, + n_threads=request.n_threads + ) + + # 在后台任务中执行视频剪辑 + background_tasks.add_task( + task_service.start_subclip, + task_id=request.task_id, + params=params, + subclip_path_videos=request.subclip_videos + ) + + return { + "task_id": request.task_id, + "state": "PROCESSING" # 初始状态 + } + + except Exception as e: + logger.exception(f"Start subclip task failed: {str(e)}") + raise diff --git a/app/models/schema_v2.py b/app/models/schema_v2.py index 9894d89..1611a3b 100644 --- a/app/models/schema_v2.py +++ b/app/models/schema_v2.py @@ -40,3 +40,23 @@ class DownloadVideoResponse(BaseModel): resolution: str format: str filename: str + + +class StartSubclipRequest(BaseModel): + task_id: str + video_origin_path: str + video_clip_json_path: str + voice_name: Optional[str] = None + voice_rate: Optional[int] = 0 + voice_pitch: Optional[int] = 0 + subtitle_enabled: Optional[bool] = True + video_aspect: Optional[str] = "16:9" + n_threads: Optional[int] = 4 + subclip_videos: list # 从裁剪视频接口获取的视频片段字典 + + +class StartSubclipResponse(BaseModel): + task_id: str + state: str + videos: Optional[List[str]] = None + combined_videos: Optional[List[str]] = None