Spaces:
Running
Running
from fastapi import APIRouter, BackgroundTasks | |
from loguru import logger | |
import os | |
from app.models.schema_v2 import ( | |
GenerateScriptRequest, | |
GenerateScriptResponse, | |
CropVideoRequest, | |
CropVideoResponse, | |
DownloadVideoRequest, | |
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() | |
async def generate_script( | |
request: GenerateScriptRequest, | |
background_tasks: BackgroundTasks | |
): | |
""" | |
生成视频脚本的V2版本API | |
""" | |
task_id = utils.get_uuid() | |
try: | |
generator = ScriptGenerator() | |
script = await generator.generate_script( | |
video_path=request.video_path, | |
video_theme=request.video_theme, | |
custom_prompt=request.custom_prompt, | |
skip_seconds=request.skip_seconds, | |
threshold=request.threshold, | |
vision_batch_size=request.vision_batch_size, | |
vision_llm_provider=request.vision_llm_provider | |
) | |
return { | |
"task_id": task_id, | |
"script": script | |
} | |
except Exception as e: | |
logger.exception(f"Generate script failed: {str(e)}") | |
raise | |
async def crop_video( | |
request: CropVideoRequest, | |
background_tasks: BackgroundTasks | |
): | |
""" | |
根据脚本裁剪视频的V2版本API | |
""" | |
try: | |
# 调用视频裁剪服务 | |
video_service = VideoService() | |
task_id, subclip_videos = await video_service.crop_video( | |
video_path=request.video_origin_path, | |
video_script=request.video_script | |
) | |
logger.debug(f"裁剪视频成功,视频片段路径: {subclip_videos}") | |
logger.debug(type(subclip_videos)) | |
return { | |
"task_id": task_id, | |
"subclip_videos": subclip_videos | |
} | |
except Exception as e: | |
logger.exception(f"Crop video failed: {str(e)}") | |
raise | |
async def download_youtube_video( | |
request: DownloadVideoRequest, | |
background_tasks: BackgroundTasks | |
): | |
""" | |
下载指定分辨率的YouTube视频 | |
""" | |
try: | |
youtube_service = YoutubeService() | |
task_id, output_path, filename = await youtube_service.download_video( | |
url=request.url, | |
resolution=request.resolution, | |
output_format=request.output_format, | |
rename=request.rename | |
) | |
return { | |
"task_id": task_id, | |
"output_path": output_path, | |
"resolution": request.resolution, | |
"format": request.output_format, | |
"filename": filename | |
} | |
except Exception as e: | |
logger.exception(f"Download YouTube video failed: {str(e)}") | |
raise | |
async def start_subclip( | |
request: VideoClipParams, | |
task_id: str, | |
subclip_videos: dict, | |
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=task_id, | |
params=params, | |
subclip_path_videos=subclip_videos | |
) | |
return { | |
"task_id": task_id, | |
"state": "PROCESSING" # 初始状态 | |
} | |
except Exception as e: | |
logger.exception(f"Start subclip task failed: {str(e)}") | |
raise | |