mirror of
https://github.com/linyqh/NarratoAI.git
synced 2025-12-12 19:52:48 +00:00
- 在 schema_v2.py 中添加了新的请求和响应模型 - 在 script.py 中实现了 /scripts/crop 和 /youtube/download 接口- 新增 video_service.py 和 youtube_service.py 服务模块 - 更新 utils.py 中的工具函数以支持新功能
122 lines
3.3 KiB
Python
122 lines
3.3 KiB
Python
from fastapi import APIRouter, BackgroundTasks
|
||
from loguru import logger
|
||
import os
|
||
|
||
from app.models.schema_v2 import (
|
||
GenerateScriptRequest,
|
||
GenerateScriptResponse,
|
||
CropVideoRequest,
|
||
CropVideoResponse,
|
||
DownloadVideoRequest,
|
||
DownloadVideoResponse
|
||
)
|
||
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
|
||
|
||
router = v2_router()
|
||
|
||
|
||
@router.post(
|
||
"/scripts/generate",
|
||
response_model=GenerateScriptResponse,
|
||
summary="同步请求;生成视频脚本 (V2)"
|
||
)
|
||
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
|
||
|
||
|
||
@router.post(
|
||
"/scripts/crop",
|
||
response_model=CropVideoResponse,
|
||
summary="同步请求;裁剪视频 (V2)"
|
||
)
|
||
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
|
||
|
||
|
||
@router.post(
|
||
"/youtube/download",
|
||
response_model=DownloadVideoResponse,
|
||
summary="同步请求;下载YouTube视频 (V2)"
|
||
)
|
||
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
|