NarratoAI/app/services/video_service.py
linyq bd1ce5c7b9 feat(v2): 新增视频裁剪和YouTube视频下载功能
- 在 schema_v2.py 中添加了新的请求和响应模型
- 在 script.py 中实现了 /scripts/crop 和 /youtube/download 接口- 新增 video_service.py 和 youtube_service.py 服务模块
- 更新 utils.py 中的工具函数以支持新功能
2024-11-27 23:26:43 +08:00

58 lines
1.8 KiB
Python

import os
from uuid import uuid4
from loguru import logger
from typing import Dict, List, Optional, Tuple
from app.services import material
from app.models.schema import VideoClipParams
from app.utils import utils
class VideoService:
@staticmethod
async def crop_video(
video_path: str,
video_script: List[dict]
) -> Tuple[str, Dict[str, str]]:
"""
裁剪视频服务
Args:
video_path: 视频文件路径
video_script: 视频脚本列表
Returns:
Tuple[str, Dict[str, str]]: (task_id, 裁剪后的视频片段字典)
视频片段字典格式: {timestamp: video_path}
"""
try:
task_id = str(uuid4())
# 从脚本中提取时间戳列表
time_list = [scene['timestamp'] for scene in video_script]
# 调用裁剪服务
subclip_videos = material.clip_videos(
task_id=task_id,
timestamp_terms=time_list,
origin_video=video_path
)
if subclip_videos is None:
raise ValueError("裁剪视频失败")
# 更新脚本中的视频路径
for scene in video_script:
try:
scene['path'] = subclip_videos[scene['timestamp']]
except KeyError as err:
logger.error(f"更新视频路径失败: {err}")
logger.debug(f"裁剪视频成功,共生成 {len(time_list)} 个视频片段")
logger.debug(f"视频片段路径: {subclip_videos}")
return task_id, subclip_videos
except Exception as e:
logger.exception("裁剪视频失败")
raise