Skip to main content
Glama

JianYing MCP

by hey-jian-wei
video_service.py19.7 kB
# -*- coding: utf-8 -*- """ Author: jian wei File Name: video_service.py """ from typing import Optional, Dict, Any, List from jianyingdraft.jianying.video import VideoSegment from jianyingdraft.utils.response import ToolResponse def add_video_segment_service( draft_id: str, material: str, target_timerange: str, source_timerange: Optional[str] = None, speed: Optional[float] = None, volume: float = 1.0, change_pitch: bool = False, clip_settings: Optional[Dict[str, Any]] = None, track_name: Optional[str] = None ) -> ToolResponse: """ 视频片段创建服务 - 封装复杂的视频片段创建逻辑 Args: draft_id: 草稿ID material: 视频文件路径,包括文本文件路径或者url target_timerange: 片段在轨道上的目标时间范围,格式如 "0s-4.2s" source_timerange: 从源视频文件中截取的时间范围,格式如 "1s-4.2s"(可选) speed: 播放速度,默认为1.0(可选) volume: 音量,默认为1.0(可选) change_pitch: 是否跟随变速改变音调,默认为False(可选) clip_settings: 图像调节设置字典(可选) track_name: 指定的轨道名称(可选) Returns: ToolResponse: 包含操作结果的响应对象 """ try: # 创建VideoSegment实例 video_segment = VideoSegment(draft_id, track_name=track_name) # 调用视频片段创建方法 result_data = video_segment.add_video_segment( material=material, target_timerange=target_timerange, source_timerange=source_timerange, speed=speed, volume=volume, change_pitch=change_pitch, clip_settings=clip_settings, track_name=track_name ) # 构建返回数据,包含video_segment_id response_data = { "video_segment_id": video_segment.video_segment_id, "draft_id": draft_id, "add_video_segment": result_data } # 如果有轨道名称,添加到返回数据中 if track_name: response_data["track_name"] = track_name return ToolResponse( success=True, message="视频片段创建成功", data=response_data ) except ValueError as e: # 处理参数错误(时间范围格式、轨道类型等) return ToolResponse( success=False, message=f"参数错误: {str(e)}" ) except NameError as e: # 处理轨道不存在错误 return ToolResponse( success=False, message=f"轨道错误: {str(e)}" ) except TypeError as e: # 处理轨道类型错误 return ToolResponse( success=False, message=f"轨道类型错误: {str(e)}" ) except FileNotFoundError as e: # 处理文件不存在错误 return ToolResponse( success=False, message=f"文件错误: {str(e)}" ) except Exception as e: # 处理其他未预期的错误 return ToolResponse( success=False, message=f"视频片段创建失败: {str(e)}" ) def add_video_animation_service( draft_id: str, video_segment_id: str, animation_type: str, animation_name: str, duration: Optional[str] = None, track_name: Optional[str] = None ) -> ToolResponse: """ 视频动画添加服务 - 为视频片段添加动画效果 Args: draft_id: 草稿ID video_segment_id: 视频片段ID animation_type: 动画类型,支持 "IntroType", "OutroType", "GroupAnimationType" animation_name: 动画名称,如 "上下抖动", "向上滑动" 等 duration: 动画持续时间,格式如 "1s"(可选) track_name: 轨道名称(可选) Returns: ToolResponse: 包含操作结果的响应对象 """ try: # 创建VideoSegment实例,传入video_segment_id video_segment = VideoSegment(draft_id, video_segment_id=video_segment_id, track_name=track_name) # 调用视频动画添加方法 result_data = video_segment.add_animation( animation_type=animation_type, animation_name=animation_name, duration=duration ) # 构建返回数据 response_data = { "video_segment_id": video_segment_id, "draft_id": draft_id, "animation_type": animation_type, "animation_name": animation_name, "duration": duration, "add_animation": result_data } # 如果有轨道名称,添加到返回数据中 if track_name: response_data["track_name"] = track_name return ToolResponse( success=True, message=f"视频动画添加成功: {animation_type}.{animation_name}", data=response_data ) except ValueError as e: # 处理参数错误 return ToolResponse( success=False, message=f"参数错误: {str(e)}" ) except NameError as e: # 处理轨道不存在错误 return ToolResponse( success=False, message=f"轨道错误: {str(e)}" ) except Exception as e: # 处理其他未预期的错误 return ToolResponse( success=False, message=f"视频动画添加失败: {str(e)}" ) def add_video_transition_service( draft_id: str, video_segment_id: str, transition_type: str, duration: Optional[str] = None, track_name: Optional[str] = None ) -> ToolResponse: """ 视频转场添加服务 - 为视频片段添加转场效果 Args: draft_id: 草稿ID video_segment_id: 视频片段ID transition_type: 转场类型名称,如 "信号故障", "淡入淡出" 等 duration: 转场持续时间,格式如 "1s"(可选) track_name: 轨道名称(可选) Returns: ToolResponse: 包含操作结果的响应对象 """ try: # 创建VideoSegment实例,传入video_segment_id video_segment = VideoSegment(draft_id, video_segment_id=video_segment_id, track_name=track_name) # 调用视频转场添加方法 result_data = video_segment.add_transition( transition_type=transition_type, duration=duration ) # 构建返回数据 response_data = { "video_segment_id": video_segment_id, "draft_id": draft_id, "transition_type": transition_type, "duration": duration, "add_transition": result_data } # 如果有轨道名称,添加到返回数据中 if track_name: response_data["track_name"] = track_name return ToolResponse( success=True, message=f"视频转场添加成功: {transition_type}", data=response_data ) except ValueError as e: # 处理参数错误 return ToolResponse( success=False, message=f"参数错误: {str(e)}" ) except NameError as e: # 处理轨道不存在错误 return ToolResponse( success=False, message=f"轨道错误: {str(e)}" ) except Exception as e: # 处理其他未预期的错误 return ToolResponse( success=False, message=f"视频转场添加失败: {str(e)}" ) def add_video_keyframe_service( draft_id: str, video_segment_id: str, property_name: str, time_offset: str, value: float, track_name: Optional[str] = None ) -> ToolResponse: """ 视频关键帧添加服务 - 为视频片段添加关键帧 Args: draft_id: 草稿ID video_segment_id: 视频片段ID property_name: 属性名称,如 "position_x", "rotation", "alpha" 等 time_offset: 时间偏移量,如 "0.5s", "1s" 等 value: 属性值 track_name: 轨道名称(可选) Returns: ToolResponse: 包含操作结果的响应对象 """ try: # 创建VideoSegment实例,传入video_segment_id video_segment = VideoSegment(draft_id, video_segment_id=video_segment_id, track_name=track_name) # 调用视频关键帧添加方法 result_data = video_segment.add_keyframe( property_name=property_name, time_offset=time_offset, value=value ) # 构建返回数据 response_data = { "video_segment_id": video_segment_id, "draft_id": draft_id, "property_name": property_name, "time_offset": time_offset, "value": value, "add_keyframe": result_data } # 如果有轨道名称,添加到返回数据中 if track_name: response_data["track_name"] = track_name return ToolResponse( success=True, message=f"视频关键帧添加成功: {property_name}={value} at {time_offset}", data=response_data ) except ValueError as e: # 处理参数错误 return ToolResponse( success=False, message=f"参数错误: {str(e)}" ) except NameError as e: # 处理轨道不存在错误 return ToolResponse( success=False, message=f"轨道错误: {str(e)}" ) except Exception as e: # 处理其他未预期的错误 return ToolResponse( success=False, message=f"视频关键帧添加失败: {str(e)}" ) def add_video_filter_service( draft_id: str, video_segment_id: str, filter_type: str, intensity: float = 100.0, track_name: Optional[str] = None ) -> ToolResponse: """ 视频滤镜添加服务 - 为视频片段添加滤镜效果 Args: draft_id: 草稿ID video_segment_id: 视频片段ID filter_type: 滤镜类型名称,如 "亮肤", "复古", "冰雪世界" 等 intensity: 滤镜强度 (0-100),默认100.0 track_name: 轨道名称(可选) Returns: ToolResponse: 包含操作结果的响应对象 """ try: # 创建VideoSegment实例,传入video_segment_id video_segment = VideoSegment(draft_id, video_segment_id=video_segment_id, track_name=track_name) # 调用视频滤镜添加方法 result_data = video_segment.add_filter( filter_type=filter_type, intensity=intensity ) # 构建返回数据 response_data = { "video_segment_id": video_segment_id, "draft_id": draft_id, "filter_type": filter_type, "intensity": intensity, "add_filter": result_data } # 如果有轨道名称,添加到返回数据中 if track_name: response_data["track_name"] = track_name return ToolResponse( success=True, message=f"视频滤镜添加成功: {filter_type} (强度: {intensity})", data=response_data ) except ValueError as e: # 处理参数错误 return ToolResponse( success=False, message=f"参数错误: {str(e)}" ) except NameError as e: # 处理轨道不存在错误 return ToolResponse( success=False, message=f"轨道错误: {str(e)}" ) except Exception as e: # 处理其他未预期的错误 return ToolResponse( success=False, message=f"视频滤镜添加失败: {str(e)}" ) def add_video_background_filling_service( draft_id: str, video_segment_id: str, fill_type: str, blur: float = 0.0625, color: str = "#00000000", track_name: Optional[str] = None ) -> ToolResponse: """ 视频背景填充添加服务 - 为视频片段添加背景填充效果 Args: draft_id: 草稿ID video_segment_id: 视频片段ID fill_type: 填充类型,"blur"表示模糊,"color"表示颜色 blur: 模糊程度,0.0-1.0,仅在fill_type为"blur"时有效,默认0.0625 color: 填充颜色,格式为'#RRGGBBAA',仅在fill_type为"color"时有效,默认"#00000000" track_name: 轨道名称(可选) Returns: ToolResponse: 包含操作结果的响应对象 """ try: # 创建VideoSegment实例,传入video_segment_id video_segment = VideoSegment(draft_id, video_segment_id=video_segment_id, track_name=track_name) # 调用视频背景填充添加方法 result_data = video_segment.add_background_filling( fill_type=fill_type, blur=blur, color=color ) # 构建返回数据 response_data = { "video_segment_id": video_segment_id, "draft_id": draft_id, "fill_type": fill_type, "blur": blur, "color": color, "add_background_filling": result_data } # 如果有轨道名称,添加到返回数据中 if track_name: response_data["track_name"] = track_name return ToolResponse( success=True, message=f"视频背景填充添加成功: {fill_type}", data=response_data ) except ValueError as e: # 处理参数错误 return ToolResponse( success=False, message=f"参数错误: {str(e)}" ) except NameError as e: # 处理轨道不存在错误 return ToolResponse( success=False, message=f"轨道错误: {str(e)}" ) except Exception as e: # 处理其他未预期的错误 return ToolResponse( success=False, message=f"视频背景填充添加失败: {str(e)}" ) def add_video_mask_service( draft_id: str, video_segment_id: str, mask_type: str, center_x: float = 0.0, center_y: float = 0.0, size: float = 0.5, rotation: float = 0.0, feather: float = 0.0, invert: bool = False, rect_width: Optional[float] = None, round_corner: Optional[float] = None, track_name: Optional[str] = None ) -> ToolResponse: """ 视频蒙版添加服务 - 为视频片段添加蒙版效果 Args: draft_id: 草稿ID video_segment_id: 视频片段ID mask_type: 蒙版类型名称,如 "圆形", "矩形", "线性" 等 center_x: 蒙版中心点X坐标(以素材的像素为单位),默认0.0 center_y: 蒙版中心点Y坐标(以素材的像素为单位),默认0.0 size: 蒙版的主要尺寸,以占素材高度的比例表示,默认0.5 rotation: 蒙版顺时针旋转的角度,默认0.0 feather: 蒙版的羽化参数,取值范围0~100,默认0.0 invert: 是否反转蒙版,默认False rect_width: 矩形蒙版的宽度,仅在蒙版类型为矩形时有效,默认None round_corner: 矩形蒙版的圆角参数,仅在蒙版类型为矩形时有效,默认None track_name: 轨道名称(可选) Returns: ToolResponse: 包含操作结果的响应对象 """ try: # 创建VideoSegment实例,传入video_segment_id video_segment = VideoSegment(draft_id, video_segment_id=video_segment_id, track_name=track_name) # 调用视频蒙版添加方法 result_data = video_segment.add_mask( mask_type=mask_type, center_x=center_x, center_y=center_y, size=size, rotation=rotation, feather=feather, invert=invert, rect_width=rect_width, round_corner=round_corner ) # 构建返回数据 response_data = { "video_segment_id": video_segment_id, "draft_id": draft_id, "mask_type": mask_type, "center_x": center_x, "center_y": center_y, "size": size, "rotation": rotation, "feather": feather, "invert": invert, "add_mask": result_data } # 添加可选参数到返回数据 if rect_width is not None: response_data["rect_width"] = rect_width if round_corner is not None: response_data["round_corner"] = round_corner if track_name: response_data["track_name"] = track_name return ToolResponse( success=True, message=f"视频蒙版添加成功: {mask_type}", data=response_data ) except ValueError as e: # 处理参数错误 return ToolResponse( success=False, message=f"参数错误: {str(e)}" ) except NameError as e: # 处理轨道不存在错误 return ToolResponse( success=False, message=f"轨道错误: {str(e)}" ) except Exception as e: # 处理其他未预期的错误 return ToolResponse( success=False, message=f"视频蒙版添加失败: {str(e)}" ) def add_video_effect_service( draft_id: str, video_segment_id: str, effect_type: str, params: Optional[List[Optional[float]]] = None, track_name: Optional[str] = None ) -> ToolResponse: """ 视频特效添加服务 - 为视频片段添加特效 Args: draft_id: 草稿ID video_segment_id: 视频片段ID effect_type: 特效类型名称,如 "1998", "70s", "CCD闪光" 等 params: 特效参数列表,参数范围0-100(可选) track_name: 轨道名称(可选) Returns: ToolResponse: 包含操作结果的响应对象 """ try: # 创建VideoSegment实例,传入video_segment_id video_segment = VideoSegment(draft_id, video_segment_id=video_segment_id, track_name=track_name) # 调用视频特效添加方法 result_data = video_segment.add_effect( effect_type=effect_type, params=params ) # 构建返回数据 response_data = { "video_segment_id": video_segment_id, "draft_id": draft_id, "effect_type": effect_type, "add_effect": result_data } # 添加可选参数到返回数据 if params: response_data["params"] = params if track_name: response_data["track_name"] = track_name return ToolResponse( success=True, message=f"视频特效添加成功: {effect_type}", data=response_data ) except ValueError as e: # 处理参数错误 return ToolResponse( success=False, message=f"参数错误: {str(e)}" ) except NameError as e: # 处理轨道不存在错误 return ToolResponse( success=False, message=f"轨道错误: {str(e)}" ) except Exception as e: # 处理其他未预期的错误 return ToolResponse( success=False, message=f"视频特效添加失败: {str(e)}" )

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hey-jian-wei/jianying-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server